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);
}
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

2
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);

20
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));
}

Loading…
Cancel
Save