diff --git a/connectd/connectd.c b/connectd/connectd.c index b5b27e2d4..510fe67e5 100644 --- a/connectd/connectd.c +++ b/connectd/connectd.c @@ -1743,18 +1743,10 @@ static void try_connect_peer(struct daemon *daemon, struct wireaddr_internal *addrs; bool use_proxy = daemon->always_use_proxy; struct connecting *connect; - struct peer *existing; - /* Already existing? */ - existing = peer_htable_get(&daemon->peers, id); - if (existing) { - /* FIXME: Tell it it's already connected so it doesn't - * wait forever. */ - daemon_conn_send(daemon->master, - take(towire_connectd_peer_already_connected - (NULL, id))); + /* Already existing? Must have crossed over, it'll know soon. */ + if (peer_htable_get(&daemon->peers, id)) return; - } /* If we're trying to connect it right now, that's OK. */ if ((connect = find_connecting(daemon, id))) { @@ -1826,8 +1818,7 @@ static void try_connect_peer(struct daemon *daemon, tal_add_destructor(connect, destroy_connecting); /* Now we kick it off by recursively trying connect->addrs[connect->addrnum] */ - if (!existing) - try_connect_one_addr(connect); + try_connect_one_addr(connect); } /* lightningd tells us to connect to a peer by id, with optional addr hint. */ @@ -1967,7 +1958,6 @@ static struct io_plan *recv_req(struct io_conn *conn, case WIRE_CONNECTD_INIT_REPLY: case WIRE_CONNECTD_ACTIVATE_REPLY: case WIRE_CONNECTD_PEER_CONNECTED: - case WIRE_CONNECTD_PEER_ALREADY_CONNECTED: case WIRE_CONNECTD_PEER_ACTIVE: case WIRE_CONNECTD_CONNECT_FAILED: case WIRE_CONNECTD_DEV_MEMLEAK_REPLY: diff --git a/connectd/connectd_wire.csv b/connectd/connectd_wire.csv index c7859ccb5..740c86a30 100644 --- a/connectd/connectd_wire.csv +++ b/connectd/connectd_wire.csv @@ -95,10 +95,6 @@ msgdata,connectd_peer_final_msg,id,node_id, msgdata,connectd_peer_final_msg,len,u16, msgdata,connectd_peer_final_msg,msg,u8,len -# connectd->master: You said to connect, but we already were. -msgtype,connectd_peer_already_connected,2007 -msgdata,connectd_peer_already_connected,id,node_id, - # master -> connectd: do you have a memleak? msgtype,connectd_dev_memleak,2033 diff --git a/lightningd/connect_control.c b/lightningd/connect_control.c index 1da9b0d2f..d3e80a0a4 100644 --- a/lightningd/connect_control.c +++ b/lightningd/connect_control.c @@ -183,6 +183,7 @@ static struct command_result *json_connect(struct command *cmd, struct wireaddr_internal *addr; const char *err_msg; struct id_and_addr id_addr; + struct peer *peer; id_addr.host = NULL; id_addr.port = NULL; @@ -214,7 +215,18 @@ static struct command_result *json_connect(struct command *cmd, "Can't specify port without host"); } - try_connect(cmd, cmd->ld, &id_addr.id, 0, addr); + /* If we know about peer, see if it's already connected. */ + peer = peer_by_id(cmd->ld, &id_addr.id); + if (peer && peer->is_connected) { + log_debug(cmd->ld->log, "Already connected via %s", + type_to_string(tmpctx, struct wireaddr_internal, + &peer->addr)); + return connect_cmd_succeed(cmd, peer, + peer->connected_incoming, + &peer->addr); + } + + try_connect(cmd, cmd->ld, &id_addr.id, 0, addr); /* Leave this here for peer_connected or connect_failed. */ new_connect(cmd->ld, &id_addr.id, cmd); @@ -371,21 +383,6 @@ void connect_succeeded(struct lightningd *ld, const struct peer *peer, } } -static void peer_already_connected(struct lightningd *ld, const u8 *msg) -{ - struct node_id id; - struct peer *peer; - - if (!fromwire_connectd_peer_already_connected(msg, &id)) - fatal("Bad msg %s from connectd", tal_hex(tmpctx, msg)); - - peer = peer_by_id(ld, &id); - if (peer) - connect_succeeded(ld, peer, - peer->connected_incoming, - &peer->addr); -} - struct custommsg_payload { struct node_id peer_id; u8 *msg; @@ -481,10 +478,6 @@ static unsigned connectd_msg(struct subd *connectd, const u8 *msg, const int *fd peer_disconnect_done(connectd->ld, msg); break; - case WIRE_CONNECTD_PEER_ALREADY_CONNECTED: - peer_already_connected(connectd->ld, msg); - break; - case WIRE_CONNECTD_CONNECT_FAILED: connect_failed(connectd->ld, msg); break; @@ -508,7 +501,6 @@ static void connect_init_done(struct subd *connectd, struct lightningd *ld = connectd->ld; char *errmsg; - log_debug(connectd->log, "connectd_init_done"); if (!fromwire_connectd_init_reply(ld, reply, &ld->binding, &ld->announceable,