From c2764c10c52d62f11c8b502abaa6c72aa4185a07 Mon Sep 17 00:00:00 2001 From: Christian Decker Date: Thu, 2 Feb 2017 19:54:52 +0100 Subject: [PATCH] broadcast: Implement replacing messages in the broadcast queue If type and tag match, then we replace any existing message in the queue. This allows us to drop old announcements. Special care needs to be taken so that dependent messages are not reordered, but for gossip this is the case, since the `channel_announcement` cannot be updated. --- daemon/broadcast.c | 16 ++++++++++++++-- daemon/broadcast.h | 4 ++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/daemon/broadcast.c b/daemon/broadcast.c index e9b03d3b3..be530ffa3 100644 --- a/daemon/broadcast.c +++ b/daemon/broadcast.c @@ -26,9 +26,21 @@ void queue_broadcast(struct broadcast_state *bstate, const u8 *tag, const u8 *payload) { - struct queued_message *msg = new_queued_message(bstate, type, tag, payload); + struct queued_message *msg; + u64 index = 0; + /* Remove any tag&type collisions */ + while (true) { + msg = next_broadcast_message(bstate, &index); + if (msg == NULL) + break; + else if (msg->type == type && memcmp(msg->tag, tag, tal_count(tag)) == 0) { + uintmap_del(&bstate->broadcasts, index); + tal_free(msg); + } + } - /*FIXME(cdecker) Walk through old messages and purge collisions */ + /* Now add the message to the queue */ + msg = new_queued_message(bstate, type, tag, payload); uintmap_add(&bstate->broadcasts, bstate->next_index, msg); bstate->next_index += 1; } diff --git a/daemon/broadcast.h b/daemon/broadcast.h index ebc28da07..5c002fdc1 100644 --- a/daemon/broadcast.h +++ b/daemon/broadcast.h @@ -26,6 +26,10 @@ UINTMAP(struct queued_message *) broadcasts; struct broadcast_state *new_broadcast_state(tal_t *ctx); +/* Queue a new message to be broadcast and replace any outdated + * broadcast. Replacement is done by comparing the `type` and the + * `tag`, if both match the old message is dropped from the queue. The + * new message is added to the top of the broadcast queue. */ void queue_broadcast(struct broadcast_state *bstate, const int type, const u8 *tag,