gossipd: hand a gossip_store_fd to all subdaemons.

This will let them read from the gossip store directly.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
Rusty Russell
2019-05-04 15:23:13 +09:30
parent eaac0d7105
commit 13717c6ebb
24 changed files with 114 additions and 61 deletions

View File

@@ -277,12 +277,17 @@ static void connected_to_peer(struct daemon *daemon,
* it to forward gossip to/from the peer. The gossip daemon needs to know a
* few of the features of the peer and its id (for reporting).
*
* Every peer also has read-only access to the gossip_store, which is handed
* out by gossipd too.
*
* The 'localfeatures' is a field in the `init` message, indicating properties
* when you're connected to it like we are: there are also 'globalfeatures'
* which specify requirements to route a payment through a node. */
static int get_gossipfd(struct daemon *daemon,
const struct node_id *id,
const u8 *localfeatures)
static bool get_gossipfds(struct daemon *daemon,
const struct node_id *id,
const u8 *localfeatures,
int *gossip_fd,
int *gossip_store_fd)
{
bool gossip_queries_feature, initial_routing_sync, success;
u8 *msg;
@@ -318,12 +323,14 @@ static int get_gossipfd(struct daemon *daemon,
if (!success) {
status_broken("Gossipd did not give us an fd: losing peer %s",
type_to_string(tmpctx, struct node_id, id));
return -1;
return false;
}
/* Otherwise, the next thing in the socket will be the file descriptor
/* Otherwise, the next thing in the socket will be the file descriptors
* for the per-peer daemon. */
return fdpass_recv(GOSSIPCTL_FD);
*gossip_fd = fdpass_recv(GOSSIPCTL_FD);
*gossip_store_fd = fdpass_recv(GOSSIPCTL_FD);
return true;
}
/*~ This is an ad-hoc marshalling structure where we store arguments so we
@@ -407,7 +414,7 @@ struct io_plan *peer_connected(struct io_conn *conn,
const u8 *peer_connected_msg TAKES,
const u8 *localfeatures TAKES)
{
int gossip_fd;
int gossip_fd, gossip_store_fd;
if (node_set_get(&daemon->peers, id))
return peer_reconnected(conn, daemon, id, peer_connected_msg,
@@ -416,14 +423,12 @@ struct io_plan *peer_connected(struct io_conn *conn,
/* We've successfully connected. */
connected_to_peer(daemon, conn, id);
gossip_fd = get_gossipfd(daemon, id, localfeatures);
/* We promised we'd take it by marking it TAKEN above; simply free it. */
/* We promised we'd take it by marking it TAKEN above; prepare to free it. */
if (taken(localfeatures))
tal_free(localfeatures);
tal_steal(tmpctx, localfeatures);
/* If gossipd can't give us a file descriptor, we give up connecting. */
if (gossip_fd < 0)
if (!get_gossipfds(daemon, id, localfeatures, &gossip_fd, &gossip_store_fd))
return io_close(conn);
/*~ daemon_conn is a message queue for inter-daemon communication: we
@@ -433,6 +438,7 @@ struct io_plan *peer_connected(struct io_conn *conn,
/* io_conn_fd() extracts the fd from ccan/io's io_conn */
daemon_conn_send_fd(daemon->master, io_conn_fd(conn));
daemon_conn_send_fd(daemon->master, gossip_fd);
daemon_conn_send_fd(daemon->master, gossip_store_fd);
/*~ Finally, we add it to the set of pubkeys: tal_dup will handle
* take() args for us, by simply tal_steal()ing it. */