diff --git a/eth/stagedsync/default_stages.go b/eth/stagedsync/default_stages.go index a3d73f84ea9387b64c2b63f8afeb87a7c4ac0ae7..4088b7f95a1241c3d11d2fab5792b2210f831285 100644 --- a/eth/stagedsync/default_stages.go +++ b/eth/stagedsync/default_stages.go @@ -269,7 +269,7 @@ func DefaultStages(ctx context.Context, ID: stages.Finish, Description: "Final: update current block for the RPC API", Forward: func(firstCycle bool, badBlockUnwind bool, s *StageState, _ Unwinder, tx kv.RwTx) error { - return FinishForward(s, tx, finish) + return FinishForward(s, tx, finish, firstCycle) }, Unwind: func(firstCycle bool, u *UnwindState, s *StageState, tx kv.RwTx) error { return UnwindFinish(u, tx, finish, ctx) diff --git a/eth/stagedsync/stage_finish.go b/eth/stagedsync/stage_finish.go index c7c37ab0aa691df243114a2c0ee3227bdf439a31..08b62b6d8ebfc94b7b9b6fcd3bc37c6683bee355 100644 --- a/eth/stagedsync/stage_finish.go +++ b/eth/stagedsync/stage_finish.go @@ -3,6 +3,7 @@ package stagedsync import ( "context" "fmt" + "github.com/ledgerwatch/erigon/params" "github.com/ledgerwatch/erigon-lib/kv" "github.com/ledgerwatch/erigon/core/rawdb" @@ -29,7 +30,7 @@ func StageFinishCfg(db kv.RwDB, tmpDir string, btClient *snapshotsync.Client, sn } } -func FinishForward(s *StageState, tx kv.RwTx, cfg FinishCfg) error { +func FinishForward(s *StageState, tx kv.RwTx, cfg FinishCfg, initialCycle bool) error { useExternalTx := tx != nil if !useExternalTx { var err error @@ -67,11 +68,19 @@ func FinishForward(s *StageState, tx kv.RwTx, cfg FinishCfg) error { if err != nil { return err } + + if initialCycle { + if err := params.SetErigonVersion(tx, params.VersionKeyFinished); err != nil { + return err + } + } + if !useExternalTx { if err := tx.Commit(); err != nil { return err } } + return nil } diff --git a/node/node.go b/node/node.go index d0cf4ac1dfa6c5328096d08a5630a0f9e16803a6..df2071b387954dcb70d591bb4b38d8016c2e8559 100644 --- a/node/node.go +++ b/node/node.go @@ -17,8 +17,10 @@ package node import ( + "context" "errors" "fmt" + "github.com/ledgerwatch/erigon/params" "net" "net/http" "os" @@ -551,6 +553,12 @@ func OpenDatabase(config *Config, logger log.Logger, label kv.Label) (kv.RwDB, e } } + if err := db.Update(context.Background(), func(tx kv.RwTx) (err error) { + return params.SetErigonVersion(tx, params.VersionKeyCreated) + }); err != nil { + return nil, err + } + return db, nil } diff --git a/params/version.go b/params/version.go index 039b9c837628bcbb1913ce80077ce02cbb20639e..ce1d62868063018995a59a58d0a827c26663c9bf 100644 --- a/params/version.go +++ b/params/version.go @@ -18,6 +18,7 @@ package params import ( "fmt" + "github.com/ledgerwatch/erigon-lib/kv" ) var ( @@ -29,10 +30,12 @@ var ( // see https://calver.org const ( - VersionMajor = 2021 // Major version component of the current release - VersionMinor = 9 // Minor version component of the current release - VersionMicro = 3 // Patch version component of the current release - VersionModifier = "alpha" // Patch version component of the current release + VersionMajor = 2021 // Major version component of the current release + VersionMinor = 9 // Minor version component of the current release + VersionMicro = 3 // Patch version component of the current release + VersionModifier = "alpha" // Patch version component of the current release + VersionKeyCreated = "ErigonVersionCreated" + VersionKeyFinished = "ErigonVersionFinished" ) func withModifier(vsn string) string { @@ -85,3 +88,19 @@ func VersionWithCommit(gitCommit, gitDate string) string { } return vsn } + +func SetErigonVersion(tx kv.RwTx, versionKey string) error { + versionKeyByte := []byte(versionKey) + hasVersion, err := tx.Has(kv.DatabaseInfo, versionKeyByte) + if err != nil { + return err + } + if hasVersion { + return nil + } + // Save version if it does not exist + if err := tx.Put(kv.DatabaseInfo, versionKeyByte, []byte(Version)); err != nil { + return err + } + return nil +}