Skip to content

Commit deddba8

Browse files
committed
connectd: Expand debug message for ping
This should help debug failed ping responses showing up in CI.
1 parent add3cfa commit deddba8

File tree

3 files changed

+51
-6
lines changed

3 files changed

+51
-6
lines changed

common/ping.c

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,12 @@ bool check_ping_make_pong(const tal_t *ctx, const u8 *ping, u8 **pong)
99
u16 num_pong_bytes;
1010
u8 *ignored;
1111

12-
if (!fromwire_ping(ctx, ping, &num_pong_bytes, &ignored))
12+
status_debug("Making a pong!");
13+
14+
if (!fromwire_ping(ctx, ping, &num_pong_bytes, &ignored)) {
15+
status_debug("Failed to make pong -- ping was invalid");
1316
return false;
17+
}
1418
tal_free(ignored);
1519

1620
/* BOLT #1:
@@ -33,8 +37,11 @@ bool check_ping_make_pong(const tal_t *ctx, const u8 *ping, u8 **pong)
3337
ignored = tal_arrz(ctx, u8, num_pong_bytes);
3438
*pong = towire_pong(ctx, ignored);
3539
tal_free(ignored);
36-
} else
40+
} else {
41+
status_debug("Failed to make pong -- num_pong_bytes was"
42+
" too large!");
3743
*pong = NULL;
44+
}
3845

3946
return true;
4047
}
@@ -50,6 +57,8 @@ u8 *make_ping(const tal_t *ctx, u16 num_pong_bytes, u16 padlen)
5057
*/
5158
u8 *ping, *ignored = tal_arrz(ctx, u8, padlen);
5259

60+
status_debug("Making a ping!");
61+
5362
ping = towire_ping(ctx, num_pong_bytes, ignored);
5463
tal_free(ignored);
5564
return ping;

connectd/connectd.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,7 @@ static struct peer *new_peer(struct daemon *daemon,
149149
peer->draining = false;
150150
peer->peer_outq = msg_queue_new(peer, false);
151151
peer->last_recv_time = time_now();
152+
peer->ping_timer = NULL;
152153
peer->is_websocket = is_websocket;
153154
peer->dev_writes_enabled = NULL;
154155
peer->dev_read_enabled = true;

connectd/multiplex.c

Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -440,6 +440,9 @@ static struct io_plan *encrypt_and_send(struct peer *peer,
440440

441441
set_urgent_flag(peer, is_urgent(type));
442442

443+
status_peer_debug(&peer->id, "encrypt_and_send -> io_write %s",
444+
peer_wire_name(type));
445+
443446
/* We free this and the encrypted version in next write_to_peer */
444447
peer->sent_to_peer = cryptomsg_encrypt_msg(peer, &peer->cs, msg);
445448
return io_write(peer->to_peer,
@@ -562,29 +565,46 @@ static void set_ping_timer(struct peer *peer)
562565
peer->ping_timer = NULL;
563566
return;
564567
}
568+
status_peer_debug(&peer->id, "set_ping_timer, peer->ping_timer = %p",
569+
peer->ping_timer);
565570
peer->ping_timer = new_reltimer(&peer->daemon->timers, peer,
566571
time_from_sec(15 + pseudorand(30)),
567572
send_ping, peer);
568573
}
569574

570575
static void send_ping(struct peer *peer)
571576
{
577+
struct timeabs tnow = time_now();
572578
/* If it's still sending us traffic, maybe ping reply is backed up?
573579
* That's OK, ping is just to make sure it's still alive, and clearly
574580
* it is. */
575581
if (time_before(peer->last_recv_time,
576-
timeabs_sub(time_now(), time_from_sec(60)))) {
582+
timeabs_sub(tnow, time_from_sec(60)))) {
577583
/* Already have a ping in flight? */
578584
if (peer->expecting_pong != PONG_UNEXPECTED) {
579-
status_peer_debug(&peer->id, "Last ping unreturned: hanging up");
585+
status_peer_debug(&peer->id, "Last ping unreturned:"
586+
" hanging up, expecting_pong: %d,"
587+
" last_recv_time: %lu seconds,"
588+
" tnow: %lu seconds,"
589+
" tnow - 60: %lu seconds,"
590+
" tnow - last_recv_time: %lu seconds",
591+
peer->expecting_pong,
592+
(long)peer->last_recv_time.ts.tv_sec,
593+
(long)tnow.ts.tv_sec,
594+
(long)timeabs_sub(tnow, time_from_sec(60)).ts.tv_sec,
595+
(long)tnow.ts.tv_sec - (long)peer->last_recv_time.ts.tv_sec);
580596
if (peer->to_peer)
581597
io_close(peer->to_peer);
582598
return;
583599
}
584600

601+
status_peer_debug(&peer->id, "Sending a ping");
585602
inject_peer_msg(peer, take(make_ping(NULL, 1, 0)));
586603
peer->expecting_pong = PONG_EXPECTED_PROBING;
587604
}
605+
else {
606+
status_peer_debug(&peer->id, "send_ping (skip) not been 60s yet");
607+
}
588608

589609
set_ping_timer(peer);
590610
}
@@ -617,20 +637,29 @@ static void handle_ping_in(struct peer *peer, const u8 *msg)
617637
{
618638
u8 *pong;
619639

640+
status_peer_debug(&peer->id, "Ping recevied!");
641+
620642
if (!check_ping_make_pong(NULL, msg, &pong)) {
621643
send_warning(peer, "Invalid ping %s", tal_hex(msg, msg));
622644
return;
623645
}
624646

625-
if (pong)
647+
if (pong) {
648+
status_peer_debug(&peer->id, "Sending a pong!");
626649
inject_peer_msg(peer, take(pong));
650+
}
651+
else {
652+
status_peer_debug(&peer->id, "We're NOT sending a pong.. why?");
653+
}
627654
}
628655

629656
static void handle_ping_reply(struct peer *peer, const u8 *msg)
630657
{
631658
u8 *ignored;
632659
size_t i;
633660

661+
status_peer_debug(&peer->id, "Receiving a pong!");
662+
634663
/* We print this out because we asked for pong, so can't spam us... */
635664
if (!fromwire_pong(msg, msg, &ignored))
636665
status_peer_unusual(&peer->id, "Got malformed ping reply %s",
@@ -656,6 +685,8 @@ static void handle_pong_in(struct peer *peer, const u8 *msg)
656685
handle_ping_reply(peer, msg);
657686
/* fall thru */
658687
case PONG_EXPECTED_PROBING:
688+
// TODO: set peer->last_recv_time to time_now() ?
689+
status_peer_debug(&peer->id, "Received and ignored a pong! (probing)");
659690
peer->expecting_pong = PONG_UNEXPECTED;
660691
return;
661692
case PONG_UNEXPECTED:
@@ -1171,6 +1202,8 @@ static struct io_plan *read_body_from_peer_done(struct io_conn *peer_conn,
11711202
/* We got something! */
11721203
peer->last_recv_time = time_now();
11731204

1205+
status_peer_debug(&peer->id, "Setting last_recv_time to now!");
1206+
11741207
/* Don't process packets while we're closing */
11751208
if (peer->draining)
11761209
return next_read(peer_conn, peer);
@@ -1386,6 +1419,8 @@ void send_manual_ping(struct daemon *daemon, const u8 *msg)
13861419
u16 len, num_pong_bytes;
13871420
struct peer *peer;
13881421

1422+
status_debug("Sending a ping manually");
1423+
13891424
if (!fromwire_connectd_ping(msg, &id, &num_pong_bytes, &len))
13901425
master_badmsg(WIRE_CONNECTD_PING, msg);
13911426

@@ -1435,6 +1470,6 @@ void send_manual_ping(struct daemon *daemon, const u8 *msg)
14351470
peer->expecting_pong = PONG_EXPECTED_COMMAND;
14361471

14371472
/* Since we're doing this manually, kill and restart timer. */
1438-
tal_free(peer->ping_timer);
1473+
peer->ping_timer = tal_free(peer->ping_timer);
14391474
set_ping_timer(peer);
14401475
}

0 commit comments

Comments
 (0)