gossipd: make gossip_store hold daemon ptr, not rstate.

Makes it easier to wean off routing.c.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
Rusty Russell 2024-01-31 14:56:33 +10:30
parent 7f5fe52320
commit 8cfbc1e7ad
5 changed files with 25 additions and 27 deletions

View File

@ -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:

View File

@ -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)

View File

@ -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

View File

@ -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);

View File

@ -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;
}