diff options
author | gary rong <garyrong0905@gmail.com> | 2019-01-11 19:49:12 +0800 |
---|---|---|
committer | Péter Szilágyi <peterke@gmail.com> | 2019-01-11 19:49:12 +0800 |
commit | d5cad488be0069d768b358b2267cd5432b0f9a43 (patch) | |
tree | 07272f630b6486c7458c789b58bd75ff20c5480a | |
parent | 2eb838ed9776c9c3ec922e1116a5d50babda31c5 (diff) | |
download | dexon-d5cad488be0069d768b358b2267cd5432b0f9a43.tar.gz dexon-d5cad488be0069d768b358b2267cd5432b0f9a43.tar.zst dexon-d5cad488be0069d768b358b2267cd5432b0f9a43.zip |
core, eth: fix database version (#18429)
* core, eth: fix database version
* eth: polish error message
-rw-r--r-- | core/blockchain.go | 2 | ||||
-rw-r--r-- | core/rawdb/accessors_metadata.go | 22 | ||||
-rw-r--r-- | eth/backend.go | 6 |
3 files changed, 20 insertions, 10 deletions
diff --git a/core/blockchain.go b/core/blockchain.go index c29063a73..49aedf669 100644 --- a/core/blockchain.go +++ b/core/blockchain.go @@ -65,7 +65,7 @@ const ( triesInMemory = 128 // BlockChainVersion ensures that an incompatible database forces a resync from scratch. - BlockChainVersion = 3 + BlockChainVersion uint64 = 3 ) // CacheConfig contains the configuration values for the trie caching/pruning diff --git a/core/rawdb/accessors_metadata.go b/core/rawdb/accessors_metadata.go index 3b6e6548d..82e4bf045 100644 --- a/core/rawdb/accessors_metadata.go +++ b/core/rawdb/accessors_metadata.go @@ -26,19 +26,27 @@ import ( ) // ReadDatabaseVersion retrieves the version number of the database. -func ReadDatabaseVersion(db DatabaseReader) int { - var version int +func ReadDatabaseVersion(db DatabaseReader) *uint64 { + var version uint64 enc, _ := db.Get(databaseVerisionKey) - rlp.DecodeBytes(enc, &version) + if len(enc) == 0 { + return nil + } + if err := rlp.DecodeBytes(enc, &version); err != nil { + return nil + } - return version + return &version } // WriteDatabaseVersion stores the version number of the database -func WriteDatabaseVersion(db DatabaseWriter, version int) { - enc, _ := rlp.EncodeToBytes(version) - if err := db.Put(databaseVerisionKey, enc); err != nil { +func WriteDatabaseVersion(db DatabaseWriter, version uint64) { + enc, err := rlp.EncodeToBytes(version) + if err != nil { + log.Crit("Failed to encode database version", "err", err) + } + if err = db.Put(databaseVerisionKey, enc); err != nil { log.Crit("Failed to store the database version", "err", err) } } diff --git a/eth/backend.go b/eth/backend.go index 354fc17d4..2a9d56c5c 100644 --- a/eth/backend.go +++ b/eth/backend.go @@ -143,8 +143,10 @@ func New(ctx *node.ServiceContext, config *Config) (*Ethereum, error) { if !config.SkipBcVersionCheck { bcVersion := rawdb.ReadDatabaseVersion(chainDb) - if bcVersion != core.BlockChainVersion && bcVersion != 0 { - return nil, fmt.Errorf("Blockchain DB version mismatch (%d / %d).\n", bcVersion, core.BlockChainVersion) + if bcVersion != nil && *bcVersion > core.BlockChainVersion { + return nil, fmt.Errorf("database version is v%d, Geth %s only supports v%d", *bcVersion, params.VersionWithMeta, core.BlockChainVersion) + } else if bcVersion != nil && *bcVersion < core.BlockChainVersion { + log.Warn("Upgrade blockchain database version", "from", *bcVersion, "to", core.BlockChainVersion) } rawdb.WriteDatabaseVersion(chainDb, core.BlockChainVersion) } |