mirror of
https://github.com/aljazceru/lightning.git
synced 2025-12-19 07:04:22 +01:00
connectd: add counters to each peer connection.
This allows us to detect when lightningd hasn't seen our latest disconnect/reconnect; in particular, we would hit the following pattern: 1. lightningd says to connect a subd. 2. connectd disconnects and reconnects. 3. connectd reads message, connects subd. 4. lightningd reads disconnect and reconnect, sends msg to connect to subd again. 5. connectd asserts because subd is alreacy connected. This way connectd can tell if lightningd is talking about the previous connection, and ignoere it. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
committed by
neil saitug
parent
41b379ed89
commit
d31420211a
@@ -1079,6 +1079,7 @@ static struct io_plan *read_body_from_peer_done(struct io_conn *peer_conn,
|
||||
/* We tell lightningd to fire up a subdaemon to handle this! */
|
||||
daemon_conn_send(peer->daemon->master,
|
||||
take(towire_connectd_peer_spoke(NULL, &peer->id,
|
||||
peer->counter,
|
||||
t,
|
||||
&channel_id)));
|
||||
}
|
||||
@@ -1173,16 +1174,17 @@ struct io_plan *multiplex_peer_setup(struct io_conn *peer_conn,
|
||||
void peer_connect_subd(struct daemon *daemon, const u8 *msg, int fd)
|
||||
{
|
||||
struct node_id id;
|
||||
u64 counter;
|
||||
struct peer *peer;
|
||||
struct channel_id channel_id;
|
||||
struct subd *subd;
|
||||
|
||||
if (!fromwire_connectd_peer_connect_subd(msg, &id, &channel_id))
|
||||
if (!fromwire_connectd_peer_connect_subd(msg, &id, &counter, &channel_id))
|
||||
master_badmsg(WIRE_CONNECTD_PEER_CONNECT_SUBD, msg);
|
||||
|
||||
/* Races can happen: this might be gone by now. */
|
||||
/* Races can happen: this might be gone by now (or reconnected!). */
|
||||
peer = peer_htable_get(&daemon->peers, &id);
|
||||
if (!peer) {
|
||||
if (!peer || peer->counter != counter) {
|
||||
close(fd);
|
||||
return;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user