gossipd: use gossip_time_now() everywhere.

We've been slack, but it's going to be important for testing
ratelimiting.  And it currently has a minor memory leak.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
Rusty Russell 2019-09-12 09:52:12 +09:30
parent 9aca38b279
commit 2577ad87d5
6 changed files with 23 additions and 12 deletions

View File

@ -743,7 +743,7 @@ bool gossip_store_load(struct routing_state *rstate, struct gossip_store *gs)
goto corrupt; goto corrupt;
/* If last timestamp is within 24 hours, say we're OK. */ /* If last timestamp is within 24 hours, say we're OK. */
contents_ok = (last_timestamp >= time_now().ts.tv_sec - 24*3600); contents_ok = (last_timestamp >= gossip_time_now(rstate).ts.tv_sec - 24*3600);
goto out; goto out;
badmsg: badmsg:

View File

@ -405,15 +405,16 @@ static UNNEEDED bool encoding_end_external_type(u8 **encoded, u8 *type, size_t m
} }
/*~ We have different levels of gossipiness, depending on our needs. */ /*~ We have different levels of gossipiness, depending on our needs. */
static u32 gossip_start(enum gossip_level gossip_level) static u32 gossip_start(const struct routing_state *rstate,
enum gossip_level gossip_level)
{ {
switch (gossip_level) { switch (gossip_level) {
case GOSSIP_HIGH: case GOSSIP_HIGH:
return 0; return 0;
case GOSSIP_MEDIUM: case GOSSIP_MEDIUM:
return time_now().ts.tv_sec - 24 * 3600; return gossip_time_now(rstate).ts.tv_sec - 24 * 3600;
case GOSSIP_LOW: case GOSSIP_LOW:
return time_now().ts.tv_sec; return gossip_time_now(rstate).ts.tv_sec;
case GOSSIP_NONE: case GOSSIP_NONE:
return UINT32_MAX; return UINT32_MAX;
} }
@ -446,7 +447,8 @@ static void setup_gossip_range(struct peer *peer)
/*~ We need to ask for something to start the gossip flowing. */ /*~ We need to ask for something to start the gossip flowing. */
msg = towire_gossip_timestamp_filter(peer, msg = towire_gossip_timestamp_filter(peer,
&peer->daemon->chain_hash, &peer->daemon->chain_hash,
gossip_start(peer->gossip_level), gossip_start(peer->daemon->rstate,
peer->gossip_level),
UINT32_MAX); UINT32_MAX);
queue_peer_msg(peer, take(msg)); queue_peer_msg(peer, take(msg));
} }
@ -484,7 +486,7 @@ static u8 *create_node_announcement(const tal_t *ctx, struct daemon *daemon,
* (to prevent spam), so we only call this once we've announced a channel. */ * (to prevent spam), so we only call this once we've announced a channel. */
static void send_node_announcement(struct daemon *daemon) static void send_node_announcement(struct daemon *daemon)
{ {
u32 timestamp = time_now().ts.tv_sec; u32 timestamp = gossip_time_now(daemon->rstate).ts.tv_sec;
secp256k1_ecdsa_signature sig; secp256k1_ecdsa_signature sig;
u8 *msg, *nannounce, *err; u8 *msg, *nannounce, *err;
struct node *self = get_node(daemon->rstate, &daemon->id); struct node *self = get_node(daemon->rstate, &daemon->id);
@ -1644,7 +1646,7 @@ static void update_local_channel(struct daemon *daemon,
{ {
secp256k1_ecdsa_signature dummy_sig; secp256k1_ecdsa_signature dummy_sig;
u8 *update, *msg; u8 *update, *msg;
u32 timestamp = time_now().ts.tv_sec; u32 timestamp = gossip_time_now(daemon->rstate).ts.tv_sec;
u8 message_flags, channel_flags; u8 message_flags, channel_flags;
/* So valgrind doesn't complain */ /* So valgrind doesn't complain */
@ -2289,7 +2291,7 @@ static void gossip_send_keepalive_update(struct daemon *daemon,
*/ */
static void gossip_refresh_network(struct daemon *daemon) static void gossip_refresh_network(struct daemon *daemon)
{ {
u64 now = time_now().ts.tv_sec; u64 now = gossip_time_now(daemon->rstate).ts.tv_sec;
/* Anything below this highwater mark could be pruned if not refreshed */ /* Anything below this highwater mark could be pruned if not refreshed */
s64 highwater = now - daemon->rstate->prune_timeout / 2; s64 highwater = now - daemon->rstate->prune_timeout / 2;
struct node *n; struct node *n;
@ -2453,7 +2455,7 @@ static struct io_plan *gossip_init(struct io_conn *conn,
&daemon->id, &daemon->id,
update_channel_interval * 2, update_channel_interval * 2,
&daemon->peers, &daemon->peers,
dev_gossip_time); take(dev_gossip_time));
/* Load stored gossip messages */ /* Load stored gossip messages */
if (!gossip_store_load(daemon->rstate, daemon->rstate->gs)) if (!gossip_store_load(daemon->rstate, daemon->rstate->gs))

View File

@ -190,7 +190,7 @@ struct routing_state *new_routing_state(const tal_t *ctx,
const struct node_id *local_id, const struct node_id *local_id,
u32 prune_timeout, u32 prune_timeout,
struct list_head *peers, struct list_head *peers,
const u32 *dev_gossip_time) const u32 *dev_gossip_time TAKES)
{ {
struct routing_state *rstate = tal(ctx, struct routing_state); struct routing_state *rstate = tal(ctx, struct routing_state);
rstate->nodes = new_node_map(rstate); rstate->nodes = new_node_map(rstate);
@ -221,6 +221,9 @@ struct routing_state *new_routing_state(const tal_t *ctx,
tal_add_destructor(rstate, destroy_routing_state); tal_add_destructor(rstate, destroy_routing_state);
memleak_add_helper(rstate, memleak_help_routing_tables); memleak_add_helper(rstate, memleak_help_routing_tables);
if (taken(dev_gossip_time))
tal_free(dev_gossip_time);
return rstate; return rstate;
} }
@ -1481,7 +1484,7 @@ bool routing_add_channel_announcement(struct routing_state *rstate,
uc = tal(rstate, struct unupdated_channel); uc = tal(rstate, struct unupdated_channel);
uc->channel_announce = tal_dup_arr(uc, u8, msg, tal_count(msg), 0); uc->channel_announce = tal_dup_arr(uc, u8, msg, tal_count(msg), 0);
uc->added = time_now(); uc->added = gossip_time_now(rstate);
uc->index = index; uc->index = index;
uc->sat = sat; uc->sat = sat;
uc->scid = scid; uc->scid = scid;

View File

@ -273,7 +273,7 @@ struct routing_state *new_routing_state(const tal_t *ctx,
const struct node_id *local_id, const struct node_id *local_id,
u32 prune_timeout, u32 prune_timeout,
struct list_head *peers, struct list_head *peers,
const u32 *dev_gossip_time); const u32 *dev_gossip_time TAKES);
/** /**
* Add a new bidirectional channel from id1 to id2 with the given * Add a new bidirectional channel from id1 to id2 with the given

View File

@ -157,6 +157,9 @@ bool gossip_store_load(struct routing_state *rstate UNNEEDED, struct gossip_stor
/* Generated stub for gossip_store_readonly_fd */ /* Generated stub for gossip_store_readonly_fd */
int gossip_store_readonly_fd(struct gossip_store *gs UNNEEDED) int gossip_store_readonly_fd(struct gossip_store *gs UNNEEDED)
{ fprintf(stderr, "gossip_store_readonly_fd called!\n"); abort(); } { fprintf(stderr, "gossip_store_readonly_fd called!\n"); abort(); }
/* Generated stub for gossip_time_now */
struct timeabs gossip_time_now(const struct routing_state *rstate UNNEEDED)
{ fprintf(stderr, "gossip_time_now called!\n"); abort(); }
/* Generated stub for got_pong */ /* Generated stub for got_pong */
const char *got_pong(const u8 *pong UNNEEDED, size_t *num_pings_outstanding UNNEEDED) const char *got_pong(const u8 *pong UNNEEDED, size_t *num_pings_outstanding UNNEEDED)
{ fprintf(stderr, "got_pong called!\n"); abort(); } { fprintf(stderr, "got_pong called!\n"); abort(); }

View File

@ -180,6 +180,9 @@ bool gossip_store_load(struct routing_state *rstate UNNEEDED, struct gossip_stor
/* Generated stub for gossip_store_readonly_fd */ /* Generated stub for gossip_store_readonly_fd */
int gossip_store_readonly_fd(struct gossip_store *gs UNNEEDED) int gossip_store_readonly_fd(struct gossip_store *gs UNNEEDED)
{ fprintf(stderr, "gossip_store_readonly_fd called!\n"); abort(); } { fprintf(stderr, "gossip_store_readonly_fd called!\n"); abort(); }
/* Generated stub for gossip_time_now */
struct timeabs gossip_time_now(const struct routing_state *rstate UNNEEDED)
{ fprintf(stderr, "gossip_time_now called!\n"); abort(); }
/* Generated stub for got_pong */ /* Generated stub for got_pong */
const char *got_pong(const u8 *pong UNNEEDED, size_t *num_pings_outstanding UNNEEDED) const char *got_pong(const u8 *pong UNNEEDED, size_t *num_pings_outstanding UNNEEDED)
{ fprintf(stderr, "got_pong called!\n"); abort(); } { fprintf(stderr, "got_pong called!\n"); abort(); }