plugin: add log-level to plugin_kill, make it take format string.

We currently log every kill at INFO level, even if it's during shutdown.
Change those to debug, but lift those where we got a malformed response.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
Rusty Russell 2021-02-11 11:39:31 +10:30 committed by Christian Decker
parent 7885d12eca
commit a9aad0da98
3 changed files with 33 additions and 13 deletions

View File

@ -117,7 +117,7 @@ static void check_plugins_manifests(struct plugins *plugins)
/* Only complain and free plugins! */
if (depfail[i]->plugin_state != NEEDS_INIT)
continue;
plugin_kill(depfail[i],
plugin_kill(depfail[i], LOG_UNUSUAL,
"Cannot meet required hook dependencies");
}
@ -287,9 +287,19 @@ bool plugin_blacklisted(struct plugins *plugins, const char *name)
return false;
}
void plugin_kill(struct plugin *plugin, const char *msg)
void plugin_kill(struct plugin *plugin, enum log_level loglevel,
const char *fmt, ...)
{
log_info(plugin->log, "Killing plugin: %s", msg);
va_list ap;
const char *msg;
va_start(ap, fmt);
msg = tal_vfmt(tmpctx, fmt, ap);
va_end(ap);
log_(plugin->log, loglevel,
NULL, loglevel >= LOG_UNUSUAL,
"Killing plugin: %s", msg);
kill(plugin->pid, SIGKILL);
if (plugin->start_cmd) {
plugin_cmd_killed(plugin->start_cmd, plugin, msg);
@ -605,7 +615,8 @@ static struct io_plan *plugin_read_json(struct io_conn *conn,
return io_close(NULL);
if (err) {
plugin_kill(plugin, err);
plugin_kill(plugin, LOG_UNUSUAL,
"%s", err);
/* plugin_kill frees plugin */
return io_close(NULL);
}
@ -648,8 +659,11 @@ static struct io_plan *plugin_write_json(struct io_conn *conn,
/* This catches the case where their stdout closes (usually they're dead). */
static void plugin_conn_finish(struct io_conn *conn, struct plugin *plugin)
{
const char *msg = tal_fmt(tmpctx, "exited %s", state_desc(plugin));
plugin_kill(plugin, msg);
/* This is expected at shutdown of course. */
plugin_kill(plugin,
plugin->plugins->shutdown
? LOG_DBG : LOG_INFORM,
"exited %s", state_desc(plugin));
}
struct io_plan *plugin_stdin_conn_init(struct io_conn *conn,
@ -1224,7 +1238,8 @@ static void plugin_manifest_timeout(struct plugin *plugin)
{
bool startup = plugin->plugins->startup;
plugin_kill(plugin, tal_fmt(tmpctx, "timed out %s", state_desc(plugin)));
plugin_kill(plugin, LOG_UNUSUAL,
"timed out %s", state_desc(plugin));
if (startup)
fatal("Can't recover from plugin failure, terminating.");
@ -1356,8 +1371,9 @@ static void plugin_manifest_cb(const char *buffer,
const char *err;
err = plugin_parse_getmanifest_response(buffer, toks, idtok, plugin);
/* FIXME: log debug if it disabled *itself*! */
if (err) {
plugin_kill(plugin, err);
plugin_kill(plugin, LOG_INFORM, "%s", err);
return;
}
@ -1365,7 +1381,8 @@ static void plugin_manifest_cb(const char *buffer,
plugin->timeout_timer = tal_free(plugin->timeout_timer);
if (!plugin->plugins->startup && !plugin->dynamic)
plugin_kill(plugin, "Not a dynamic plugin");
plugin_kill(plugin, LOG_INFORM,
"Not a dynamic plugin");
else
check_plugins_manifests(plugin->plugins);
}
@ -1554,7 +1571,7 @@ bool plugins_send_getmanifest(struct plugins *plugins)
}
if (plugins->startup)
fatal("error starting plugin '%s': %s", p->cmd, err);
plugin_kill(p, err);
plugin_kill(p, LOG_UNUSUAL, "%s", err);
}
return sent;
@ -1607,7 +1624,7 @@ static void plugin_config_cb(const char *buffer,
disable);
/* Don't get upset if this was a built-in! */
plugin->important = false;
plugin_kill(plugin, disable);
plugin_kill(plugin, LOG_DBG, disable);
return;
}

View File

@ -18,6 +18,7 @@
#include <lightningd/jsonrpc.h>
#include <lightningd/lightningd.h>
#include <lightningd/log.h>
#include <stdarg.h>
#include <unistd.h>
@ -256,7 +257,8 @@ bool plugins_send_getmanifest(struct plugins *plugins);
/**
* Kill a plugin process and free @plugin, with an error message.
*/
void plugin_kill(struct plugin *plugin, const char *msg);
void plugin_kill(struct plugin *plugin, enum log_level loglevel,
const char *fmt, ...);
/**
* Returns the plugin which registers the command with name {cmd_name}

View File

@ -113,7 +113,8 @@ plugin_dynamic_stop(struct command *cmd, const char *plugin_name)
"%s cannot be managed when "
"lightningd is up",
plugin_name);
plugin_kill(p, "stopped by lightningd via RPC");
plugin_kill(p, LOG_INFORM,
"stopped by lightningd via RPC");
response = json_stream_success(cmd);
json_add_string(response, "result",
take(tal_fmt(NULL, "Successfully stopped %s.",