From 7dd6f8f2b57e200ec1272d07fb299a5ecb574329 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Tue, 11 Aug 2020 14:36:56 +0930 Subject: [PATCH] gossipd: add tombstone when we remove a channel. For those following along at home. Signed-off-by: Rusty Russell --- gossipd/gossip_store.c | 10 ++++++++++ gossipd/gossip_store.h | 7 +++++++ gossipd/gossip_store_wire.csv | 4 ++++ gossipd/routing.c | 1 + gossipd/test/run-bench-find_route.c | 3 +++ gossipd/test/run-check_channel_announcement.c | 4 ++++ gossipd/test/run-find_route-specific.c | 3 +++ gossipd/test/run-find_route.c | 3 +++ gossipd/test/run-overlong.c | 3 +++ gossipd/test/run-txout_failure.c | 4 ++++ 10 files changed, 42 insertions(+) diff --git a/gossipd/gossip_store.c b/gossipd/gossip_store.c index 7e660a27b..944e4d54d 100644 --- a/gossipd/gossip_store.c +++ b/gossipd/gossip_store.c @@ -619,6 +619,13 @@ void gossip_store_delete(struct gossip_store *gs, WIRE_GOSSIP_STORE_CHANNEL_AMOUNT); } +void gossip_store_mark_channel_deleted(struct gossip_store *gs, + const struct short_channel_id *scid) +{ + gossip_store_add(gs, towire_gossip_store_delete_chan(tmpctx, scid), + 0, false, NULL); +} + const u8 *gossip_store_get(const tal_t *ctx, struct gossip_store *gs, u64 offset) @@ -783,6 +790,9 @@ u32 gossip_store_load(struct routing_state *rstate, struct gossip_store *gs) goto badmsg; } break; + case WIRE_GOSSIP_STORE_DELETE_CHAN: + /* No need to copy these */ + break; default: bad = "Unknown message"; goto badmsg; diff --git a/gossipd/gossip_store.h b/gossipd/gossip_store.h index 3695c6017..e5c831907 100644 --- a/gossipd/gossip_store.h +++ b/gossipd/gossip_store.h @@ -55,6 +55,13 @@ void gossip_store_delete(struct gossip_store *gs, struct broadcastable *bcast, int type); +/** + * Mark that the channel is about to be deleted, for convenience of + * others mapping the gossip_store. + */ +void gossip_store_mark_channel_deleted(struct gossip_store *gs, + const struct short_channel_id *scid); + /** * Direct store accessor: loads gossip msg back from store. * diff --git a/gossipd/gossip_store_wire.csv b/gossipd/gossip_store_wire.csv index 29006d09f..0f286fc42 100644 --- a/gossipd/gossip_store_wire.csv +++ b/gossipd/gossip_store_wire.csv @@ -10,3 +10,7 @@ msgdata,gossip_store_channel_amount,satoshis,amount_sat, msgtype,gossip_store_private_update,4102 msgdata,gossip_store_private_update,len,u16, msgdata,gossip_store_private_update,update,u8,len + +msgtype,gossip_store_delete_chan,4103 +msgdata,gossip_store_delete_chan,scid,short_channel_id, + diff --git a/gossipd/routing.c b/gossipd/routing.c index c275a8a5a..d36251f55 100644 --- a/gossipd/routing.c +++ b/gossipd/routing.c @@ -2261,6 +2261,7 @@ void remove_channel_from_store(struct routing_state *rstate, if (is_chan_public(chan)) { update_type = WIRE_CHANNEL_UPDATE; announcment_type = WIRE_CHANNEL_ANNOUNCEMENT; + gossip_store_mark_channel_deleted(rstate->gs, &chan->scid); } else { update_type = WIRE_GOSSIP_STORE_PRIVATE_UPDATE; announcment_type = WIRE_GOSSIPD_LOCAL_ADD_CHANNEL; diff --git a/gossipd/test/run-bench-find_route.c b/gossipd/test/run-bench-find_route.c index cf7c1acc1..919e3f3b0 100644 --- a/gossipd/test/run-bench-find_route.c +++ b/gossipd/test/run-bench-find_route.c @@ -101,6 +101,9 @@ u8 *towire_errorfmt(const tal_t *ctx UNNEEDED, /* Generated stub for towire_gossip_store_channel_amount */ u8 *towire_gossip_store_channel_amount(const tal_t *ctx UNNEEDED, struct amount_sat satoshis UNNEEDED) { fprintf(stderr, "towire_gossip_store_channel_amount called!\n"); abort(); } +/* Generated stub for towire_gossip_store_delete_chan */ +u8 *towire_gossip_store_delete_chan(const tal_t *ctx UNNEEDED, const struct short_channel_id *scid UNNEEDED) +{ fprintf(stderr, "towire_gossip_store_delete_chan called!\n"); abort(); } /* Generated stub for towire_gossip_store_private_update */ u8 *towire_gossip_store_private_update(const tal_t *ctx UNNEEDED, const u8 *update UNNEEDED) { fprintf(stderr, "towire_gossip_store_private_update called!\n"); abort(); } diff --git a/gossipd/test/run-check_channel_announcement.c b/gossipd/test/run-check_channel_announcement.c index d49be28f7..d9e8e68f8 100644 --- a/gossipd/test/run-check_channel_announcement.c +++ b/gossipd/test/run-check_channel_announcement.c @@ -69,6 +69,10 @@ const u8 *gossip_store_get_private_update(const tal_t *ctx UNNEEDED, struct gossip_store *gs UNNEEDED, u64 offset UNNEEDED) { fprintf(stderr, "gossip_store_get_private_update called!\n"); abort(); } +/* Generated stub for gossip_store_mark_channel_deleted */ +void gossip_store_mark_channel_deleted(struct gossip_store *gs UNNEEDED, + const struct short_channel_id *scid UNNEEDED) +{ fprintf(stderr, "gossip_store_mark_channel_deleted called!\n"); abort(); } /* Generated stub for gossip_store_new */ struct gossip_store *gossip_store_new(struct routing_state *rstate UNNEEDED, struct list_head *peers UNNEEDED) diff --git a/gossipd/test/run-find_route-specific.c b/gossipd/test/run-find_route-specific.c index 26cf9ef6d..77ed9800e 100644 --- a/gossipd/test/run-find_route-specific.c +++ b/gossipd/test/run-find_route-specific.c @@ -88,6 +88,9 @@ u8 *towire_errorfmt(const tal_t *ctx UNNEEDED, /* Generated stub for towire_gossip_store_channel_amount */ u8 *towire_gossip_store_channel_amount(const tal_t *ctx UNNEEDED, struct amount_sat satoshis UNNEEDED) { fprintf(stderr, "towire_gossip_store_channel_amount called!\n"); abort(); } +/* Generated stub for towire_gossip_store_delete_chan */ +u8 *towire_gossip_store_delete_chan(const tal_t *ctx UNNEEDED, const struct short_channel_id *scid UNNEEDED) +{ fprintf(stderr, "towire_gossip_store_delete_chan called!\n"); abort(); } /* Generated stub for towire_gossip_store_private_update */ u8 *towire_gossip_store_private_update(const tal_t *ctx UNNEEDED, const u8 *update UNNEEDED) { fprintf(stderr, "towire_gossip_store_private_update called!\n"); abort(); } diff --git a/gossipd/test/run-find_route.c b/gossipd/test/run-find_route.c index 7e8af7cba..0bf44aeae 100644 --- a/gossipd/test/run-find_route.c +++ b/gossipd/test/run-find_route.c @@ -88,6 +88,9 @@ u8 *towire_errorfmt(const tal_t *ctx UNNEEDED, /* Generated stub for towire_gossip_store_channel_amount */ u8 *towire_gossip_store_channel_amount(const tal_t *ctx UNNEEDED, struct amount_sat satoshis UNNEEDED) { fprintf(stderr, "towire_gossip_store_channel_amount called!\n"); abort(); } +/* Generated stub for towire_gossip_store_delete_chan */ +u8 *towire_gossip_store_delete_chan(const tal_t *ctx UNNEEDED, const struct short_channel_id *scid UNNEEDED) +{ fprintf(stderr, "towire_gossip_store_delete_chan called!\n"); abort(); } /* Generated stub for towire_gossip_store_private_update */ u8 *towire_gossip_store_private_update(const tal_t *ctx UNNEEDED, const u8 *update UNNEEDED) { fprintf(stderr, "towire_gossip_store_private_update called!\n"); abort(); } diff --git a/gossipd/test/run-overlong.c b/gossipd/test/run-overlong.c index bd5eee9ac..705bab396 100644 --- a/gossipd/test/run-overlong.c +++ b/gossipd/test/run-overlong.c @@ -88,6 +88,9 @@ u8 *towire_errorfmt(const tal_t *ctx UNNEEDED, /* Generated stub for towire_gossip_store_channel_amount */ u8 *towire_gossip_store_channel_amount(const tal_t *ctx UNNEEDED, struct amount_sat satoshis UNNEEDED) { fprintf(stderr, "towire_gossip_store_channel_amount called!\n"); abort(); } +/* Generated stub for towire_gossip_store_delete_chan */ +u8 *towire_gossip_store_delete_chan(const tal_t *ctx UNNEEDED, const struct short_channel_id *scid UNNEEDED) +{ fprintf(stderr, "towire_gossip_store_delete_chan called!\n"); abort(); } /* Generated stub for towire_gossip_store_private_update */ u8 *towire_gossip_store_private_update(const tal_t *ctx UNNEEDED, const u8 *update UNNEEDED) { fprintf(stderr, "towire_gossip_store_private_update called!\n"); abort(); } diff --git a/gossipd/test/run-txout_failure.c b/gossipd/test/run-txout_failure.c index 864e4ef5f..13711af06 100644 --- a/gossipd/test/run-txout_failure.c +++ b/gossipd/test/run-txout_failure.c @@ -40,6 +40,10 @@ const u8 *gossip_store_get_private_update(const tal_t *ctx UNNEEDED, struct gossip_store *gs UNNEEDED, u64 offset UNNEEDED) { fprintf(stderr, "gossip_store_get_private_update called!\n"); abort(); } +/* Generated stub for gossip_store_mark_channel_deleted */ +void gossip_store_mark_channel_deleted(struct gossip_store *gs UNNEEDED, + const struct short_channel_id *scid UNNEEDED) +{ fprintf(stderr, "gossip_store_mark_channel_deleted called!\n"); abort(); } /* Generated stub for json_add_member */ void json_add_member(struct json_stream *js UNNEEDED, const char *fieldname UNNEEDED,