diff --git a/contractcourt/channel_arbitrator.go b/contractcourt/channel_arbitrator.go index b9070768..93f36925 100644 --- a/contractcourt/channel_arbitrator.go +++ b/contractcourt/channel_arbitrator.go @@ -1866,6 +1866,10 @@ func (c *ChannelArbitrator) resolveContract(currentContract ContractResolver) { // contract. nextContract, err := currentContract.Resolve() if err != nil { + if err == errResolverShuttingDown { + return + } + log.Errorf("ChannelArbitrator(%v): unable to "+ "progress resolver: %v", c.cfg.ChanPoint, err) diff --git a/contractcourt/commit_sweep_resolver.go b/contractcourt/commit_sweep_resolver.go index c1e29dc4..1ef7e966 100644 --- a/contractcourt/commit_sweep_resolver.go +++ b/contractcourt/commit_sweep_resolver.go @@ -2,7 +2,6 @@ package contractcourt import ( "encoding/binary" - "fmt" "io" "github.com/btcsuite/btcd/wire" @@ -78,11 +77,11 @@ func (c *commitSweepResolver) Resolve() (ContractResolver, error) { select { case _, ok := <-confNtfn.Confirmed: if !ok { - return nil, fmt.Errorf("quitting") + return nil, errResolverShuttingDown } case <-c.Quit: - return nil, fmt.Errorf("quitting") + return nil, errResolverShuttingDown } // We're dealing with our commitment transaction if the delay on the @@ -129,7 +128,7 @@ func (c *commitSweepResolver) Resolve() (ContractResolver, error) { log.Infof("ChannelPoint(%v) commit tx is fully resolved by "+ "sweep tx: %v", c.chanPoint, sweepResult.Tx.TxHash()) case <-c.Quit: - return nil, fmt.Errorf("quitting") + return nil, errResolverShuttingDown } c.resolved = true @@ -155,7 +154,7 @@ func (c *commitSweepResolver) Resolve() (ContractResolver, error) { select { case commitSpend, ok := <-spendNtfn.Spend: if !ok { - return nil, fmt.Errorf("quitting") + return nil, errResolverShuttingDown } // Once we detect the commitment output has been spent, @@ -171,7 +170,7 @@ func (c *commitSweepResolver) Resolve() (ContractResolver, error) { return nil, err } case <-c.Quit: - return nil, fmt.Errorf("quitting") + return nil, errResolverShuttingDown } log.Infof("%T(%v): waiting for commit sweep txid=%v conf", c, c.chanPoint, @@ -190,14 +189,14 @@ func (c *commitSweepResolver) Resolve() (ContractResolver, error) { select { case confInfo, ok := <-confNtfn.Confirmed: if !ok { - return nil, fmt.Errorf("quitting") + return nil, errResolverShuttingDown } log.Infof("ChannelPoint(%v) commit tx is fully resolved, at height: %v", c.chanPoint, confInfo.BlockHeight) case <-c.Quit: - return nil, fmt.Errorf("quitting") + return nil, errResolverShuttingDown } // Once the transaction has received a sufficient number of diff --git a/contractcourt/contract_resolvers.go b/contractcourt/contract_resolvers.go index 1a19e166..b39a04d4 100644 --- a/contractcourt/contract_resolvers.go +++ b/contractcourt/contract_resolvers.go @@ -2,6 +2,7 @@ package contractcourt import ( "encoding/binary" + "errors" "io" ) @@ -83,3 +84,9 @@ type ResolverKit struct { Quit chan struct{} } + +var ( + // errResolverShuttingDown is returned when the resolver stops + // progressing because it received the quit signal. + errResolverShuttingDown = errors.New("resolver shutting down") +) diff --git a/contractcourt/htlc_incoming_contest_resolver.go b/contractcourt/htlc_incoming_contest_resolver.go index bda68098..2f3348e6 100644 --- a/contractcourt/htlc_incoming_contest_resolver.go +++ b/contractcourt/htlc_incoming_contest_resolver.go @@ -3,7 +3,6 @@ package contractcourt import ( "encoding/binary" "errors" - "fmt" "io" "github.com/lightningnetwork/lnd/channeldb" @@ -66,11 +65,11 @@ func (h *htlcIncomingContestResolver) Resolve() (ContractResolver, error) { select { case newBlock, ok := <-blockEpochs.Epochs: if !ok { - return nil, fmt.Errorf("quitting") + return nil, errResolverShuttingDown } currentHeight = newBlock.Height case <-h.Quit: - return nil, fmt.Errorf("resolver stopped") + return nil, errResolverShuttingDown } // We'll first check if this HTLC has been timed out, if so, we can @@ -224,7 +223,7 @@ func (h *htlcIncomingContestResolver) Resolve() (ContractResolver, error) { case newBlock, ok := <-blockEpochs.Epochs: if !ok { - return nil, fmt.Errorf("quitting") + return nil, errResolverShuttingDown } // If this new height expires the HTLC, then this means @@ -241,7 +240,7 @@ func (h *htlcIncomingContestResolver) Resolve() (ContractResolver, error) { } case <-h.Quit: - return nil, fmt.Errorf("resolver stopped") + return nil, errResolverShuttingDown } } } diff --git a/contractcourt/htlc_outgoing_contest_resolver.go b/contractcourt/htlc_outgoing_contest_resolver.go index 222fd1f3..4f371090 100644 --- a/contractcourt/htlc_outgoing_contest_resolver.go +++ b/contractcourt/htlc_outgoing_contest_resolver.go @@ -65,7 +65,7 @@ func (h *htlcOutgoingContestResolver) Resolve() (ContractResolver, error) { // sweep the pre-image from the output. case commitSpend, ok := <-spendNtfn.Spend: if !ok { - return nil, fmt.Errorf("quitting") + return nil, errResolverShuttingDown } // TODO(roasbeef): Checkpoint? @@ -122,7 +122,7 @@ func (h *htlcOutgoingContestResolver) Resolve() (ContractResolver, error) { // HTLC expiration. case newBlock, ok := <-blockEpochs.Epochs: if !ok { - return nil, fmt.Errorf("quitting") + return nil, errResolverShuttingDown } // If this new height expires the HTLC, then we can @@ -142,7 +142,7 @@ func (h *htlcOutgoingContestResolver) Resolve() (ContractResolver, error) { // revealed on-chain. case commitSpend, ok := <-spendNtfn.Spend: if !ok { - return nil, fmt.Errorf("quitting") + return nil, errResolverShuttingDown } // The only way this output can be spent by the remote diff --git a/contractcourt/htlc_success_resolver.go b/contractcourt/htlc_success_resolver.go index f4005525..d1c8716c 100644 --- a/contractcourt/htlc_success_resolver.go +++ b/contractcourt/htlc_success_resolver.go @@ -2,7 +2,6 @@ package contractcourt import ( "encoding/binary" - "fmt" "io" "github.com/btcsuite/btcd/wire" @@ -171,11 +170,11 @@ func (h *htlcSuccessResolver) Resolve() (ContractResolver, error) { select { case _, ok := <-confNtfn.Confirmed: if !ok { - return nil, fmt.Errorf("quitting") + return nil, errResolverShuttingDown } case <-h.Quit: - return nil, fmt.Errorf("quitting") + return nil, errResolverShuttingDown } // Once the transaction has received a sufficient number of @@ -236,11 +235,11 @@ func (h *htlcSuccessResolver) Resolve() (ContractResolver, error) { select { case _, ok := <-spendNtfn.Spend: if !ok { - return nil, fmt.Errorf("quitting") + return nil, errResolverShuttingDown } case <-h.Quit: - return nil, fmt.Errorf("quitting") + return nil, errResolverShuttingDown } h.resolved = true diff --git a/contractcourt/htlc_timeout_resolver.go b/contractcourt/htlc_timeout_resolver.go index f7954fe6..9d1c92d7 100644 --- a/contractcourt/htlc_timeout_resolver.go +++ b/contractcourt/htlc_timeout_resolver.go @@ -271,11 +271,11 @@ func (h *htlcTimeoutResolver) Resolve() (ContractResolver, error) { select { case _, ok := <-spendNtfn.Spend: if !ok { - return fmt.Errorf("notifier quit") + return errResolverShuttingDown } case <-h.Quit: - return fmt.Errorf("quitting") + return errResolverShuttingDown } return nil @@ -309,11 +309,11 @@ func (h *htlcTimeoutResolver) Resolve() (ContractResolver, error) { select { case spend, ok = <-spendNtfn.Spend: if !ok { - return nil, fmt.Errorf("quitting") + return nil, errResolverShuttingDown } case <-h.Quit: - return nil, fmt.Errorf("quitting") + return nil, errResolverShuttingDown } // If the spend reveals the pre-image, then we'll enter the clean up