From 9fd73af589267679b7afb8834e75ac6219507def Mon Sep 17 00:00:00 2001 From: Conner Fromknecht Date: Tue, 27 Mar 2018 17:05:22 -0700 Subject: [PATCH 1/2] channeldb: update chanid in-mem during MarkAsOpen Modifies the MarkAsOpen operation to also update the ShortChanID and IsPending fields in-memory. Before, only the on-disk representation was updated, which may have lead to stale data channel states being passed in-memory. --- channeldb/channel.go | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/channeldb/channel.go b/channeldb/channel.go index 6d58f8ab..764db9a7 100644 --- a/channeldb/channel.go +++ b/channeldb/channel.go @@ -538,7 +538,7 @@ func (c *OpenChannel) MarkAsOpen(openLoc lnwire.ShortChannelID) error { c.Lock() defer c.Unlock() - return c.Db.Update(func(tx *bolt.Tx) error { + if err := c.Db.Update(func(tx *bolt.Tx) error { chanBucket, err := updateChanBucket(tx, c.IdentityPub, &c.FundingOutpoint, c.ChainHash) if err != nil { @@ -554,7 +554,14 @@ func (c *OpenChannel) MarkAsOpen(openLoc lnwire.ShortChannelID) error { channel.ShortChanID = openLoc return putOpenChannel(chanBucket, channel) - }) + }); err != nil { + return err + } + + c.IsPending = false + c.ShortChanID = openLoc + + return nil } // MarkBorked marks the event when the channel as reached an irreconcilable From f594a242eaefc5cd139926f0851c1327246da14c Mon Sep 17 00:00:00 2001 From: Conner Fromknecht Date: Tue, 27 Mar 2018 17:07:15 -0700 Subject: [PATCH 2/2] channeldb/channel_test: test ShortChanID is updated in-mem Modifies TestFetchPendingChannels to verify that calls to MarkAsOpen also modify the in-memory state. Previously we only tested the persistent state loaded immediately after. --- channeldb/channel_test.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/channeldb/channel_test.go b/channeldb/channel_test.go index 4cf14c78..e405f60d 100644 --- a/channeldb/channel_test.go +++ b/channeldb/channel_test.go @@ -684,6 +684,16 @@ func TestFetchPendingChannels(t *testing.T) { t.Fatalf("unable to mark channel as open: %v", err) } + if pendingChannels[0].IsPending { + t.Fatalf("channel marked open should no longer be pending") + } + + if pendingChannels[0].ShortChanID != chanOpenLoc { + t.Fatalf("channel opening height not updated: expected %v, "+ + "got %v", spew.Sdump(pendingChannels[0].ShortChanID), + chanOpenLoc) + } + // Next, we'll re-fetch the channel to ensure that the open height was // properly set. openChans, err := cdb.FetchAllChannels()