From 26484b8aa556d055ebd82ca73857a6b8178fc415 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Mon, 17 Dec 2018 14:22:05 +1030 Subject: [PATCH] memdump: rearrange order to avoid command_its_complicated(). memdump iterates through the various daemons asking them to check for leaks. We currently call openingds (there might be none), channelds (there might be none), then hsmd synchronously (the other daemons). If hsmd reports a leak, we'll fail the dev-memleak command immediately. Change the order to call connectd first; that's always async, so we can happily mark the command still pending. Signed-off-by: Rusty Russell --- lightningd/memdump.c | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/lightningd/memdump.c b/lightningd/memdump.c index 408aed899..258f84c90 100644 --- a/lightningd/memdump.c +++ b/lightningd/memdump.c @@ -218,7 +218,6 @@ static void connect_dev_memleak_done(struct subd *connectd, const int *fds UNUSED, struct command *cmd) { - struct lightningd *ld = cmd->ld; bool found_leak; if (!fromwire_connect_dev_memleak_reply(reply, &found_leak)) { @@ -232,9 +231,8 @@ static void connect_dev_memleak_done(struct subd *connectd, return; } - /* No leak? Ask gossipd. */ - subd_req(ld->gossip, ld->gossip, take(towire_gossip_dev_memleak(NULL)), - -1, 0, gossip_dev_memleak_done, cmd); + /* No leak? Ask openingd. */ + opening_dev_memleak(cmd); } static void hsm_dev_memleak_done(struct subd *hsmd, @@ -255,10 +253,9 @@ static void hsm_dev_memleak_done(struct subd *hsmd, return; } - /* No leak? Ask connectd. */ - subd_req(ld->connectd, ld->connectd, - take(towire_connect_dev_memleak(NULL)), - -1, 0, connect_dev_memleak_done, cmd); + /* No leak? Ask gossipd. */ + subd_req(ld->gossip, ld->gossip, take(towire_gossip_dev_memleak(NULL)), + -1, 0, gossip_dev_memleak_done, cmd); } void peer_memleak_done(struct command *cmd, struct subd *leaker) @@ -292,6 +289,8 @@ static struct command_result *json_memleak(struct command *cmd, const jsmntok_t *obj UNNEEDED, const jsmntok_t *params) { + struct lightningd *ld = cmd->ld; + if (!param(cmd, buffer, params, NULL)) return command_param_failed(); @@ -300,14 +299,12 @@ static struct command_result *json_memleak(struct command *cmd, "Leak detection needs $LIGHTNINGD_DEV_MEMLEAK"); } - /* For simplicity, we mark pending, though an error may complete it - * immediately. */ - fixme_ignore(command_still_pending(cmd)); - - /* This calls opening_memleak_done() async when all done. */ - opening_dev_memleak(cmd); + /* Start by asking connectd, which is always async. */ + subd_req(ld->connectd, ld->connectd, + take(towire_connect_dev_memleak(NULL)), + -1, 0, connect_dev_memleak_done, cmd); - return command_its_complicated(); + return command_still_pending(cmd); } static const struct json_command dev_memleak_command = {