From 39295dc5aacadf62148cbad1e6ab47d4b757f64c Mon Sep 17 00:00:00 2001 From: Olaoluwa Osuntokun Date: Thu, 23 Nov 2017 13:49:48 -0600 Subject: [PATCH] lnwallet+peer: add new ResetState method to channel state machine In this commit, we add a new ResetState method to the channel state machine which will reset the state of the channel to `channelOpen`. We add this as before this commit, it was possible for a channel to shift into the closing state, the closing negotiation be cancelled for whatever reason, resulting the the channel held by the breachArbiter unable to act to potential on-chain events. --- lnwallet/channel.go | 7 +++++++ peer.go | 19 ++++++++++++++++--- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/lnwallet/channel.go b/lnwallet/channel.go index 2eb6fb36..2a478f3d 100644 --- a/lnwallet/channel.go +++ b/lnwallet/channel.go @@ -1382,6 +1382,13 @@ func (lc *LightningChannel) CancelObserver() { close(lc.observerQuit) } +// ResetState resets the state of the channel back to the default state. This +// ensures that any active goroutines which need to act based on on-chain +// events do so properly. +func (lc *LightningChannel) ResetState() { + lc.Lock() + lc.status = channelOpen + lc.Unlock() } // logUpdateToPayDesc converts a LogUpdate into a matching PaymentDescriptor diff --git a/peer.go b/peer.go index 642fa861..cdc11c05 100644 --- a/peer.go +++ b/peer.go @@ -4,7 +4,6 @@ import ( "container/list" "fmt" "net" - "strings" "sync" "sync/atomic" "time" @@ -1273,6 +1272,10 @@ out: "msg: %v", err) peerLog.Error(err) + // As the negotiations failed, we'll reset the + // channel state to ensure we act to on-chain + // events as normal. + chanCloser.cfg.channel.ResetState() if chanCloser.CloseRequest() != nil { chanCloser.CloseRequest().Err <- err @@ -1299,9 +1302,16 @@ out: // relevant sub-systems and launching a goroutine to // wait for close tx conf. p.finalizeChanClosure(chanCloser) - } - case <-p.quit: + + // As, we've been signalled to exit, we'll reset all + // our active channel back to their default state. + p.activeChanMtx.Lock() + for _, channel := range p.activeChannels { + channel.ResetState() + } + p.activeChanMtx.Unlock() + break out } } @@ -1440,6 +1450,9 @@ func (p *peer) handleLocalCloseReq(req *htlcswitch.ChanClose) { req.Err <- err delete(p.activeChanCloses, chanID) + // As we were unable to shutdown the channel, we'll + // return it back to its normal state. + channel.ResetState() return }