diff --git a/gossipd/gossip_store.c b/gossipd/gossip_store.c index 6b47adbdc..89ad5ba34 100644 --- a/gossipd/gossip_store.c +++ b/gossipd/gossip_store.c @@ -20,6 +20,9 @@ #define GOSSIP_STORE_VER ((0 << 5) | 13) struct gossip_store { + /* Back pointer. */ + struct daemon *daemon; + /* This is false when we're loading */ bool writable; @@ -29,10 +32,6 @@ struct gossip_store { /* Offset of current EOF */ u64 len; - /* Handle to the routing_state to retrieve additional information, - * should it be needed */ - struct routing_state *rstate; - /* Timestamp of store when we opened it (0 if we created it) */ u32 timestamp; }; @@ -107,7 +106,7 @@ static bool can_upgrade(u8 oldversion) /* On upgrade, do best effort on private channels: hand them to * lightningd as if we just receive them, before removing from the * store */ -static void give_lightningd_canned_private_update(struct routing_state *rstate, +static void give_lightningd_canned_private_update(struct daemon *daemon, const u8 *msg) { u8 *update; @@ -143,7 +142,7 @@ static void give_lightningd_canned_private_update(struct routing_state *rstate, } /* From NULL source (i.e. trust us!) */ - tell_lightningd_peer_update(rstate->daemon, + tell_lightningd_peer_update(daemon, NULL, short_channel_id, fee_base_msat, @@ -154,7 +153,7 @@ static void give_lightningd_canned_private_update(struct routing_state *rstate, } static bool upgrade_field(u8 oldversion, - struct routing_state *rstate, + struct daemon *daemon, u8 **msg) { int type = fromwire_peektype(*msg); @@ -172,7 +171,7 @@ static bool upgrade_field(u8 oldversion, if (type == WIRE_GOSSIP_STORE_PRIVATE_CHANNEL_OBS) { *msg = tal_free(*msg); } else if (type == WIRE_GOSSIP_STORE_PRIVATE_UPDATE_OBS) { - give_lightningd_canned_private_update(rstate, *msg); + give_lightningd_canned_private_update(daemon, *msg); *msg = tal_free(*msg); } } @@ -182,7 +181,7 @@ static bool upgrade_field(u8 oldversion, /* Read gossip store entries, copy non-deleted ones. This code is written * as simply and robustly as possible! */ -static u32 gossip_store_compact_offline(struct routing_state *rstate) +static u32 gossip_store_compact_offline(struct daemon *daemon) { size_t count = 0, deleted = 0; int old_fd, new_fd; @@ -251,7 +250,7 @@ static u32 gossip_store_compact_offline(struct routing_state *rstate) } if (oldversion != version) { - if (!upgrade_field(oldversion, rstate, &msg)) { + if (!upgrade_field(oldversion, daemon, &msg)) { tal_free(msg); goto close_and_delete; } @@ -314,17 +313,17 @@ close_old: return 0; } -struct gossip_store *gossip_store_new(struct routing_state *rstate) +struct gossip_store *gossip_store_new(struct daemon *daemon) { - struct gossip_store *gs = tal(rstate, struct gossip_store); + struct gossip_store *gs = tal(daemon, struct gossip_store); gs->writable = true; - gs->timestamp = gossip_store_compact_offline(rstate); + gs->timestamp = gossip_store_compact_offline(daemon); gs->fd = open(GOSSIP_STORE_FILENAME, O_RDWR|O_CREAT, 0600); if (gs->fd < 0) status_failed(STATUS_FAIL_INTERNAL_ERROR, "Opening gossip_store store: %s", strerror(errno)); - gs->rstate = rstate; + gs->daemon = daemon; gs->len = sizeof(gs->version); tal_add_destructor(gs, gossip_store_destroy); @@ -654,7 +653,7 @@ int gossip_store_readonly_fd(struct gossip_store *gs) return fd; } -u32 gossip_store_load(struct routing_state *rstate, struct gossip_store *gs) +u32 gossip_store_load(struct gossip_store *gs) { struct gossip_hdr hdr; u32 msglen, checksum; @@ -703,7 +702,7 @@ u32 gossip_store_load(struct routing_state *rstate, struct gossip_store *gs) /* Previous channel_announcement may have been deleted */ if (!chan_ann) break; - if (!routing_add_channel_announcement(rstate, + if (!routing_add_channel_announcement(gs->daemon->rstate, take(chan_ann), satoshis, chan_ann_off, @@ -731,11 +730,11 @@ u32 gossip_store_load(struct routing_state *rstate, struct gossip_store *gs) bad = "Bad gossip_store_chan_dying"; goto badmsg; } - remember_chan_dying(rstate, &scid, deadline, gs->len); + remember_chan_dying(gs->daemon->rstate, &scid, deadline, gs->len); break; } case WIRE_CHANNEL_UPDATE: - if (!routing_add_channel_update(rstate, + if (!routing_add_channel_update(gs->daemon->rstate, take(msg), gs->len, NULL, false, spam, false)) { @@ -745,7 +744,7 @@ u32 gossip_store_load(struct routing_state *rstate, struct gossip_store *gs) stats[1]++; break; case WIRE_NODE_ANNOUNCEMENT: - if (!routing_add_node_announcement(rstate, + if (!routing_add_node_announcement(gs->daemon->rstate, take(msg), gs->len, NULL, NULL, spam)) { /* FIXME: This has been reported: routing.c @@ -770,7 +769,7 @@ u32 gossip_store_load(struct routing_state *rstate, struct gossip_store *gs) goto corrupt; } - bad = unfinalized_entries(tmpctx, rstate); + bad = unfinalized_entries(tmpctx, gs->daemon->rstate); if (bad) goto corrupt; @@ -790,7 +789,7 @@ corrupt: if (gs->fd < 0 || !write_all(gs->fd, &gs->version, sizeof(gs->version))) status_failed(STATUS_FAIL_INTERNAL_ERROR, "Truncating new store file: %s", strerror(errno)); - remove_all_gossip(rstate); + remove_all_gossip(gs->daemon->rstate); gs->len = 1; gs->timestamp = 0; out: diff --git a/gossipd/gossip_store.h b/gossipd/gossip_store.h index 8a4752ba0..f0d95cf0f 100644 --- a/gossipd/gossip_store.h +++ b/gossipd/gossip_store.h @@ -16,17 +16,16 @@ struct gossip_store; struct routing_state; -struct gossip_store *gossip_store_new(struct routing_state *rstate); +struct gossip_store *gossip_store_new(struct daemon *daemon); /** * Load the initial gossip store, if any. * - * @param rstate The routing state to load init. * @param gs The `gossip_store` to read from * * Returns the last-modified time of the store, or 0 if it was created new. */ -u32 gossip_store_load(struct routing_state *rstate, struct gossip_store *gs); +u32 gossip_store_load(struct gossip_store *gs); /** * Add a gossip message to the gossip_store (and optional addendum) diff --git a/gossipd/gossipd.c b/gossipd/gossipd.c index c8a1adc48..e8ba5fa77 100644 --- a/gossipd/gossipd.c +++ b/gossipd/gossipd.c @@ -668,7 +668,7 @@ static void gossip_init(struct daemon *daemon, const u8 *msg) dev_fast_gossip_prune); /* Load stored gossip messages, get last modified time of file */ - timestamp = gossip_store_load(daemon->rstate, daemon->rstate->gs); + timestamp = gossip_store_load(daemon->rstate->gs); /* If last_timestamp was > modified time of file, reduce it. * Usually it's capped to "now", but in the reload case it needs to diff --git a/gossipd/routing.c b/gossipd/routing.c index cd7fcc24e..f7192591b 100644 --- a/gossipd/routing.c +++ b/gossipd/routing.c @@ -259,7 +259,7 @@ struct routing_state *new_routing_state(const tal_t *ctx, struct routing_state *rstate = tal(ctx, struct routing_state); rstate->daemon = daemon; rstate->nodes = new_node_map(rstate); - rstate->gs = gossip_store_new(rstate); + rstate->gs = gossip_store_new(daemon); rstate->last_timestamp = 0; rstate->dying_channels = tal_arr(rstate, struct dying_channel, 0); diff --git a/gossipd/test/run-txout_failure.c b/gossipd/test/run-txout_failure.c index 70b079ff9..017523fd6 100644 --- a/gossipd/test/run-txout_failure.c +++ b/gossipd/test/run-txout_failure.c @@ -31,7 +31,7 @@ bool blinding_next_pubkey(const struct pubkey *pk UNNEEDED, /* AUTOGENERATED MOCKS END */ /* NOOP stub for gossip_store_new */ -struct gossip_store *gossip_store_new(struct routing_state *rstate UNNEEDED) +struct gossip_store *gossip_store_new(struct daemon *daemon UNNEEDED) { return NULL; }