From 0193274c10130821ac3927e3a291c71de36e95e0 Mon Sep 17 00:00:00 2001 From: Elle Mouton Date: Mon, 13 Nov 2023 12:20:50 +0200 Subject: [PATCH] multi: return error from MarkEdgeLive if not found Let MarkEdgLive return a new ErrNotZombieEdge error if an entry with the given channel ID cannot be found. In processZombieUpdate, we then check for this error and log accordingly. --- channeldb/error.go | 4 ++++ channeldb/graph.go | 5 +++++ channeldb/graph_test.go | 6 ++++++ discovery/gossiper.go | 11 ++++++++++- 4 files changed, 25 insertions(+), 1 deletion(-) diff --git a/channeldb/error.go b/channeldb/error.go index f3b89bbab..859af9746 100644 --- a/channeldb/error.go +++ b/channeldb/error.go @@ -75,6 +75,10 @@ var ( // but it is marked as a zombie within the zombie index. ErrZombieEdge = errors.New("edge marked as zombie") + // ErrZombieEdgeNotFound is an error returned when we attempt to find an + // edge in the zombie index which is not there. + ErrZombieEdgeNotFound = errors.New("edge not found in zombie index") + // ErrEdgeAlreadyExist is returned when edge with specific // channel id can't be added because it already exist. ErrEdgeAlreadyExist = fmt.Errorf("edge already exist") diff --git a/channeldb/graph.go b/channeldb/graph.go index c0cbc3287..4712412f5 100644 --- a/channeldb/graph.go +++ b/channeldb/graph.go @@ -3512,6 +3512,11 @@ func (c *ChannelGraph) MarkEdgeLive(chanID uint64) error { var k [8]byte byteOrder.PutUint64(k[:], chanID) + + if len(zombieIndex.Get(k[:])) == 0 { + return ErrZombieEdgeNotFound + } + return zombieIndex.Delete(k[:]) }, func() {}) if err != nil { diff --git a/channeldb/graph_test.go b/channeldb/graph_test.go index 41471906e..41c65e353 100644 --- a/channeldb/graph_test.go +++ b/channeldb/graph_test.go @@ -3089,6 +3089,12 @@ func TestGraphZombieIndex(t *testing.T) { // it within the index. require.NoError(t, graph.MarkEdgeLive(edge.ChannelID)) + // Attempting to mark the edge as live again now that it is no longer + // in the zombie index should fail. + require.ErrorIs( + t, graph.MarkEdgeLive(edge.ChannelID), ErrZombieEdgeNotFound, + ) + isZombie, _, _ = graph.IsZombieEdge(edge.ChannelID) require.False(t, isZombie) diff --git a/discovery/gossiper.go b/discovery/gossiper.go index d2d2fb993..ce8eacdeb 100644 --- a/discovery/gossiper.go +++ b/discovery/gossiper.go @@ -2057,10 +2057,19 @@ func (d *AuthenticatedGossiper) processZombieUpdate( // come through again. baseScid := lnwire.NewShortChanIDFromInt(chanInfo.ChannelID) err = d.cfg.Router.MarkEdgeLive(baseScid) - if err != nil { + switch { + case errors.Is(err, channeldb.ErrZombieEdgeNotFound): + log.Errorf("edge with chan_id=%v was not found in the "+ + "zombie index: %v", err) + + return nil + + case err != nil: return fmt.Errorf("unable to remove edge with "+ "chan_id=%v from zombie index: %v", msg.ShortChannelID, err) + + default: } log.Debugf("Removed edge with chan_id=%v from zombie "+