Browse Source

open: use a single transaction when shutdown, so it's atomic.

This covers the case of shutdown during open.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
ppa-0.6.1
Rusty Russell 8 years ago
parent
commit
6b05436a7a
  1. 16
      daemon/db.c
  2. 2
      daemon/db.h
  3. 20
      daemon/peer.c

16
daemon/db.c

@ -1762,22 +1762,20 @@ void db_set_our_closing_script(struct peer *peer)
tal_free(ctx); 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); const char *ctx = tal_tmpctx(peer);
bool ok;
const char *peerid = pubkey_to_hexstr(ctx, peer->dstate->secpctx, peer->id); const char *peerid = pubkey_to_hexstr(ctx, peer->dstate->secpctx, peer->id);
log_debug(peer->log, "%s(%s)", __func__, peerid); log_debug(peer->log, "%s(%s)", __func__, peerid);
assert(!peer->dstate->db->in_transaction); assert(peer->dstate->db->in_transaction);
ok = db_exec(__func__, peer->dstate, db_exec(__func__, peer->dstate,
"UPDATE closing SET their_script=x'%s' WHERE peer=x'%s';", "UPDATE closing SET their_script=x'%s' WHERE peer=x'%s';",
tal_hexstr(ctx, peer->closing.their_script, tal_hexstr(ctx, peer->closing.their_script,
tal_count(peer->closing.their_script)), tal_count(peer->closing.their_script)),
peerid); peerid);
tal_free(ctx); tal_free(ctx);
return ok;
} }
/* For first time, we are in transaction to make it atomic with peer->state /* For first time, we are in transaction to make it atomic with peer->state

2
daemon/db.h

@ -20,7 +20,6 @@ bool db_add_peer_address(struct lightningd_state *dstate,
/* Must NOT be inside transaction. */ /* Must NOT be inside transaction. */
bool db_update_their_closing(struct peer *peer); 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, bool db_new_pay_command(struct lightningd_state *dstate,
const struct sha256 *rhash, const struct sha256 *rhash,
const struct pubkey *ids, const struct pubkey *ids,
@ -69,6 +68,7 @@ void db_update_state(struct peer *peer);
void db_begin_shutdown(struct peer *peer); void db_begin_shutdown(struct peer *peer);
void db_set_our_closing_script(struct peer *peer); void db_set_our_closing_script(struct peer *peer);
void db_update_our_closing(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, void db_add_commit_map(struct peer *peer,
const struct sha256_double *txid, u64 commit_num); const struct sha256_double *txid, u64 commit_num);

20
daemon/peer.c

@ -732,14 +732,13 @@ static bool open_wait_pkt_in(struct peer *peer, const Pkt *pkt)
if (err) if (err)
return peer_comms_err(peer, err); return peer_comms_err(peer, err);
/* FIXME: All in one transaction! */ peer_open_complete(peer, "Shutdown request received");
if (!db_set_their_closing_script(peer)) db_start_transaction(peer);
err = pkt_err(peer, "database error"); db_set_their_closing_script(peer);
else start_closing_in_transaction(peer);
err = start_closing(peer); if (db_commit_transaction(peer) != NULL)
return peer_database_err(peer);
if (err)
return peer_comms_err(peer, err);
return false; return false;
} }
@ -1673,7 +1672,9 @@ static bool shutdown_pkt_in(struct peer *peer, const Pkt *pkt)
else { else {
err = accept_pkt_close_shutdown(peer, pkt); err = accept_pkt_close_shutdown(peer, pkt);
if (!err) { 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"); err = pkt_err(peer, "database error");
} }
} }
@ -1707,6 +1708,8 @@ static bool shutdown_pkt_in(struct peer *peer, const Pkt *pkt)
break; break;
} }
/* FIXME: This should be in the same transaction as whatever
* triggered it */
if (!err && !committed_to_htlcs(peer) && peer->closing.their_script) if (!err && !committed_to_htlcs(peer) && peer->closing.their_script)
err = start_closing(peer); err = start_closing(peer);
@ -4921,6 +4924,7 @@ static void json_close(struct command *cmd,
command_fail(cmd, "Database error"); command_fail(cmd, "Database error");
return; return;
} }
/* FIXME: Block until closed! */
command_success(cmd, null_response(cmd)); command_success(cmd, null_response(cmd));
} }

Loading…
Cancel
Save