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 {