diff --git a/gossipd/gossipd.c b/gossipd/gossipd.c index 457b9e7fa..db3079498 100644 --- a/gossipd/gossipd.c +++ b/gossipd/gossipd.c @@ -816,9 +816,15 @@ static struct io_plan *gossip_init(struct io_conn *conn, dev_fast_gossip, dev_fast_gossip_prune); - /* Load stored gossip messages */ + /* Load stored gossip messages, get last modified time of file */ timestamp = gossip_store_load(daemon->rstate, 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 + * be the gossip_store mtime. */ + if (daemon->rstate->last_timestamp > timestamp) + daemon->rstate->last_timestamp = timestamp; + /* Now disable all local channels, they can't be connected yet. */ gossip_disable_local_channels(daemon); @@ -832,7 +838,7 @@ static struct io_plan *gossip_init(struct io_conn *conn, gossip_refresh_network, daemon)); /* Fire up the seeker! */ - daemon->seeker = new_seeker(daemon, timestamp); + daemon->seeker = new_seeker(daemon); return daemon_conn_read_next(conn, daemon->master); } diff --git a/gossipd/routing.c b/gossipd/routing.c index a93301f8e..65774e4e1 100644 --- a/gossipd/routing.c +++ b/gossipd/routing.c @@ -298,6 +298,7 @@ struct routing_state *new_routing_state(const tal_t *ctx, rstate->chainparams = chainparams; rstate->local_id = *local_id; rstate->local_channel_announced = false; + rstate->last_timestamp = 0; pending_cannouncement_map_init(&rstate->pending_cannouncements); @@ -2183,6 +2184,10 @@ bool routing_add_channel_update(struct routing_state *rstate, = gossip_store_add(rstate->gs, update, hc->bcast.timestamp, NULL); + if (hc->bcast.timestamp > rstate->last_timestamp + && hc->bcast.timestamp < time_now().ts.tv_sec) + rstate->last_timestamp = hc->bcast.timestamp; + peer_supplied_good_gossip(peer, 1); } @@ -2504,6 +2509,10 @@ bool routing_add_node_announcement(struct routing_state *rstate, WIRE_NODE_ANNOUNCEMENT); node->bcast.timestamp = timestamp; + if (node->bcast.timestamp > rstate->last_timestamp + && node->bcast.timestamp < time_now().ts.tv_sec) + rstate->last_timestamp = node->bcast.timestamp; + if (index) node->bcast.index = index; else { diff --git a/gossipd/routing.h b/gossipd/routing.h index 8debf1251..44ac63761 100644 --- a/gossipd/routing.h +++ b/gossipd/routing.h @@ -292,6 +292,9 @@ struct routing_state { /* A map of local channels by short_channel_ids */ struct local_chan_map local_chan_map; + /* Highest timestamp of gossip we accepted (before now) */ + u32 last_timestamp; + #if DEVELOPER /* Override local time for gossip messages */ struct timeabs *gossip_time; diff --git a/gossipd/seeker.c b/gossipd/seeker.c index 2709abebd..5894658f4 100644 --- a/gossipd/seeker.c +++ b/gossipd/seeker.c @@ -85,9 +85,6 @@ struct seeker { /* Range of scid blocks we've probed. */ size_t scid_probe_start, scid_probe_end; - /* Timestamp of gossip store (or 0). */ - u32 last_gossip_timestamp; - /* During startup, we ask a single peer for gossip. */ struct peer *random_peer_softref; @@ -136,14 +133,13 @@ static void set_state_(struct seeker *seeker, enum seeker_state state, seeker->state = state; } -struct seeker *new_seeker(struct daemon *daemon, u32 timestamp) +struct seeker *new_seeker(struct daemon *daemon) { struct seeker *seeker = tal(daemon, struct seeker); seeker->daemon = daemon; scid_map_init(&seeker->unknown_scids); stale_scid_map_init(&seeker->stale_scids); - seeker->last_gossip_timestamp = timestamp; seeker->random_peer_softref = NULL; for (size_t i = 0; i < ARRAY_SIZE(seeker->gossiper_softref); i++) seeker->gossiper_softref[i] = NULL; @@ -202,12 +198,15 @@ static void disable_gossip_stream(struct seeker *seeker, struct peer *peer) static void enable_gossip_stream(struct seeker *seeker, struct peer *peer) { - u32 start; + /* We seek some way back, to take into account propagation time */ + const u32 polltime = GOSSIP_SEEKER_INTERVAL(seeker) * 10; + u32 start = seeker->daemon->rstate->last_timestamp; u8 *msg; - /* FIXME: gets the last minute of gossip, works around our current - * lack of discovery if we're missing gossip. */ - start = time_now().ts.tv_sec - 60; + if (start > polltime) + start -= polltime; + else + start = 0; status_debug("seeker: starting gossip from %s", type_to_string(tmpctx, struct node_id, &peer->id)); @@ -265,23 +264,8 @@ static struct short_channel_id *unknown_scids_arr(const tal_t *ctx, /* We have selected this peer to stream us startup gossip */ static void peer_gossip_startup(struct seeker *seeker, struct peer *peer) { - const u32 polltime = GOSSIP_SEEKER_INTERVAL(seeker); - u8 *msg; - u32 start; - - if (seeker->last_gossip_timestamp < polltime) - start = 0; - else - start = seeker->last_gossip_timestamp - polltime; - selected_peer(seeker, peer); - - status_debug("seeker: startup gossip from t=%u from %s", - start, type_to_string(tmpctx, struct node_id, &peer->id)); - msg = towire_gossip_timestamp_filter(NULL, - &peer->daemon->chain_hash, - start, UINT32_MAX); - queue_peer_msg(peer, take(msg)); + normal_gossip_start(seeker, peer); } static bool peer_has_gossip_queries(const struct peer *peer) diff --git a/gossipd/seeker.h b/gossipd/seeker.h index 7633725d2..556178c41 100644 --- a/gossipd/seeker.h +++ b/gossipd/seeker.h @@ -6,7 +6,7 @@ struct daemon; struct peer; struct short_channel_id; -struct seeker *new_seeker(struct daemon *daemon, u32 timestamp); +struct seeker *new_seeker(struct daemon *daemon); void query_unknown_channel(struct daemon *daemon, struct peer *peer,