diff --git a/host/contracts/manager.go b/host/contracts/manager.go index d8d8181..b82d1a0 100644 --- a/host/contracts/manager.go +++ b/host/contracts/manager.go @@ -6,6 +6,7 @@ import ( "errors" "fmt" "math" + "strings" "sync" "sync/atomic" "time" @@ -541,13 +542,13 @@ func NewManager(store ContractStore, alerts Alerts, storage StorageManager, c Ch // blocking startup go func() { err := cm.chain.Subscribe(cm, changeID, cm.tg.Done()) - if err != nil { - cm.log.Error("failed to subscribe to consensus set", zap.Error(err)) - if errors.Is(err, chain.ErrInvalidChangeID) { - if err := cm.chain.Subscribe(cm, modules.ConsensusChangeBeginning, cm.tg.Done()); err != nil { - cm.log.Fatal("failed to reset consensus change subscription", zap.Error(err)) - } + if errors.Is(err, chain.ErrInvalidChangeID) { + cm.log.Warn("rescanning blockchain due to unknown consensus change ID") + if err := cm.chain.Subscribe(cm, modules.ConsensusChangeBeginning, cm.tg.Done()); err != nil { + cm.log.Fatal("failed to reset consensus change subscription", zap.Error(err)) } + } else if err != nil && !strings.Contains(err.Error(), "ThreadGroup already stopped") { + cm.log.Fatal("failed to subscribe to consensus changes", zap.Error(err)) } }() diff --git a/host/settings/settings.go b/host/settings/settings.go index b13b74c..262de8f 100644 --- a/host/settings/settings.go +++ b/host/settings/settings.go @@ -314,6 +314,7 @@ func NewConfigManager(dir string, hostKey types.PrivateKey, rhp2Addr string, sto // subscribe to consensus changes err := cm.Subscribe(m, lastChange, m.tg.Done()) if errors.Is(err, chain.ErrInvalidChangeID) { + m.log.Warn("rescanning blockchain due to unknown consensus change ID") // reset change ID and subscribe again if err := store.RevertLastAnnouncement(); err != nil { m.log.Fatal("failed to reset wallet", zap.Error(err)) diff --git a/wallet/wallet.go b/wallet/wallet.go index a56acc2..8edeb40 100644 --- a/wallet/wallet.go +++ b/wallet/wallet.go @@ -5,6 +5,7 @@ import ( "errors" "fmt" "sort" + "strings" "sync" "sync/atomic" "time" @@ -824,16 +825,17 @@ func NewSingleAddressWallet(priv types.PrivateKey, cm ChainManager, tp Transacti go func() { // note: start in goroutine to avoid blocking startup - if err := cm.Subscribe(sw, changeID, sw.tg.Done()); err != nil { - sw.log.Error("failed to subscribe to consensus changes", zap.Error(err)) - if errors.Is(err, chain.ErrInvalidChangeID) { - // reset change ID and subscribe again - if err := store.ResetWallet(seedHash); err != nil { - sw.log.Fatal("failed to reset wallet", zap.Error(err)) - } else if err = cm.Subscribe(sw, modules.ConsensusChangeBeginning, sw.tg.Done()); err != nil { - sw.log.Fatal("failed to reset consensus change subscription", zap.Error(err)) - } + err := cm.Subscribe(sw, changeID, sw.tg.Done()) + if errors.Is(err, chain.ErrInvalidChangeID) { + sw.log.Warn("rescanning blockchain due to unknown consensus change ID") + // reset change ID and subscribe again + if err := store.ResetWallet(seedHash); err != nil { + sw.log.Fatal("failed to reset wallet", zap.Error(err)) + } else if err = cm.Subscribe(sw, modules.ConsensusChangeBeginning, sw.tg.Done()); err != nil { + sw.log.Fatal("failed to reset consensus change subscription", zap.Error(err)) } + } else if err != nil && !strings.Contains(err.Error(), "ThreadGroup already stopped") { + sw.log.Fatal("failed to subscribe to consensus set", zap.Error(err)) } }() tp.Subscribe(sw)