channeldb: deleting a channel twice no longer triggers an error

This commit adds an additional check within CloseChannel to ensure that
sub-systems attempting to delete the channel one after the other (in
the event of any sort of closure) doesn’t result in an extraneous
error.

To fix this, we now check if the channel exists before attempting a
deletion. If the channel doesn’t exist, then we simply exit early with
a nil error.
This commit is contained in:
Olaoluwa Osuntokun 2016-12-19 16:49:42 -08:00
parent ddc1eb4c8a
commit cbd26b35e0
No known key found for this signature in database
GPG Key ID: 9CC5B105D03521A2

@ -568,6 +568,11 @@ func (c *OpenChannel) FindPreviousState(updateNum uint64) (*ChannelDelta, error)
// purposes. // purposes.
// TODO(roasbeef): delete on-disk set of HTLC's // TODO(roasbeef): delete on-disk set of HTLC's
func (c *OpenChannel) CloseChannel() error { func (c *OpenChannel) CloseChannel() error {
var b bytes.Buffer
if err := writeOutpoint(&b, c.ChanID); err != nil {
return err
}
return c.Db.Update(func(tx *bolt.Tx) error { return c.Db.Update(func(tx *bolt.Tx) error {
// First fetch the top level bucket which stores all data related to // First fetch the top level bucket which stores all data related to
// current, active channels. // current, active channels.
@ -589,12 +594,19 @@ func (c *OpenChannel) CloseChannel() error {
if chanIndexBucket == nil { if chanIndexBucket == nil {
return ErrNoActiveChannels return ErrNoActiveChannels
} }
var b bytes.Buffer
if err := writeOutpoint(&b, c.ChanID); err != nil { // If this channel isn't found within the channel index bucket,
return err // then it has already been deleted. So we can exit early as
} // there isn't any more work for us to do here.
outPointBytes := b.Bytes() outPointBytes := b.Bytes()
if err := chanIndexBucket.Delete(b.Bytes()); err != nil { if chanIndexBucket.Get(outPointBytes) == nil {
return nil
}
// Otherwise, we can safely delete the channel from the index
// without running into any boltdb related errors by repeated
// deletion attempts.
if err := chanIndexBucket.Delete(outPointBytes); err != nil {
return err return err
} }