From 9feccfdb2e43462fdfc4751f49da24349b74c20b Mon Sep 17 00:00:00 2001 From: Martin Boehm Date: Sun, 16 Feb 2020 23:07:50 +0100 Subject: [PATCH] Automatically check for UTXO inconsitencies --- blockbook.go | 28 +++++++++++++++++++--------- common/internalstate.go | 2 ++ db/rocksdb.go | 2 +- 3 files changed, 22 insertions(+), 10 deletions(-) diff --git a/blockbook.go b/blockbook.go index 1a891ed4..9f2e6e52 100644 --- a/blockbook.go +++ b/blockbook.go @@ -179,21 +179,31 @@ func mainWithExitCode() int { } defer index.Close() - if *fixUtxo { - err = index.FixUtxos(chanOsSignal) - if err != nil { - glog.Error("fixUtxos: ", err) - return exitCodeFatal - } - return exitCodeOK - } - internalState, err = newInternalState(coin, coinShortcut, coinLabel, index) if err != nil { glog.Error("internalState: ", err) return exitCodeFatal } + + // fix possible inconsistencies in the UTXO index + if *fixUtxo || !internalState.UtxoChecked { + err = index.FixUtxos(chanOsSignal) + if err != nil { + glog.Error("fixUtxos: ", err) + return exitCodeFatal + } + internalState.UtxoChecked = true + } index.SetInternalState(internalState) + if *fixUtxo { + err = index.StoreInternalState(internalState) + if err != nil { + glog.Error("StoreInternalState: ", err) + return exitCodeFatal + } + return exitCodeOK + } + if internalState.DbState != common.DbStateClosed { if internalState.DbState == common.DbStateInconsistent { glog.Error("internalState: database is in inconsistent state and cannot be used") diff --git a/common/internalstate.go b/common/internalstate.go index 079b3b8c..bfe84fc9 100644 --- a/common/internalstate.go +++ b/common/internalstate.go @@ -53,6 +53,8 @@ type InternalState struct { LastMempoolSync time.Time `json:"lastMempoolSync"` DbColumns []InternalStateColumn `json:"dbColumns"` + + UtxoChecked bool `json:"utxoChecked"` } // StartedSync signals start of synchronization diff --git a/db/rocksdb.go b/db/rocksdb.go index e9b4ec7b..90ba0e65 100644 --- a/db/rocksdb.go +++ b/db/rocksdb.go @@ -1707,7 +1707,7 @@ func (d *RocksDB) LoadInternalState(rpcCoin string) (*common.InternalState, erro data := val.Data() var is *common.InternalState if len(data) == 0 { - is = &common.InternalState{Coin: rpcCoin} + is = &common.InternalState{Coin: rpcCoin, UtxoChecked: true} } else { is, err = common.UnpackInternalState(data) if err != nil {