Skip to content

Commit

Permalink
router: call CleanStore on startup
Browse files Browse the repository at this point in the history
  • Loading branch information
halseth committed Oct 6, 2020
1 parent b071278 commit 90a59fe
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 0 deletions.
8 changes: 8 additions & 0 deletions htlcswitch/switch.go
Original file line number Diff line number Diff line change
Expand Up @@ -438,6 +438,14 @@ func (s *Switch) GetPaymentResult(paymentID uint64, paymentHash lntypes.Hash,
return resultChan, nil
}

// CleanStore calls the underlying result store, telling it is safe to delete
// all entries except the ones in the keepPids map. This should be called
// preiodically to let the switch clean up payment results that we have
// handled.
func (s *Switch) CleanStore(keepPids map[uint64]struct{}) error {
return s.networkResults.cleanStore(keepPids)
}

// SendHTLC is used by other subsystems which aren't belong to htlc switch
// package in order to send the htlc update. The paymentID used MUST be unique
// for this HTLC, and MUST be used only once, otherwise the switch might reject
Expand Down
7 changes: 7 additions & 0 deletions routing/mock_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,9 @@ func (m *mockPaymentAttemptDispatcher) GetPaymentResult(paymentID uint64,
return c, nil

}
func (m *mockPaymentAttemptDispatcher) CleanStore(map[uint64]struct{}) error {
return nil
}

func (m *mockPaymentAttemptDispatcher) setPaymentResult(
f func(firstHop lnwire.ShortChannelID) ([32]byte, error)) {
Expand Down Expand Up @@ -187,6 +190,10 @@ func (m *mockPayer) GetPaymentResult(paymentID uint64, _ lntypes.Hash,
}
}

func (m *mockPayer) CleanStore(pids map[uint64]struct{}) error {
return nil
}

type initArgs struct {
c *channeldb.PaymentCreationInfo
}
Expand Down
32 changes: 32 additions & 0 deletions routing/router.go
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,14 @@ type PaymentAttemptDispatcher interface {
GetPaymentResult(paymentID uint64, paymentHash lntypes.Hash,
deobfuscator htlcswitch.ErrorDecrypter) (
<-chan *htlcswitch.PaymentResult, error)

// CleanStore calls the underlying result store, telling it is safe to
// delete all entries except the ones in the keepPids map. This should
// be called preiodically to let the switch clean up payment results
// that we have handled.
// NOTE: New payment attempts MUST NOT be made after the keepPids map
// has been created and this method has returned.
CleanStore(keepPids map[uint64]struct{}) error
}

// PaymentSessionSource is an interface that defines a source for the router to
Expand Down Expand Up @@ -538,6 +546,30 @@ func (r *ChannelRouter) Start() error {
return err
}

// Before we restart existing payments and start accepting more
// payments to be made, we clean the network result store of the
// Switch. We do this here at startup to ensure no more payments can be
// made concurrently, so we know the toKeep map will be up-to-date
// until the cleaning has finished.
toKeep := make(map[uint64]struct{})
for _, p := range payments {
payment, err := r.cfg.Control.FetchPayment(
p.Info.PaymentHash,
)
if err != nil {
return err
}

for _, a := range payment.HTLCs {
toKeep[a.AttemptID] = struct{}{}
}
}

log.Debugf("Cleaning network result store.")
if err := r.cfg.Payer.CleanStore(toKeep); err != nil {
return err
}

for _, payment := range payments {
log.Infof("Resuming payment with hash %v", payment.Info.PaymentHash)
r.wg.Add(1)
Expand Down

0 comments on commit 90a59fe

Please sign in to comment.