Merge pull request #8174 from yyforyongyu/fix-inflight-payments
routing: fix stuck inflight payments
This commit is contained in:
16 files changed
+1314
-487
No files matched your search
+14
-21
@@ -399,6 +399,8 @@ func (h *HarnessTest) resetStandbyNodes(t *testing.T) {
|
||||
// config for the coming test. This will also inherit the
|
||||
// test's running context.
|
||||
h.RestartNodeWithExtraArgs(hn, hn.Cfg.OriginalExtraArgs)
|
||||
|
||||
hn.AddToLogf("Finished test case %v", h.manager.currentTestCase)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1624,31 +1626,14 @@ func (h *HarnessTest) OpenChannelPsbt(srcNode, destNode *node.HarnessNode,
|
||||
return respStream, upd.PsbtFund.Psbt
|
||||
}
|
||||
|
||||
// CleanupForceClose mines a force close commitment found in the mempool and
|
||||
// the following sweep transaction from the force closing node.
|
||||
// CleanupForceClose mines blocks to clean up the force close process. This is
|
||||
// used for tests that are not asserting the expected behavior is found during
|
||||
// the force close process, e.g., num of sweeps, etc. Instead, it provides a
|
||||
// shortcut to move the test forward with a clean mempool.
|
||||
func (h *HarnessTest) CleanupForceClose(hn *node.HarnessNode) {
|
||||
// Wait for the channel to be marked pending force close.
|
||||
h.AssertNumPendingForceClose(hn, 1)
|
||||
|
||||
// Mine enough blocks for the node to sweep its funds from the force
|
||||
// closed channel. The commit sweep resolver is able to offer the input
|
||||
// to the sweeper at defaulCSV-1, and broadcast the sweep tx once one
|
||||
// more block is mined.
|
||||
//
|
||||
// NOTE: we might empty blocks here as we don't know the exact number
|
||||
// of blocks to mine. This may end up mining more blocks than needed.
|
||||
h.MineEmptyBlocks(node.DefaultCSV - 1)
|
||||
|
||||
// Assert there is one pending sweep.
|
||||
h.AssertNumPendingSweeps(hn, 1)
|
||||
|
||||
// Mine a block to trigger the sweep.
|
||||
h.MineEmptyBlocks(1)
|
||||
|
||||
// The node should now sweep the funds, clean up by mining the sweeping
|
||||
// tx.
|
||||
h.MineBlocksAndAssertNumTxes(1, 1)
|
||||
|
||||
// Mine blocks to get any second level HTLC resolved. If there are no
|
||||
// HTLCs, this will behave like h.AssertNumPendingCloseChannels.
|
||||
h.mineTillForceCloseResolved(hn)
|
||||
@@ -1771,6 +1756,14 @@ func (h *HarnessTest) SendPaymentAssertSettled(hn *node.HarnessNode,
|
||||
return h.SendPaymentAndAssertStatus(hn, req, lnrpc.Payment_SUCCEEDED)
|
||||
}
|
||||
|
||||
// SendPaymentAssertInflight sends a payment from the passed node and asserts
|
||||
// the payment is inflight.
|
||||
func (h *HarnessTest) SendPaymentAssertInflight(hn *node.HarnessNode,
|
||||
req *routerrpc.SendPaymentRequest) *lnrpc.Payment {
|
||||
|
||||
return h.SendPaymentAndAssertStatus(hn, req, lnrpc.Payment_IN_FLIGHT)
|
||||
}
|
||||
|
||||
// OpenChannelRequest is used to open a channel using the method
|
||||
// OpenMultiChannelsAsync.
|
||||
type OpenChannelRequest struct {
|
||||
|
||||
+12
-11
@@ -167,16 +167,9 @@ func (h *HarnessTest) cleanMempool() {
|
||||
}
|
||||
|
||||
// mineTillForceCloseResolved asserts that the number of pending close channels
|
||||
// are zero. Each time it checks, a new block is mined using MineBlocksSlow to
|
||||
// give the node some time to catch up the chain.
|
||||
//
|
||||
// NOTE: this method is a workaround to make sure we have a clean mempool at
|
||||
// the end of a channel force closure. We cannot directly mine blocks and
|
||||
// assert channels being fully closed because the subsystems in lnd don't share
|
||||
// the same block height. This is especially the case when blocks are produced
|
||||
// too fast.
|
||||
// TODO(yy): remove this workaround when syncing blocks are unified in all the
|
||||
// subsystems.
|
||||
// are zero. Each time it checks, an empty block is mined, followed by a
|
||||
// mempool check to see if there are any sweeping txns. If found, these txns
|
||||
// are then mined to clean up the mempool.
|
||||
func (h *HarnessTest) mineTillForceCloseResolved(hn *node.HarnessNode) {
|
||||
_, startHeight := h.GetBestBlock()
|
||||
|
||||
@@ -184,7 +177,15 @@ func (h *HarnessTest) mineTillForceCloseResolved(hn *node.HarnessNode) {
|
||||
resp := hn.RPC.PendingChannels()
|
||||
total := len(resp.PendingForceClosingChannels)
|
||||
if total != 0 {
|
||||
h.MineBlocks(1)
|
||||
// Mine an empty block first.
|
||||
h.MineEmptyBlocks(1)
|
||||
|
||||
// If there are new sweeping txns, mine a block to
|
||||
// confirm it.
|
||||
mem := h.GetRawMempool()
|
||||
if len(mem) != 0 {
|
||||
h.MineBlocksAndAssertNumTxes(1, len(mem))
|
||||
}
|
||||
|
||||
return fmt.Errorf("expected num of pending force " +
|
||||
"close channel to be zero")
|
||||
|
||||
Reference in new issue
Block a user