discovery/gossiper: don't return on errChan for ChannelUpdate not yet processed
Previosuly we would immediately return nil on the error channel for premature ChannelUpdates, which would break the expection that a a returned non-error meant the update was successfully added to the database. This meant that the caller would believe the update was added to the database, while it is actually still in volatile memory and can be lost during restarts. This change makes us handle premature ChannelUpdates as we handle other premature announcements within the gossiper, by deferring sending on the error channel until we have reprocessed the update.
This commit is contained in:
2 files changed
+39
-26
No files matched your search
@@ -2005,10 +2005,8 @@ func TestReceiveRemoteChannelUpdateFirst(t *testing.T) {
|
||||
// Recreate the case where the remote node is sending us its ChannelUpdate
|
||||
// before we have been able to process our own ChannelAnnouncement and
|
||||
// ChannelUpdate.
|
||||
err = <-ctx.gossiper.ProcessRemoteAnnouncement(batch.chanUpdAnn2, remotePeer)
|
||||
if err != nil {
|
||||
t.Fatalf("unable to process :%v", err)
|
||||
}
|
||||
errRemoteAnn := ctx.gossiper.ProcessRemoteAnnouncement(batch.chanUpdAnn2, remotePeer)
|
||||
|
||||
select {
|
||||
case <-ctx.broadcastedMessage:
|
||||
t.Fatal("channel update announcement was broadcast")
|
||||
@@ -2069,6 +2067,15 @@ func TestReceiveRemoteChannelUpdateFirst(t *testing.T) {
|
||||
|
||||
// At this point the remote ChannelUpdate we received earlier should
|
||||
// be reprocessed, as we now have the necessary edge entry in the graph.
|
||||
select {
|
||||
case err := <-errRemoteAnn:
|
||||
if err != nil {
|
||||
t.Fatalf("error re-processing remote update: %v", err)
|
||||
}
|
||||
case <-time.After(2 * trickleDelay):
|
||||
t.Fatalf("remote update was not processed")
|
||||
}
|
||||
|
||||
// Check that the ChannelEdgePolicy was added to the graph.
|
||||
chanInfo, e1, e2, err = ctx.router.GetChannelByID(batch.chanUpdAnn1.ShortChannelID)
|
||||
if err != nil {
|
||||
|
||||
Reference in new issue
Block a user