plugins/bcli: fix leak report when bitcoind goes away.

I shut down bitcoind during a test, and bcli leak reports flooded in.
They're all temporary, but this fixes them.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
Rusty Russell
2023-07-22 13:56:36 +09:30
parent 5190a21d3d
commit 7ddebada90

View File

@@ -179,9 +179,9 @@ static char *args_string(const tal_t *ctx, const char **args)
return ret; return ret;
} }
static char *bcli_args(struct bitcoin_cli *bcli) static char *bcli_args(const tal_t *ctx, struct bitcoin_cli *bcli)
{ {
return args_string(bcli, bcli->args); return args_string(ctx, bcli->args);
} }
/* Only set as destructor once bcli is in current. */ /* Only set as destructor once bcli is in current. */
@@ -216,7 +216,7 @@ static void bcli_failure(struct bitcoin_cli *bcli,
"we have been retrying command for " "we have been retrying command for "
"--bitcoin-retry-timeout=%"PRIu64" seconds; " "--bitcoin-retry-timeout=%"PRIu64" seconds; "
"bitcoind setup or our --bitcoin-* configs broken?", "bitcoind setup or our --bitcoin-* configs broken?",
bcli_args(bcli), bcli_args(tmpctx, bcli),
exitstatus, exitstatus,
bitcoind->error_count, bitcoind->error_count,
(int)bcli->output_bytes, (int)bcli->output_bytes,
@@ -224,7 +224,7 @@ static void bcli_failure(struct bitcoin_cli *bcli,
bitcoind->retry_timeout); bitcoind->retry_timeout);
plugin_log(bcli->cmd->plugin, LOG_UNUSUAL, "%s exited with status %u", plugin_log(bcli->cmd->plugin, LOG_UNUSUAL, "%s exited with status %u",
bcli_args(bcli), exitstatus); bcli_args(tmpctx, bcli), exitstatus);
bitcoind->error_count++; bitcoind->error_count++;
/* Retry in 1 second */ /* Retry in 1 second */
@@ -242,19 +242,19 @@ static void bcli_finished(struct io_conn *conn UNUSED, struct bitcoin_cli *bcli)
if (msec > 10000) if (msec > 10000)
plugin_log(bcli->cmd->plugin, LOG_UNUSUAL, plugin_log(bcli->cmd->plugin, LOG_UNUSUAL,
"bitcoin-cli: finished %s (%"PRIu64" ms)", "bitcoin-cli: finished %s (%"PRIu64" ms)",
bcli_args(bcli), msec); bcli_args(tmpctx, bcli), msec);
assert(bitcoind->num_requests[prio] > 0); assert(bitcoind->num_requests[prio] > 0);
/* FIXME: If we waited for SIGCHILD, this could never hang! */ /* FIXME: If we waited for SIGCHILD, this could never hang! */
while ((ret = waitpid(bcli->pid, &status, 0)) < 0 && errno == EINTR); while ((ret = waitpid(bcli->pid, &status, 0)) < 0 && errno == EINTR);
if (ret != bcli->pid) if (ret != bcli->pid)
plugin_err(bcli->cmd->plugin, "%s %s", bcli_args(bcli), plugin_err(bcli->cmd->plugin, "%s %s", bcli_args(tmpctx, bcli),
ret == 0 ? "not exited?" : strerror(errno)); ret == 0 ? "not exited?" : strerror(errno));
if (!WIFEXITED(status)) if (!WIFEXITED(status))
plugin_err(bcli->cmd->plugin, "%s died with signal %i", plugin_err(bcli->cmd->plugin, "%s died with signal %i",
bcli_args(bcli), bcli_args(tmpctx, bcli),
WTERMSIG(status)); WTERMSIG(status));
/* Implicit nonzero_exit_ok == false */ /* Implicit nonzero_exit_ok == false */
@@ -380,7 +380,7 @@ static struct command_result *command_err_bcli_badjson(struct bitcoin_cli *bcli,
const char *errmsg) const char *errmsg)
{ {
char *err = tal_fmt(bcli, "%s: bad JSON: %s (%.*s)", char *err = tal_fmt(bcli, "%s: bad JSON: %s (%.*s)",
bcli_args(bcli), errmsg, bcli_args(tmpctx, bcli), errmsg,
(int)bcli->output_bytes, bcli->output); (int)bcli->output_bytes, bcli->output);
return command_done_err(bcli->cmd, BCLI_ERROR, err, NULL); return command_done_err(bcli->cmd, BCLI_ERROR, err, NULL);
} }
@@ -537,7 +537,7 @@ static struct command_result *process_sendrawtransaction(struct bitcoin_cli *bcl
if (bcli->exitstatus) if (bcli->exitstatus)
plugin_log(bcli->cmd->plugin, LOG_DBG, plugin_log(bcli->cmd->plugin, LOG_DBG,
"sendrawtx exit %i (%s) %.*s", "sendrawtx exit %i (%s) %.*s",
*bcli->exitstatus, bcli_args(bcli), *bcli->exitstatus, bcli_args(tmpctx, bcli),
*bcli->exitstatus ? *bcli->exitstatus ?
(u32)bcli->output_bytes-1 : 0, (u32)bcli->output_bytes-1 : 0,
bcli->output); bcli->output);