Browse Source

mfc: add a 'fail_destination' helper

Caches state at which we failed + sets error
fix-mocks
niftynei 4 years ago
committed by neil saitug
parent
commit
e0c4865eea
  1. 23
      plugins/spender/multifundchannel.c
  2. 8
      plugins/spender/multifundchannel.h
  3. 17
      plugins/spender/openchannel.c

23
plugins/spender/multifundchannel.c

@ -564,9 +564,7 @@ connect_err(struct command *cmd,
json_tok_full_len(code_tok),
json_tok_full(buf, code_tok));
dest->state = MULTIFUNDCHANNEL_CONNECT_FAILED;
dest->error = json_strdup(mfc, buf, error);
fail_destination(dest, take(json_strdup(NULL, buf, error)));
return connect_done(dest);
}
@ -1110,9 +1108,7 @@ fundchannel_start_err(struct command *cmd,
completed, we can then fail.
*/
dest->state = MULTIFUNDCHANNEL_START_FAILED;
dest->error = json_strdup(dest->mfc, buf, error);
fail_destination(dest, take(json_strdup(NULL, buf, error)));
return fundchannel_start_done(dest);
}
@ -1408,9 +1404,7 @@ fundchannel_complete_err(struct command *cmd,
json_tok_full_len(error),
json_tok_full(buf, error));
dest->state = MULTIFUNDCHANNEL_COMPLETE_FAILED;
dest->error = json_strdup(mfc, buf, error);
fail_destination(dest, take(json_strdup(NULL, buf, error)));
return fundchannel_complete_done(dest);
}
@ -1706,6 +1700,17 @@ static bool dest_failed(struct multifundchannel_destination *dest)
abort();
}
void fail_destination(struct multifundchannel_destination *dest,
char *error TAKES)
{
dest->fail_state = dest->state;
dest->state = MULTIFUNDCHANNEL_FAILED;
if (taken(error))
dest->error = tal_steal(dest->mfc, error);
else
dest->error = tal_strdup(dest->mfc, error);
}
/* Filter the failing destinations. */
static struct command_result *
post_cleanup_redo_multifundchannel(struct multifundchannel_redo *redo)

8
plugins/spender/multifundchannel.h

@ -71,6 +71,9 @@ struct multifundchannel_destination {
*/
enum multifundchannel_state state;
/* Last known state before failure */
enum multifundchannel_state fail_state;
/* the actual target script and address. */
const u8 *funding_script;
const char *funding_addr;
@ -213,6 +216,11 @@ mfc_forward_error(struct command *cmd,
const char *buf, const jsmntok_t *error,
struct multifundchannel_command *);
/* When a destination fails, we record the furthest state
* reached, and the error message for the failure */
void fail_destination(struct multifundchannel_destination *dest,
char *error TAKES);
/* Use this instead of command_finished. */
struct command_result *
mfc_finished(struct multifundchannel_command *, struct json_stream *response);

17
plugins/spender/openchannel.c

@ -2,6 +2,7 @@
#include <bitcoin/psbt.h>
#include <ccan/ccan/array_size/array_size.h>
#include <ccan/ccan/cast/cast.h>
#include <ccan/ccan/tal/str/str.h>
#include <common/json_stream.h>
#include <common/psbt_open.h>
#include <common/type_to_string.h>
@ -455,8 +456,7 @@ openchannel_signed_err(struct command *cmd,
json_tok_full_len(code_tok),
json_tok_full(buf, code_tok));
dest->state = MULTIFUNDCHANNEL_FAILED;
dest->error = json_strdup(dest->mfc, buf, error);
fail_destination(dest, take(json_strdup(NULL, buf, error)));
return after_openchannel_signed(mfc);
}
@ -808,9 +808,7 @@ openchannel_update_err(struct command *cmd,
json_tok_full_len(error),
json_tok_full(buf, error));
dest->state = MULTIFUNDCHANNEL_FAILED;
dest->error = json_strdup(mfc, buf, error);
fail_destination(dest, take(json_strdup(NULL, buf, error)));
return openchannel_update_returned(dest);
}
@ -1025,8 +1023,9 @@ openchannel_init_ok(struct command *cmd,
/* Port any updates onto 'parent' PSBT */
if (!update_parent_psbt(dest->mfc, dest, dest->psbt,
dest->updated_psbt, &mfc->psbt)) {
dest->state = MULTIFUNDCHANNEL_FAILED;
dest->error = "Unable to update parent with node's PSBT";
fail_destination(dest,
take(tal_fmt(NULL, "Unable to update parent"
" with node's PSBT")));
}
/* Clone updated-psbt to psbt, so original changeset
@ -1069,9 +1068,7 @@ openchannel_init_err(struct command *cmd,
json_tok_full_len(code_tok),
json_tok_full(buf, code_tok));
dest->state = MULTIFUNDCHANNEL_START_FAILED;
dest->error = json_strdup(dest->mfc, buf, error);
fail_destination(dest, take(json_strdup(NULL, buf, error)));
return openchannel_init_done(dest);
}

Loading…
Cancel
Save