channeldb+routing: htlcs are pruned on settle
This commit is contained in:
1 parent
8291e8a170
commit
2dd11ed249
6 files changed
+164
-5
No files matched your search
@@ -19,6 +19,11 @@ type ControlTower interface {
|
||||
// hash.
|
||||
InitPayment(lntypes.Hash, *channeldb.PaymentCreationInfo) error
|
||||
|
||||
// DeleteFailedAttempts removes all failed HTLCs from the db. It should
|
||||
// be called for a given payment whenever all inflight htlcs are
|
||||
// completed, and the payment has reached a final settled state.
|
||||
DeleteFailedAttempts(lntypes.Hash) error
|
||||
|
||||
// RegisterAttempt atomically records the provided HTLCAttemptInfo.
|
||||
RegisterAttempt(lntypes.Hash, *channeldb.HTLCAttemptInfo) error
|
||||
|
||||
@@ -125,6 +130,12 @@ func (p *controlTower) InitPayment(paymentHash lntypes.Hash,
|
||||
return p.db.InitPayment(paymentHash, info)
|
||||
}
|
||||
|
||||
// DeleteFailedAttempts deletes all failed htlcs if the payment was
|
||||
// successfully settled.
|
||||
func (p *controlTower) DeleteFailedAttempts(paymentHash lntypes.Hash) error {
|
||||
return p.db.DeleteFailedAttempts(paymentHash)
|
||||
}
|
||||
|
||||
// RegisterAttempt atomically records the provided HTLCAttemptInfo to the
|
||||
// DB.
|
||||
func (p *controlTower) RegisterAttempt(paymentHash lntypes.Hash,
|
||||
|
||||
@@ -309,6 +309,32 @@ func (m *mockControlTowerOld) InitPayment(phash lntypes.Hash,
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *mockControlTowerOld) DeleteFailedAttempts(phash lntypes.Hash) error {
|
||||
p, ok := m.payments[phash]
|
||||
if !ok {
|
||||
return channeldb.ErrPaymentNotInitiated
|
||||
}
|
||||
|
||||
var inFlight bool
|
||||
for _, a := range p.attempts {
|
||||
if a.Settle != nil {
|
||||
continue
|
||||
}
|
||||
|
||||
if a.Failure != nil {
|
||||
continue
|
||||
}
|
||||
|
||||
inFlight = true
|
||||
}
|
||||
|
||||
if inFlight {
|
||||
return channeldb.ErrPaymentInFlight
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *mockControlTowerOld) RegisterAttempt(phash lntypes.Hash,
|
||||
a *channeldb.HTLCAttemptInfo) error {
|
||||
|
||||
@@ -665,6 +691,11 @@ func (m *mockControlTower) InitPayment(phash lntypes.Hash,
|
||||
return args.Error(0)
|
||||
}
|
||||
|
||||
func (m *mockControlTower) DeleteFailedAttempts(phash lntypes.Hash) error {
|
||||
args := m.Called(phash)
|
||||
return args.Error(0)
|
||||
}
|
||||
|
||||
func (m *mockControlTower) RegisterAttempt(phash lntypes.Hash,
|
||||
a *channeldb.HTLCAttemptInfo) error {
|
||||
|
||||
|
||||
@@ -186,9 +186,21 @@ lifecycle:
|
||||
// Find the first successful shard and return
|
||||
// the preimage and route.
|
||||
for _, a := range payment.HTLCs {
|
||||
if a.Settle != nil {
|
||||
return a.Settle.Preimage, &a.Route, nil
|
||||
if a.Settle == nil {
|
||||
continue
|
||||
}
|
||||
|
||||
err := p.router.cfg.Control.
|
||||
DeleteFailedAttempts(
|
||||
p.identifier)
|
||||
if err != nil {
|
||||
log.Errorf("Error deleting failed "+
|
||||
"payment attempts for "+
|
||||
"payment %v: %v", p.identifier,
|
||||
err)
|
||||
}
|
||||
|
||||
return a.Settle.Preimage, &a.Route, nil
|
||||
}
|
||||
|
||||
// Payment failed.
|
||||
|
||||
@@ -3571,6 +3571,7 @@ func TestSendMPPaymentSucceed(t *testing.T) {
|
||||
}
|
||||
}
|
||||
})
|
||||
controlTower.On("DeleteFailedAttempts", identifier).Return(nil)
|
||||
|
||||
// Call the actual method SendPayment on router. This is place inside a
|
||||
// goroutine so we can set a timeout for the whole test, in case
|
||||
@@ -3782,6 +3783,7 @@ func TestSendMPPaymentSucceedOnExtraShards(t *testing.T) {
|
||||
return
|
||||
}
|
||||
})
|
||||
controlTower.On("DeleteFailedAttempts", identifier).Return(nil)
|
||||
|
||||
// Call the actual method SendPayment on router. This is place inside a
|
||||
// goroutine so we can set a timeout for the whole test, in case
|
||||
|
||||
Reference in new issue
Block a user