mirror of
https://github.com/aljazceru/lightning.git
synced 2025-12-19 15:14:23 +01:00
libplugin: don't spew datastore errors to LOG_DEBUG.
People get upset, especially as our "not found" error can be a bit hard to read! Signed-off-by: Rusty Russell <rusty@rustcorp.com.au> See-also: #5990
This commit is contained in:
committed by
Alex Myers
parent
dd9400df99
commit
70aee52903
@@ -574,8 +574,11 @@ static const char *init(struct plugin *p,
|
|||||||
|
|
||||||
cleantimer = plugin_timer(p, time_from_sec(cycle_seconds), do_clean_timer, NULL);
|
cleantimer = plugin_timer(p, time_from_sec(cycle_seconds), do_clean_timer, NULL);
|
||||||
|
|
||||||
|
/* We don't care if this fails (it usually does, since entries
|
||||||
|
* don't exist! */
|
||||||
for (enum subsystem i = 0; i < NUM_SUBSYSTEM; i++) {
|
for (enum subsystem i = 0; i < NUM_SUBSYSTEM; i++) {
|
||||||
rpc_scan_datastore_str(plugin, datastore_path(tmpctx, i, "num"),
|
rpc_scan_datastore_str(tmpctx, plugin,
|
||||||
|
datastore_path(tmpctx, i, "num"),
|
||||||
JSON_SCAN(json_to_u64, &total_cleaned[i]));
|
JSON_SCAN(json_to_u64, &total_cleaned[i]));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -989,6 +989,7 @@ static const char *init(struct plugin *p,
|
|||||||
const char *buf UNUSED, const jsmntok_t *config UNUSED)
|
const char *buf UNUSED, const jsmntok_t *config UNUSED)
|
||||||
{
|
{
|
||||||
struct secret rune_secret;
|
struct secret rune_secret;
|
||||||
|
const char *err;
|
||||||
|
|
||||||
outgoing_commands = tal_arr(p, struct commando *, 0);
|
outgoing_commands = tal_arr(p, struct commando *, 0);
|
||||||
incoming_commands = tal_arr(p, struct commando *, 0);
|
incoming_commands = tal_arr(p, struct commando *, 0);
|
||||||
@@ -1000,13 +1001,16 @@ static const char *init(struct plugin *p,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
rune_counter = tal(p, u64);
|
rune_counter = tal(p, u64);
|
||||||
if (!rpc_scan_datastore_str(plugin, "commando/rune_counter",
|
/* If this fails, it probably doesn't exist */
|
||||||
JSON_SCAN(json_to_u64, rune_counter)))
|
err = rpc_scan_datastore_str(tmpctx, plugin, "commando/rune_counter",
|
||||||
|
JSON_SCAN(json_to_u64, rune_counter));
|
||||||
|
if (err)
|
||||||
rune_counter = tal_free(rune_counter);
|
rune_counter = tal_free(rune_counter);
|
||||||
|
|
||||||
/* Old python commando used to store secret */
|
/* Old python commando used to store secret */
|
||||||
if (!rpc_scan_datastore_hex(plugin, "commando/secret",
|
err = rpc_scan_datastore_hex(tmpctx, plugin, "commando/secret",
|
||||||
JSON_SCAN(json_to_secret, &rune_secret))) {
|
JSON_SCAN(json_to_secret, &rune_secret));
|
||||||
|
if (err) {
|
||||||
rpc_scan(plugin, "makesecret",
|
rpc_scan(plugin, "makesecret",
|
||||||
/* $ i commando
|
/* $ i commando
|
||||||
* 99 0x63 0143 0b1100011 'c'
|
* 99 0x63 0143 0b1100011 'c'
|
||||||
|
|||||||
@@ -627,14 +627,14 @@ static void json_add_keypath(struct json_out *jout, const char *fieldname, const
|
|||||||
json_out_end(jout, ']');
|
json_out_end(jout, ']');
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool rpc_scan_datastore(struct plugin *plugin,
|
static const char *rpc_scan_datastore(const tal_t *ctx,
|
||||||
const char *path,
|
struct plugin *plugin,
|
||||||
const char *hex_or_string,
|
const char *path,
|
||||||
va_list ap)
|
const char *hex_or_string,
|
||||||
|
va_list ap)
|
||||||
{
|
{
|
||||||
const char *guide;
|
const char *guide;
|
||||||
struct json_out *params;
|
struct json_out *params;
|
||||||
const char *err;
|
|
||||||
|
|
||||||
params = json_out_new(NULL);
|
params = json_out_new(NULL);
|
||||||
json_out_start(params, NULL, '{');
|
json_out_start(params, NULL, '{');
|
||||||
@@ -643,37 +643,35 @@ static bool rpc_scan_datastore(struct plugin *plugin,
|
|||||||
json_out_finished(params);
|
json_out_finished(params);
|
||||||
|
|
||||||
guide = tal_fmt(tmpctx, "{datastore:[0:{%s:%%}]}", hex_or_string);
|
guide = tal_fmt(tmpctx, "{datastore:[0:{%s:%%}]}", hex_or_string);
|
||||||
/* FIXME: Could be some other error, but that's probably a caller bug! */
|
return rpc_scan_core(ctx, plugin, "listdatastore", take(params),
|
||||||
err = rpc_scan_core(tmpctx, plugin, "listdatastore", take(params), guide, ap);
|
guide, ap);
|
||||||
if (!err)
|
|
||||||
return true;
|
|
||||||
plugin_log(plugin, LOG_DBG, "listdatastore error %s: %s", path, err);
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool rpc_scan_datastore_str(struct plugin *plugin,
|
const char *rpc_scan_datastore_str(const tal_t *ctx,
|
||||||
const char *path,
|
struct plugin *plugin,
|
||||||
...)
|
const char *path,
|
||||||
|
...)
|
||||||
{
|
{
|
||||||
bool ret;
|
const char *ret;
|
||||||
va_list ap;
|
va_list ap;
|
||||||
|
|
||||||
va_start(ap, path);
|
va_start(ap, path);
|
||||||
ret = rpc_scan_datastore(plugin, path, "string", ap);
|
ret = rpc_scan_datastore(ctx, plugin, path, "string", ap);
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This variant scans the hex encoding, not the string */
|
/* This variant scans the hex encoding, not the string */
|
||||||
bool rpc_scan_datastore_hex(struct plugin *plugin,
|
const char *rpc_scan_datastore_hex(const tal_t *ctx,
|
||||||
const char *path,
|
struct plugin *plugin,
|
||||||
...)
|
const char *path,
|
||||||
|
...)
|
||||||
{
|
{
|
||||||
bool ret;
|
const char *ret;
|
||||||
va_list ap;
|
va_list ap;
|
||||||
|
|
||||||
va_start(ap, path);
|
va_start(ap, path);
|
||||||
ret = rpc_scan_datastore(plugin, path, "hex", ap);
|
ret = rpc_scan_datastore(ctx, plugin, path, "hex", ap);
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -310,17 +310,19 @@ void rpc_scan(struct plugin *plugin,
|
|||||||
const char *guide,
|
const char *guide,
|
||||||
...);
|
...);
|
||||||
|
|
||||||
/* Helper to scan datastore: can only be used in init callback. *
|
/* Helper to scan datastore: can only be used in init callback. Returns error
|
||||||
Returns false if field does not exist. * path is /-separated. Final
|
* msg (usually meaning field does not exist), or NULL on success. path is
|
||||||
arg is JSON_SCAN or JSON_SCAN_TAL.
|
* /-separated. Final arg is JSON_SCAN or JSON_SCAN_TAL.
|
||||||
*/
|
*/
|
||||||
bool rpc_scan_datastore_str(struct plugin *plugin,
|
const char *rpc_scan_datastore_str(const tal_t *ctx,
|
||||||
const char *path,
|
struct plugin *plugin,
|
||||||
...);
|
const char *path,
|
||||||
|
...);
|
||||||
/* This variant scans the hex encoding, not the string */
|
/* This variant scans the hex encoding, not the string */
|
||||||
bool rpc_scan_datastore_hex(struct plugin *plugin,
|
const char *rpc_scan_datastore_hex(const tal_t *ctx,
|
||||||
const char *path,
|
struct plugin *plugin,
|
||||||
...);
|
const char *path,
|
||||||
|
...);
|
||||||
|
|
||||||
/* This sets batching of database commitments */
|
/* This sets batching of database commitments */
|
||||||
void rpc_enable_batching(struct plugin *plugin);
|
void rpc_enable_batching(struct plugin *plugin);
|
||||||
|
|||||||
@@ -131,7 +131,7 @@ static const char *init(struct plugin *p,
|
|||||||
const char *buf UNUSED,
|
const char *buf UNUSED,
|
||||||
const jsmntok_t *config UNUSED)
|
const jsmntok_t *config UNUSED)
|
||||||
{
|
{
|
||||||
const char *name;
|
const char *name, *err_str, *err_hex;
|
||||||
const u8 *binname;
|
const u8 *binname;
|
||||||
|
|
||||||
plugin_log(p, LOG_DBG, "test_libplugin initialised!");
|
plugin_log(p, LOG_DBG, "test_libplugin initialised!");
|
||||||
@@ -143,19 +143,21 @@ static const char *init(struct plugin *p,
|
|||||||
return "Disabled via selfdisable option";
|
return "Disabled via selfdisable option";
|
||||||
|
|
||||||
/* Test rpc_scan_datastore funcs */
|
/* Test rpc_scan_datastore funcs */
|
||||||
if (!rpc_scan_datastore_str(p, "test_libplugin/name",
|
err_str = rpc_scan_datastore_str(tmpctx, p, "test_libplugin/name",
|
||||||
JSON_SCAN_TAL(tmpctx, json_strdup,
|
JSON_SCAN_TAL(tmpctx, json_strdup,
|
||||||
&name)))
|
&name));
|
||||||
|
if (err_str)
|
||||||
name = NULL;
|
name = NULL;
|
||||||
if (!rpc_scan_datastore_hex(p, "test_libplugin/name",
|
err_hex = rpc_scan_datastore_hex(tmpctx, p, "test_libplugin/name",
|
||||||
JSON_SCAN_TAL(tmpctx, json_tok_bin_from_hex,
|
JSON_SCAN_TAL(tmpctx, json_tok_bin_from_hex,
|
||||||
&binname)))
|
&binname));
|
||||||
|
if (err_hex)
|
||||||
binname = NULL;
|
binname = NULL;
|
||||||
|
|
||||||
plugin_log(p, LOG_INFORM, "String name from datastore: %s",
|
plugin_log(p, LOG_INFORM, "String name from datastore: %s",
|
||||||
name ? name : "NOT FOUND");
|
name ? name : err_str);
|
||||||
plugin_log(p, LOG_INFORM, "Hex name from datastore: %s",
|
plugin_log(p, LOG_INFORM, "Hex name from datastore: %s",
|
||||||
binname ? tal_hex(tmpctx, binname) : "NOT FOUND");
|
binname ? tal_hex(tmpctx, binname) : err_hex);
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1499,8 +1499,8 @@ def test_libplugin(node_factory):
|
|||||||
|
|
||||||
# Test startup
|
# Test startup
|
||||||
assert l1.daemon.is_in_log("test_libplugin initialised!")
|
assert l1.daemon.is_in_log("test_libplugin initialised!")
|
||||||
assert l1.daemon.is_in_log("String name from datastore: NOT FOUND")
|
assert l1.daemon.is_in_log("String name from datastore:.*token has no index 0")
|
||||||
assert l1.daemon.is_in_log("Hex name from datastore: NOT FOUND")
|
assert l1.daemon.is_in_log("Hex name from datastore:.*token has no index 0")
|
||||||
|
|
||||||
# This will look on datastore for default, won't find it.
|
# This will look on datastore for default, won't find it.
|
||||||
assert l1.rpc.call("helloworld") == {"hello": "NOT FOUND"}
|
assert l1.rpc.call("helloworld") == {"hello": "NOT FOUND"}
|
||||||
@@ -1519,7 +1519,7 @@ def test_libplugin(node_factory):
|
|||||||
# yet whether strings are allowed:
|
# yet whether strings are allowed:
|
||||||
l1.daemon.wait_for_log(r"test_libplugin: [0-9]*\[OUT\]")
|
l1.daemon.wait_for_log(r"test_libplugin: [0-9]*\[OUT\]")
|
||||||
|
|
||||||
l1.daemon.wait_for_log("String name from datastore: NOT FOUND")
|
l1.daemon.wait_for_log("String name from datastore:.*object does not have member string")
|
||||||
l1.daemon.wait_for_log("Hex name from datastore: 00010203")
|
l1.daemon.wait_for_log("Hex name from datastore: 00010203")
|
||||||
|
|
||||||
# Test commands
|
# Test commands
|
||||||
|
|||||||
Reference in New Issue
Block a user