From 62e19185f14356898e92bd10f03194e9b7aa1e9b Mon Sep 17 00:00:00 2001 From: eugene Date: Wed, 19 Aug 2020 10:52:44 -0400 Subject: [PATCH] htlcswitch+channeldb: single tx for removing fwdpkgs This commit changes RemoveFwdPkg to RemoveFwdPkgs so that a single tx is used instead of N where N is the number of fwd pkgs to remove. --- channeldb/channel.go | 16 ++++++++++++---- htlcswitch/link.go | 4 ++-- lnwallet/channel.go | 6 +++--- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/channeldb/channel.go b/channeldb/channel.go index 5d943a11..0a5e47b2 100644 --- a/channeldb/channel.go +++ b/channeldb/channel.go @@ -2409,16 +2409,24 @@ func (c *OpenChannel) SetFwdFilter(height uint64, fwdFilter *PkgFilter) error { }) } -// RemoveFwdPkg atomically removes a forwarding package specified by the remote -// commitment height. +// RemoveFwdPkgs atomically removes forwarding packages specified by the remote +// commitment heights. If one of the intermediate RemovePkg calls fails, then the +// later packages won't be removed. // // NOTE: This method should only be called on packages marked FwdStateCompleted. -func (c *OpenChannel) RemoveFwdPkg(height uint64) error { +func (c *OpenChannel) RemoveFwdPkgs(heights ...uint64) error { c.Lock() defer c.Unlock() return kvdb.Update(c.Db, func(tx kvdb.RwTx) error { - return c.Packager.RemovePkg(tx, height) + for _, height := range heights { + err := c.Packager.RemovePkg(tx, height) + if err != nil { + return err + } + } + + return nil }) } diff --git a/htlcswitch/link.go b/htlcswitch/link.go index 3931af34..d9ee8db3 100644 --- a/htlcswitch/link.go +++ b/htlcswitch/link.go @@ -776,7 +776,7 @@ func (l *channelLink) resolveFwdPkg(fwdPkg *channeldb.FwdPkg) error { l.log.Debugf("removing completed fwd pkg for height=%d", fwdPkg.Height) - err := l.channel.RemoveFwdPkg(fwdPkg.Height) + err := l.channel.RemoveFwdPkgs(fwdPkg.Height) if err != nil { l.log.Errorf("unable to remove fwd pkg for height=%d: "+ "%v", fwdPkg.Height, err) @@ -859,7 +859,7 @@ func (l *channelLink) fwdPkgGarbager() { continue } - err = l.channel.RemoveFwdPkg(fwdPkg.Height) + err = l.channel.RemoveFwdPkgs(fwdPkg.Height) if err != nil { l.log.Warnf("unable to remove fwd pkg "+ "for height=%d: %v", diff --git a/lnwallet/channel.go b/lnwallet/channel.go index 563fe8d1..94e26805 100644 --- a/lnwallet/channel.go +++ b/lnwallet/channel.go @@ -4850,9 +4850,9 @@ func (lc *LightningChannel) SetFwdFilter(height uint64, return lc.channelState.SetFwdFilter(height, fwdFilter) } -// RemoveFwdPkg permanently deletes the forwarding package at the given height. -func (lc *LightningChannel) RemoveFwdPkg(height uint64) error { - return lc.channelState.RemoveFwdPkg(height) +// RemoveFwdPkgs permanently deletes the forwarding package at the given heights. +func (lc *LightningChannel) RemoveFwdPkgs(heights ...uint64) error { + return lc.channelState.RemoveFwdPkgs(heights...) } // NextRevocationKey returns the commitment point for the _next_ commitment