mirror of
https://github.com/aljazceru/lightning.git
synced 2025-12-19 15:14:23 +01:00
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:
@@ -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. */
|
||||
|
||||
Reference in New Issue
Block a user