diff --git a/daemon/peer.c b/daemon/peer.c index da14a13e0..682f24eb8 100644 --- a/daemon/peer.c +++ b/daemon/peer.c @@ -352,15 +352,20 @@ static struct io_plan *peer_close(struct io_conn *conn, struct peer *peer) return io_wait(conn, NULL, io_never, NULL); } +void peer_fail(struct peer *peer, const char *caller) +{ + /* FIXME: Save state here? */ + set_peer_state(peer, STATE_ERR_BREAKDOWN, caller, false); + peer_breakdown(peer); +} + /* Communication failed: send err (if non-NULL), then dump to chain and close. */ static bool peer_comms_err(struct peer *peer, Pkt *err) { if (err) queue_pkt_err(peer, err); - /* FIXME: Save state here? */ - set_peer_state(peer, STATE_ERR_BREAKDOWN, __func__, false); - peer_breakdown(peer); + peer_fail(peer, __func__); return false; } @@ -1552,9 +1557,7 @@ static void state_single(struct peer *peer, if (!db_start_transaction(peer) || !db_update_state(peer) || !db_commit_transaction(peer)) { - set_peer_state(peer, STATE_ERR_BREAKDOWN, __func__, - false); - peer_breakdown(peer); + peer_fail(peer, __func__); /* Start output if not running already; it will close conn. */ io_wake(peer); @@ -2258,8 +2261,7 @@ static void do_commit(struct peer *peer, struct command *jsoncmd) database_error: db_abort_transaction(peer); - set_peer_state(peer, STATE_ERR_BREAKDOWN, __func__, false); - peer_breakdown(peer); + peer_fail(peer, __func__); } /* FIXME: don't spin on this timer if we're not connected! */ @@ -2961,10 +2963,8 @@ static void check_htlc_expiry(struct peer *peer) if (!state_is_normal(peer->state)) return; - if (any_deadline_past(peer)) { - set_peer_state(peer, STATE_ERR_BREAKDOWN, __func__, false); - peer_breakdown(peer); - } + if (any_deadline_past(peer)) + peer_fail(peer, __func__); } static enum watch_result anchor_depthchange(struct peer *peer, @@ -3004,8 +3004,7 @@ static enum watch_result anchor_depthchange(struct peer *peer, log_broken(peer->log, "fee rate %"PRIu64" lower than %"PRIu64, peer->local.commit->cstate->fee_rate, get_feerate(peer->dstate)); - set_peer_state(peer, STATE_ERR_BREAKDOWN, __func__, false); - peer_breakdown(peer); + peer_fail(peer, __func__); } return KEEP_WATCHING; @@ -4136,8 +4135,7 @@ static void try_reconnect(struct peer *peer) if (fd < 0) { log_broken(peer->log, "do_reconnect: failed to create socket: %s", strerror(errno)); - set_peer_state(peer, STATE_ERR_BREAKDOWN, "do_reconnect", false); - peer_breakdown(peer); + peer_fail(peer, __func__); return; } @@ -4717,8 +4715,7 @@ static void json_disconnect(struct command *cmd, log_debug(peer->log, "Pretending connection is closed"); peer->fake_close = true; peer->connected = false; - set_peer_state(peer, STATE_ERR_BREAKDOWN, "json_disconnect", false); - peer_breakdown(peer); + peer_fail(peer, __func__); command_success(cmd, null_response(cmd)); } diff --git a/daemon/peer.h b/daemon/peer.h index d292a21ac..1749c8a01 100644 --- a/daemon/peer.h +++ b/daemon/peer.h @@ -280,6 +280,9 @@ const char *command_htlc_add(struct peer *peer, u64 msatoshis, void peer_unexpected_pkt(struct peer *peer, const Pkt *pkt, const char *where); +/* Peer has an issue, breakdown and fail. */ +void peer_fail(struct peer *peer, const char *caller); + /* Peer has completed open, or problem (if non-NULL). */ void peer_open_complete(struct peer *peer, const char *problem);