From 86eb0a33839df849aa5c868d4e26962d89c3011b Mon Sep 17 00:00:00 2001 From: Joost Jager Date: Mon, 8 Apr 2019 10:34:41 +0200 Subject: [PATCH] cnct: log go to chain reason This commit adds logging of the reason to go to chain for a channel. This can help users to find out the reason why a channels forced closed. To get all go to chain reasons, an optimization to break early is removed. This optimization was not significant, because the normal flow already examined all htlcs. In the exceptional case where we need to go to chain, it does not weigh up against logging all go to chain reasons. --- contractcourt/channel_arbitrator.go | 42 +++++++++++++++++++---------- 1 file changed, 28 insertions(+), 14 deletions(-) diff --git a/contractcourt/channel_arbitrator.go b/contractcourt/channel_arbitrator.go index 87e6221e..80088d73 100644 --- a/contractcourt/channel_arbitrator.go +++ b/contractcourt/channel_arbitrator.go @@ -1097,26 +1097,27 @@ func (c *ChannelArbitrator) checkChainActions(height uint32, // outgoing HTLC's to decide if we need to go on chain at all. haveChainActions := false for _, htlc := range c.activeHTLCs.outgoingHTLCs { - // If any of our HTLC's triggered an on-chain action, then we - // can break early. - if haveChainActions { - break - } - // We'll need to go on-chain for an outgoing HTLC if it was // never resolved downstream, and it's "close" to timing out. - haveChainActions = haveChainActions || c.shouldGoOnChain( + toChain := c.shouldGoOnChain( htlc.RefundTimeout, c.cfg.OutgoingBroadcastDelta, height, ) - } - for _, htlc := range c.activeHTLCs.incomingHTLCs { - // If any of our HTLC's triggered an on-chain action, then we - // can break early. - if haveChainActions { - break + + if toChain { + log.Debugf("ChannelArbitrator(%v): go to chain for "+ + "outgoing htlc %x: timeout=%v, "+ + "blocks_until_expiry=%v, broadcast_delta=%v", + c.cfg.ChanPoint, htlc.RHash[:], + htlc.RefundTimeout, htlc.RefundTimeout-height, + c.cfg.OutgoingBroadcastDelta, + ) } + haveChainActions = haveChainActions || toChain + } + + for _, htlc := range c.activeHTLCs.incomingHTLCs { // We'll need to go on-chain to pull an incoming HTLC iff we // know the pre-image and it's close to timing out. We need to // ensure that we claim the funds that our rightfully ours @@ -1124,10 +1125,23 @@ func (c *ChannelArbitrator) checkChainActions(height uint32, if _, ok := c.cfg.PreimageDB.LookupPreimage(htlc.RHash); !ok { continue } - haveChainActions = haveChainActions || c.shouldGoOnChain( + + toChain := c.shouldGoOnChain( htlc.RefundTimeout, c.cfg.IncomingBroadcastDelta, height, ) + + if toChain { + log.Debugf("ChannelArbitrator(%v): go to chain for "+ + "incoming htlc %x: timeout=%v, "+ + "blocks_until_expiry=%v, broadcast_delta=%v", + c.cfg.ChanPoint, htlc.RHash[:], + htlc.RefundTimeout, htlc.RefundTimeout-height, + c.cfg.IncomingBroadcastDelta, + ) + } + + haveChainActions = haveChainActions || toChain } // If we don't have any actions to make, then we'll return an empty