From 6acb4953b1a38bc1fd67254e7c2469bca3e0af5d Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Wed, 9 Nov 2016 08:04:25 +1030 Subject: [PATCH] db: make db_set_visible_state called from within transaction. We want to do this atomically; this is the first step. Signed-off-by: Rusty Russell --- daemon/db.c | 9 +++------ daemon/db.h | 2 +- state.c | 4 +++- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/daemon/db.c b/daemon/db.c index 7f30e5b70..7e787b122 100644 --- a/daemon/db.c +++ b/daemon/db.c @@ -1350,13 +1350,13 @@ void db_set_anchor(struct peer *peer) tal_free(ctx); } -bool db_set_visible_state(struct peer *peer) +void db_set_visible_state(struct peer *peer) { - const char *errmsg, *ctx = tal_tmpctx(peer); + const char *ctx = tal_tmpctx(peer); const char *peerid = pubkey_to_hexstr(ctx, peer->dstate->secpctx, peer->id); log_debug(peer->log, "%s(%s)", __func__, peerid); - db_start_transaction(peer); + assert(peer->dstate->db->in_transaction); db_exec(__func__, peer->dstate, "INSERT INTO their_visible_state VALUES (x'%s', %s, x'%s', x'%s', %u, %u, %"PRIu64", x'%s');", @@ -1372,10 +1372,7 @@ bool db_set_visible_state(struct peer *peer) tal_hexstr(ctx, &peer->remote.next_revocation_hash, sizeof(peer->remote.next_revocation_hash))); - errmsg = db_commit_transaction(peer); - tal_free(ctx); - return !errmsg; } void db_update_next_revocation_hash(struct peer *peer) diff --git a/daemon/db.h b/daemon/db.h index 41a957581..bae49cd69 100644 --- a/daemon/db.h +++ b/daemon/db.h @@ -7,7 +7,6 @@ void db_init(struct lightningd_state *dstate); bool db_create_peer(struct peer *peer); -bool db_set_visible_state(struct peer *peer); void db_start_transaction(struct peer *peer); void db_abort_transaction(struct peer *peer); @@ -44,6 +43,7 @@ bool db_remove_invoice(struct lightningd_state *dstate, * which have to be inside transaction anyway. */ /* Must be inside transaction. */ +void db_set_visible_state(struct peer *peer); void db_set_anchor(struct peer *peer); void db_new_htlc(struct peer *peer, const struct htlc *htlc); void db_new_feechange(struct peer *peer, const struct feechange *feechange); diff --git a/state.c b/state.c index 67611adb1..9179c92aa 100644 --- a/state.c +++ b/state.c @@ -32,7 +32,9 @@ static Pkt *init_from_pkt_open(struct peer *peer, const Pkt *pkt) if (err) return err; - if (!db_set_visible_state(peer)) + db_start_transaction(peer); + db_set_visible_state(peer); + if (db_commit_transaction(peer) != NULL) return pkt_err(peer, "Database error"); /* Set up their commit info now: rest gets done in setup_first_commit