diff --git a/daemon/db.c b/daemon/db.c index afd0ad4a6..62381c4cb 100644 --- a/daemon/db.c +++ b/daemon/db.c @@ -1762,22 +1762,20 @@ void db_set_our_closing_script(struct peer *peer) tal_free(ctx); } -bool db_set_their_closing_script(struct peer *peer) +void db_set_their_closing_script(struct peer *peer) { const char *ctx = tal_tmpctx(peer); - bool ok; const char *peerid = pubkey_to_hexstr(ctx, peer->dstate->secpctx, peer->id); log_debug(peer->log, "%s(%s)", __func__, peerid); - assert(!peer->dstate->db->in_transaction); - ok = db_exec(__func__, peer->dstate, - "UPDATE closing SET their_script=x'%s' WHERE peer=x'%s';", - tal_hexstr(ctx, peer->closing.their_script, - tal_count(peer->closing.their_script)), - peerid); + assert(peer->dstate->db->in_transaction); + db_exec(__func__, peer->dstate, + "UPDATE closing SET their_script=x'%s' WHERE peer=x'%s';", + tal_hexstr(ctx, peer->closing.their_script, + tal_count(peer->closing.their_script)), + peerid); tal_free(ctx); - return ok; } /* For first time, we are in transaction to make it atomic with peer->state diff --git a/daemon/db.h b/daemon/db.h index bae49cd69..b4cb5a2ab 100644 --- a/daemon/db.h +++ b/daemon/db.h @@ -20,7 +20,6 @@ bool db_add_peer_address(struct lightningd_state *dstate, /* Must NOT be inside transaction. */ bool db_update_their_closing(struct peer *peer); -bool db_set_their_closing_script(struct peer *peer); bool db_new_pay_command(struct lightningd_state *dstate, const struct sha256 *rhash, const struct pubkey *ids, @@ -69,6 +68,7 @@ void db_update_state(struct peer *peer); void db_begin_shutdown(struct peer *peer); void db_set_our_closing_script(struct peer *peer); void db_update_our_closing(struct peer *peer); +void db_set_their_closing_script(struct peer *peer); void db_add_commit_map(struct peer *peer, const struct sha256_double *txid, u64 commit_num); diff --git a/daemon/peer.c b/daemon/peer.c index 7ca09c849..08eddc944 100644 --- a/daemon/peer.c +++ b/daemon/peer.c @@ -732,14 +732,13 @@ static bool open_wait_pkt_in(struct peer *peer, const Pkt *pkt) if (err) return peer_comms_err(peer, err); - /* FIXME: All in one transaction! */ - if (!db_set_their_closing_script(peer)) - err = pkt_err(peer, "database error"); - else - err = start_closing(peer); + peer_open_complete(peer, "Shutdown request received"); + db_start_transaction(peer); + db_set_their_closing_script(peer); + start_closing_in_transaction(peer); + if (db_commit_transaction(peer) != NULL) + return peer_database_err(peer); - if (err) - return peer_comms_err(peer, err); return false; } @@ -1673,7 +1672,9 @@ static bool shutdown_pkt_in(struct peer *peer, const Pkt *pkt) else { err = accept_pkt_close_shutdown(peer, pkt); if (!err) { - if (!db_set_their_closing_script(peer)) + db_start_transaction(peer); + db_set_their_closing_script(peer); + if (db_commit_transaction(peer) != NULL) err = pkt_err(peer, "database error"); } } @@ -1707,6 +1708,8 @@ static bool shutdown_pkt_in(struct peer *peer, const Pkt *pkt) break; } + /* FIXME: This should be in the same transaction as whatever + * triggered it */ if (!err && !committed_to_htlcs(peer) && peer->closing.their_script) err = start_closing(peer); @@ -4921,6 +4924,7 @@ static void json_close(struct command *cmd, command_fail(cmd, "Database error"); return; } + /* FIXME: Block until closed! */ command_success(cmd, null_response(cmd)); }