Browse Source

channeld: dump htlc transitions.

Good for debugging.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
ppa-0.6.1
Rusty Russell 8 years ago
parent
commit
b07b1c1690
  1. 47
      lightningd/channel.c
  2. 9
      lightningd/channel.h

47
lightningd/channel.c

@ -51,6 +51,36 @@ static s64 balance_removing_htlc(const struct htlc *htlc, enum side side)
return 0;
}
static void dump_htlc(const struct htlc *htlc, const char *prefix)
{
enum htlc_state remote_state;
if (htlc->state <= RCVD_REMOVE_ACK_REVOCATION)
remote_state = htlc->state + 10;
else
remote_state = htlc->state - 10;
status_trace("%s: HTLC %s %"PRIu64" = %s/%s %s",
prefix,
htlc_owner(htlc) == LOCAL ? "LOCAL" : "REMOTE",
htlc->id,
htlc_state_name(htlc->state),
htlc_state_name(remote_state),
htlc->r ? "FULFILLED" : htlc->fail ? "FAILED" : "");
}
void dump_htlcs(const struct channel *channel, const char *prefix)
{
struct htlc_map_iter it;
const struct htlc *htlc;
for (htlc = htlc_map_first(&channel->htlcs, &it);
htlc;
htlc = htlc_map_next(&channel->htlcs, &it)) {
dump_htlc(htlc, prefix);
}
}
/* Returns up to three arrays:
* committed: HTLCs currently committed.
* pending_removal: HTLCs pending removal (subset of committed)
@ -478,6 +508,7 @@ enum channel_add_err channel_add_htlc(struct channel *channel,
goto out;
}
dump_htlc(htlc, "NEW:");
htlc_map_add(&channel->htlcs, tal_steal(channel, htlc));
e = CHANNEL_ERR_ADD_OK;
@ -546,6 +577,7 @@ enum channel_remove_err channel_fulfill_htlc(struct channel *channel,
htlc->id, htlc_state_name(htlc->state));
return CHANNEL_ERR_HTLC_NOT_IRREVOCABLE;
}
dump_htlc(htlc, "FULFILL:");
return CHANNEL_ERR_REMOVE_OK;
}
@ -582,6 +614,7 @@ enum channel_remove_err channel_fail_htlc(struct channel *channel,
htlc->id, htlc_state_name(htlc->state));
return CHANNEL_ERR_HTLC_NOT_IRREVOCABLE;
}
dump_htlc(htlc, "FAIL:");
return CHANNEL_ERR_REMOVE_OK;
}
@ -644,7 +677,8 @@ static int change_htlcs(struct channel *channel,
enum side sidechanged,
const enum htlc_state *htlc_states,
size_t n_hstates,
const struct htlc ***htlcs)
const struct htlc ***htlcs,
const char *prefix)
{
struct htlc_map_iter it;
struct htlc *h;
@ -657,6 +691,7 @@ static int change_htlcs(struct channel *channel,
for (i = 0; i < n_hstates; i++) {
if (h->state == htlc_states[i]) {
htlc_incstate(channel, h, sidechanged);
dump_htlc(h, prefix);
append_htlc(htlcs, h);
cflags |= (htlc_state_flags(htlc_states[i])
^ htlc_state_flags(h->state));
@ -677,7 +712,7 @@ bool channel_sending_commit(struct channel *channel,
SENT_REMOVE_HTLC };
status_trace("Trying commit");
change = change_htlcs(channel, REMOTE, states, ARRAY_SIZE(states),
htlcs);
htlcs, "sending_commit");
return change & HTLC_REMOTE_F_COMMITTED;
}
@ -692,7 +727,7 @@ bool channel_rcvd_revoke_and_ack(struct channel *channel,
status_trace("Received revoke_and_ack");
change = change_htlcs(channel, LOCAL, states, ARRAY_SIZE(states),
htlcs);
htlcs, "rcvd_revoke_and_ack");
return change & HTLC_LOCAL_F_COMMITTED;
}
@ -706,7 +741,8 @@ bool channel_rcvd_commit(struct channel *channel, const struct htlc ***htlcs)
RCVD_REMOVE_REVOCATION };
status_trace("Received commit");
change = change_htlcs(channel, LOCAL, states, ARRAY_SIZE(states), htlcs);
change = change_htlcs(channel, LOCAL, states, ARRAY_SIZE(states), htlcs,
"rcvd_commit");
return change & HTLC_LOCAL_F_COMMITTED;
}
@ -718,7 +754,8 @@ bool channel_sending_revoke_and_ack(struct channel *channel)
RCVD_ADD_COMMIT,
RCVD_REMOVE_ACK_COMMIT };
status_trace("Sending revoke_and_ack");
change = change_htlcs(channel, REMOTE, states, ARRAY_SIZE(states), NULL);
change = change_htlcs(channel, REMOTE, states, ARRAY_SIZE(states), NULL,
"sending_revoke_and_ack");
return change & HTLC_REMOTE_F_PENDING;
}

9
lightningd/channel.h

@ -367,4 +367,13 @@ bool channel_sending_revoke_and_ack(struct channel *channel);
* If true, we can't send a new commit message.
*/
bool channel_awaiting_revoke_and_ack(const struct channel *channel);
/**
* dump_htlcs: debugging dump of all HTLCs
* @channel: the channel
* @prefix: the prefix to prepend to each line.
*
* Uses status_trace() on every HTLC.
*/
void dump_htlcs(const struct channel *channel, const char *prefix);
#endif /* LIGHTNING_DAEMON_CHANNEL_H */

Loading…
Cancel
Save