mirror of
https://github.com/ElementsProject/lightning.git
synced 2025-03-01 17:47:30 +01:00
connectd: use io_wait, instead of creating boutique list.
Not sure what I was thinking with all this code :( Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
parent
d1552bd1eb
commit
cfd54d67cb
1 changed files with 7 additions and 48 deletions
|
@ -87,9 +87,6 @@ struct daemon {
|
||||||
/* Peers we know of */
|
/* Peers we know of */
|
||||||
struct pubkey_set peers;
|
struct pubkey_set peers;
|
||||||
|
|
||||||
/* Peers reconnecting now (waiting for current peer to die). */
|
|
||||||
struct list_head reconnecting;
|
|
||||||
|
|
||||||
/* Peers we are trying to reach */
|
/* Peers we are trying to reach */
|
||||||
struct list_head reaching;
|
struct list_head reaching;
|
||||||
|
|
||||||
|
@ -146,9 +143,6 @@ struct reaching {
|
||||||
/* This is a transitory structure: we hand off to the master daemon as soon
|
/* This is a transitory structure: we hand off to the master daemon as soon
|
||||||
* as we've completed INIT read/write. */
|
* as we've completed INIT read/write. */
|
||||||
struct peer {
|
struct peer {
|
||||||
/* For reconnecting peers, this is in daemon->reconnecting. */
|
|
||||||
struct list_node list;
|
|
||||||
|
|
||||||
struct daemon *daemon;
|
struct daemon *daemon;
|
||||||
|
|
||||||
/* The ID of the peer */
|
/* The ID of the peer */
|
||||||
|
@ -170,34 +164,6 @@ struct peer {
|
||||||
/* Mutual recursion */
|
/* Mutual recursion */
|
||||||
static void try_reach_one_addr(struct reaching *reach);
|
static void try_reach_one_addr(struct reaching *reach);
|
||||||
|
|
||||||
static struct peer *find_reconnecting_peer(struct daemon *daemon,
|
|
||||||
const struct pubkey *id)
|
|
||||||
{
|
|
||||||
struct peer *peer;
|
|
||||||
|
|
||||||
list_for_each(&daemon->reconnecting, peer, list)
|
|
||||||
if (pubkey_eq(&peer->id, id))
|
|
||||||
return peer;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void destroy_reconnecting_peer(struct peer *peer)
|
|
||||||
{
|
|
||||||
list_del_from(&peer->daemon->reconnecting, &peer->list);
|
|
||||||
/* This is safe even if we're being destroyed because of peer->conn,
|
|
||||||
* since tal_free protects against loops. */
|
|
||||||
io_close(peer->conn);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void add_reconnecting_peer(struct daemon *daemon, struct peer *peer)
|
|
||||||
{
|
|
||||||
/* Drop any previous connecting peer */
|
|
||||||
tal_free(find_reconnecting_peer(peer->daemon, &peer->id));
|
|
||||||
|
|
||||||
list_add_tail(&daemon->reconnecting, &peer->list);
|
|
||||||
tal_add_destructor(peer, destroy_reconnecting_peer);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Some ISP resolvers will reply with a dummy IP to queries that would otherwise
|
* Some ISP resolvers will reply with a dummy IP to queries that would otherwise
|
||||||
* result in an NXDOMAIN reply. This just checks whether we have one such
|
* result in an NXDOMAIN reply. This just checks whether we have one such
|
||||||
|
@ -327,10 +293,6 @@ static struct io_plan *retry_peer_connected(struct io_conn *conn,
|
||||||
status_trace("peer %s: processing now old peer gone",
|
status_trace("peer %s: processing now old peer gone",
|
||||||
type_to_string(tmpctx, struct pubkey, &peer->id));
|
type_to_string(tmpctx, struct pubkey, &peer->id));
|
||||||
|
|
||||||
/* Clean up reconnecting state, try again */
|
|
||||||
list_del_from(&peer->daemon->reconnecting, &peer->list);
|
|
||||||
tal_del_destructor(peer, destroy_reconnecting_peer);
|
|
||||||
|
|
||||||
return peer_connected(conn, peer);
|
return peer_connected(conn, peer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -339,17 +301,18 @@ static struct io_plan *peer_connected(struct io_conn *conn, struct peer *peer)
|
||||||
struct daemon *daemon = peer->daemon;
|
struct daemon *daemon = peer->daemon;
|
||||||
u8 *msg;
|
u8 *msg;
|
||||||
int gossip_fd;
|
int gossip_fd;
|
||||||
|
struct pubkey *key;
|
||||||
|
|
||||||
/* FIXME: We could do this before exchanging init msgs. */
|
/* FIXME: We could do this before exchanging init msgs. */
|
||||||
if (pubkey_set_get(&daemon->peers, &peer->id)) {
|
key = pubkey_set_get(&daemon->peers, &peer->id);
|
||||||
|
if (key) {
|
||||||
status_trace("peer %s: reconnect",
|
status_trace("peer %s: reconnect",
|
||||||
type_to_string(tmpctx, struct pubkey, &peer->id));
|
type_to_string(tmpctx, struct pubkey, &peer->id));
|
||||||
|
|
||||||
/* Tell master to kill it: will send peer_disconnect */
|
/* Tell master to kill it: will send peer_disconnect */
|
||||||
msg = towire_connect_reconnected(NULL, &peer->id);
|
msg = towire_connect_reconnected(NULL, &peer->id);
|
||||||
daemon_conn_send(&daemon->master, take(msg));
|
daemon_conn_send(&daemon->master, take(msg));
|
||||||
add_reconnecting_peer(daemon, peer);
|
return io_wait(conn, key, retry_peer_connected, peer);
|
||||||
return io_wait(conn, peer, retry_peer_connected, peer);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
reached_peer(peer, conn);
|
reached_peer(peer, conn);
|
||||||
|
@ -1210,7 +1173,6 @@ static struct io_plan *peer_disconnected(struct io_conn *conn,
|
||||||
struct daemon *daemon, const u8 *msg)
|
struct daemon *daemon, const u8 *msg)
|
||||||
{
|
{
|
||||||
struct pubkey id, *key;
|
struct pubkey id, *key;
|
||||||
struct peer *peer;
|
|
||||||
|
|
||||||
if (!fromwire_connectctl_peer_disconnected(msg, &id))
|
if (!fromwire_connectctl_peer_disconnected(msg, &id))
|
||||||
master_badmsg(WIRE_CONNECTCTL_PEER_DISCONNECTED, msg);
|
master_badmsg(WIRE_CONNECTCTL_PEER_DISCONNECTED, msg);
|
||||||
|
@ -1221,16 +1183,14 @@ static struct io_plan *peer_disconnected(struct io_conn *conn,
|
||||||
"peer_disconnected unknown peer: %s",
|
"peer_disconnected unknown peer: %s",
|
||||||
type_to_string(tmpctx, struct pubkey, &id));
|
type_to_string(tmpctx, struct pubkey, &id));
|
||||||
pubkey_set_del(&daemon->peers, key);
|
pubkey_set_del(&daemon->peers, key);
|
||||||
|
|
||||||
|
/* Wake up in case there's a reconnecting peer waiting. */
|
||||||
|
io_wake(key);
|
||||||
tal_free(key);
|
tal_free(key);
|
||||||
|
|
||||||
status_trace("Forgetting peer %s",
|
status_trace("Forgetting peer %s",
|
||||||
type_to_string(tmpctx, struct pubkey, &id));
|
type_to_string(tmpctx, struct pubkey, &id));
|
||||||
|
|
||||||
/* If there was a connecting peer waiting, wake it now */
|
|
||||||
peer = find_reconnecting_peer(daemon, &id);
|
|
||||||
if (peer)
|
|
||||||
io_wake(peer);
|
|
||||||
|
|
||||||
return daemon_conn_read_next(conn, &daemon->master);
|
return daemon_conn_read_next(conn, &daemon->master);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1297,7 +1257,6 @@ int main(int argc, char *argv[])
|
||||||
|
|
||||||
daemon = tal(NULL, struct daemon);
|
daemon = tal(NULL, struct daemon);
|
||||||
pubkey_set_init(&daemon->peers);
|
pubkey_set_init(&daemon->peers);
|
||||||
list_head_init(&daemon->reconnecting);
|
|
||||||
list_head_init(&daemon->reaching);
|
list_head_init(&daemon->reaching);
|
||||||
daemon->listen_fds = tal_arr(daemon, struct listen_fd, 0);
|
daemon->listen_fds = tal_arr(daemon, struct listen_fd, 0);
|
||||||
/* stdin == control */
|
/* stdin == control */
|
||||||
|
|
Loading…
Add table
Reference in a new issue