breacharbiter: avoid infinite loop in exactRetribution

After a shutdown has been initiated, both registrations
for spend ntfns and publishing txns can fail. The current
behavior in the face of such failures is to continue trying,
which is fine if we are online. However, this causes an
infinite loop during shutdown, and lnd cannot exit since
the routine is tracked by the brar's waitgroup.

A simple fix is to select on the brar's quit channel after
detecting a failure from either, allowing the breach arbiter
to break out of this death cycle.
This commit is contained in:
Conner Fromknecht 2018-02-07 17:42:36 -08:00
parent 7bbcbc6fea
commit 3021a246f1
No known key found for this signature in database
GPG Key ID: 39DE78FBE6ACB0EF

@ -519,8 +519,17 @@ secondLevelCheck:
brarLog.Errorf("unable to check for spentness "+ brarLog.Errorf("unable to check for spentness "+
"of out_point=%v: %v", "of out_point=%v: %v",
breachedOutput.outpoint, err) breachedOutput.outpoint, err)
// Registration may have failed if we've been
// instructed to shutdown. If so, return here to
// avoid entering an infinite loop.
select {
case <-b.quit:
return
default:
continue continue
} }
}
select { select {
// The output has been taken to the second level! // The output has been taken to the second level!
@ -575,9 +584,17 @@ secondLevelCheck:
brarLog.Infof("Attempting to transfer HTLC revocations " + brarLog.Infof("Attempting to transfer HTLC revocations " +
"to the second level") "to the second level")
finalTx = nil finalTx = nil
// Txn publication may fail if we're shutting down.
// If so, return to avoid entering an infinite loop.
select {
case <-b.quit:
return
default:
goto secondLevelCheck goto secondLevelCheck
} }
} }
}
// As a conclusionary step, we register for a notification to be // As a conclusionary step, we register for a notification to be
// dispatched once the justice tx is confirmed. After confirmation we // dispatched once the justice tx is confirmed. After confirmation we