diff --git a/channeldb/channel.go b/channeldb/channel.go index 21468b7f3..2031b7b33 100644 --- a/channeldb/channel.go +++ b/channeldb/channel.go @@ -475,7 +475,6 @@ var chanStatusStrings = map[ChannelStatus]string{ // orderedChanStatusFlags is an in-order list of all that channel status flags. var orderedChanStatusFlags = []ChannelStatus{ - ChanStatusDefault, ChanStatusBorked, ChanStatusCommitBroadcasted, ChanStatusLocalDataLoss, @@ -488,7 +487,7 @@ var orderedChanStatusFlags = []ChannelStatus{ // String returns a human-readable representation of the ChannelStatus. func (c ChannelStatus) String() string { // If no flags are set, then this is the default case. - if c == 0 { + if c == ChanStatusDefault { return chanStatusStrings[ChanStatusDefault] } @@ -711,6 +710,12 @@ func (c *OpenChannel) HasChanStatus(status ChannelStatus) bool { } func (c *OpenChannel) hasChanStatus(status ChannelStatus) bool { + // Special case ChanStatusDefualt since it isn't actually flag, but a + // particular combination (or lack-there-of) of flags. + if status == ChanStatusDefault { + return c.chanStatus == ChanStatusDefault + } + return c.chanStatus&status == status } diff --git a/channeldb/channel_test.go b/channeldb/channel_test.go index eb068485e..6b1e0ab8b 100644 --- a/channeldb/channel_test.go +++ b/channeldb/channel_test.go @@ -1581,3 +1581,62 @@ func TestBalanceAtHeight(t *testing.T) { }) } } + +// TestHasChanStatus asserts the behavior of HasChanStatus by checking the +// behavior of various status flags in addition to the special case of +// ChanStatusDefault which is treated like a flag in the code base even though +// it isn't. +func TestHasChanStatus(t *testing.T) { + tests := []struct { + name string + status ChannelStatus + expHas map[ChannelStatus]bool + }{ + { + name: "default", + status: ChanStatusDefault, + expHas: map[ChannelStatus]bool{ + ChanStatusDefault: true, + ChanStatusBorked: false, + }, + }, + { + name: "single flag", + status: ChanStatusBorked, + expHas: map[ChannelStatus]bool{ + ChanStatusDefault: false, + ChanStatusBorked: true, + }, + }, + { + name: "multiple flags", + status: ChanStatusBorked | ChanStatusLocalDataLoss, + expHas: map[ChannelStatus]bool{ + ChanStatusDefault: false, + ChanStatusBorked: true, + ChanStatusLocalDataLoss: true, + }, + }, + } + + for _, test := range tests { + test := test + + t.Run(test.name, func(t *testing.T) { + c := &OpenChannel{ + chanStatus: test.status, + } + + for status, expHas := range test.expHas { + has := c.HasChanStatus(status) + if has == expHas { + continue + } + + t.Fatalf("expected chan status to "+ + "have %s? %t, got: %t", + status, expHas, has) + } + }) + } +} diff --git a/peer.go b/peer.go index 492c8f04a..c6e2ae025 100644 --- a/peer.go +++ b/peer.go @@ -504,13 +504,9 @@ func (p *peer) loadActiveChannels(chans []*channeldb.OpenChannel) ( // Skip adding any permanently irreconcilable channels to the // htlcswitch. switch { - case dbChan.HasChanStatus(channeldb.ChanStatusBorked): - fallthrough - case dbChan.HasChanStatus(channeldb.ChanStatusCommitBroadcasted): - fallthrough - case dbChan.HasChanStatus(channeldb.ChanStatusCoopBroadcasted): - fallthrough - case dbChan.HasChanStatus(channeldb.ChanStatusLocalDataLoss): + case !dbChan.HasChanStatus(channeldb.ChanStatusDefault) && + !dbChan.HasChanStatus(channeldb.ChanStatusRestored): + peerLog.Warnf("ChannelPoint(%v) has status %v, won't "+ "start.", chanPoint, dbChan.ChanStatus())