splice: Clean up error messages for RPC

Added and updated error messages when splicing to make it more clear to the user why a splice is failing.

Changelog-Changed: Improved error messaging for splice commands.
This commit is contained in:
Dusty Daemon 2024-10-04 15:14:21 -04:00 committed by Rusty Russell
parent 2bf1053cdb
commit 4b3643d209
3 changed files with 42 additions and 8 deletions

View File

@ -235,14 +235,15 @@ static void end_stfu_mode(struct peer *peer)
status_debug("Left STFU mode.");
}
static void maybe_send_stfu(struct peer *peer)
static bool maybe_send_stfu(struct peer *peer)
{
if (!peer->want_stfu)
return;
return false;
if (pending_updates(peer->channel, LOCAL, false)) {
status_info("Pending updates prevent us from STFU mode at this"
" time.");
return false;
}
else if (!peer->stfu_sent[LOCAL]) {
status_debug("Sending peer that we want to STFU.");
@ -269,6 +270,8 @@ static void maybe_send_stfu(struct peer *peer)
peer->on_stfu_success = NULL;
}
}
return true;
}
/* Durring reestablish, STFU mode is assumed if continuing a splice */
@ -1666,7 +1669,7 @@ static bool have_they_signed_inflight(const struct peer *peer,
return has_sig;
}
/* this checks if local has signed everything buy the funding input */
/* This checks if local has signed everything but the funding input */
static bool missing_user_signatures(const struct peer *peer,
const struct inflight *inflight)
{
@ -3387,7 +3390,7 @@ static void resume_splice_negotiation(struct peer *peer,
&inws),
&their_txsigs_tlvs))
peer_failed_warn(peer->pps, &peer->channel_id,
"Splicing bad tx_signatures %s",
"Splicing bad tx_signatures msg %s",
tal_hex(msg, msg));
if (peer->splicing)
@ -4296,7 +4299,16 @@ static void handle_stfu_req(struct peer *peer, const u8 *inmsg)
peer->stfu_initiator = LOCAL;
peer->want_stfu = true;
maybe_send_stfu(peer);
if (!maybe_send_stfu(peer)) {
msg = towire_channeld_splice_state_error(NULL, tal_fmt(tmpctx,
"Pending updates"
" prevent us from STFU"
" mode at this"
" time."));
wire_sync_write(MASTER_FD, take(msg));
return;
}
}
static void handle_abort_req(struct peer *peer, const u8 *inmsg)

View File

@ -84,6 +84,7 @@ enum jsonrpc_errcode {
SPLICE_LOW_FEE = 359,
SPLICE_HIGH_FEE = 360,
SPLICE_ABORT = 362,
SPLICE_CHANNEL_ERROR = 363,
/* `connect` errors */
CONNECT_NO_KNOWN_ADDRESS = 400,

View File

@ -1625,6 +1625,27 @@ static unsigned channel_msg(struct subd *sd, const u8 *msg, const int *fds)
return 0;
}
/* If we get a disconnecting warning or error during a splice command, let
* the user know out of an abundance of politeness.
* After, we forward the event onto the standard `channel_errmsg`. */
static void channel_control_errmsg(struct channel *channel,
struct peer_fd *peer_fd,
const char *desc,
const u8 *err_for_them,
bool disconnect,
bool warning)
{
struct lightningd *ld = channel->peer->ld;
struct splice_command *cc = splice_command_for_chan(ld, channel);
if (cc && disconnect) {
was_pending(command_fail(cc->cmd, SPLICE_CHANNEL_ERROR,
"Splice command failed:"
" %s", desc));
}
channel_errmsg(channel, peer_fd, desc, err_for_them, disconnect, warning);
}
bool peer_start_channeld(struct channel *channel,
struct peer_fd *peer_fd,
const u8 *fwd_msg,
@ -1674,7 +1695,7 @@ bool peer_start_channeld(struct channel *channel,
channel->log, true,
channeld_wire_name,
channel_msg,
channel_errmsg,
channel_control_errmsg,
channel_set_billboard,
take(&peer_fd->fd),
take(&hsmfd), NULL));
@ -2139,9 +2160,9 @@ static struct command_result *channel_for_splice(struct command *cmd,
if (!feature_negotiated(cmd->ld->our_features,
(*channel)->peer->their_features,
OPT_EXPERIMENTAL_SPLICE))
OPT_SPLICE))
return command_fail(cmd, SPLICE_NOT_SUPPORTED,
"splicing not supported");
"Peer does not support splicing");
if (!(*channel)->owner)
return command_fail(cmd, SPLICE_WRONG_OWNER,