Browse Source

db: save the failcode / failuremsg into db.

Now we can finally move the fixup code under COMPAT_V061, so it's only
for old nodes.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
fee-tracking2
Rusty Russell 6 years ago
parent
commit
79ebb8a92e
  1. 16
      lightningd/peer_htlcs.c
  2. 7
      wallet/test/run-wallet.c
  3. 19
      wallet/wallet.c
  4. 7
      wallet/wallet.h

16
lightningd/peer_htlcs.c

@ -62,7 +62,8 @@ static bool htlc_in_update_state(struct channel *channel,
return false; return false;
wallet_htlc_update(channel->peer->ld->wallet, wallet_htlc_update(channel->peer->ld->wallet,
hin->dbid, newstate, hin->preimage); hin->dbid, newstate, hin->preimage,
hin->failcode, hin->failuremsg);
hin->hstate = newstate; hin->hstate = newstate;
return true; return true;
@ -77,7 +78,7 @@ static bool htlc_out_update_state(struct channel *channel,
return false; return false;
wallet_htlc_update(channel->peer->ld->wallet, hout->dbid, newstate, wallet_htlc_update(channel->peer->ld->wallet, hout->dbid, newstate,
hout->preimage); hout->preimage, hout->failcode, hout->failuremsg);
hout->hstate = newstate; hout->hstate = newstate;
return true; return true;
@ -727,7 +728,8 @@ static void fulfill_our_htlc_out(struct channel *channel, struct htlc_out *hout,
hout->preimage = tal_dup(hout, struct preimage, preimage); hout->preimage = tal_dup(hout, struct preimage, preimage);
htlc_out_check(hout, __func__); htlc_out_check(hout, __func__);
wallet_htlc_update(ld->wallet, hout->dbid, hout->hstate, preimage); wallet_htlc_update(ld->wallet, hout->dbid, hout->hstate,
hout->preimage, hout->failcode, hout->failuremsg);
/* Update channel stats */ /* Update channel stats */
wallet_channel_stats_incr_out_fulfilled(ld->wallet, wallet_channel_stats_incr_out_fulfilled(ld->wallet,
channel->dbid, channel->dbid,
@ -868,9 +870,9 @@ void onchain_failed_our_htlc(const struct channel *channel,
/* Force state to something which expects a failure, and save to db */ /* Force state to something which expects a failure, and save to db */
hout->hstate = RCVD_REMOVE_HTLC; hout->hstate = RCVD_REMOVE_HTLC;
wallet_htlc_update(channel->peer->ld->wallet, hout->dbid, hout->hstate,
NULL);
htlc_out_check(hout, __func__); htlc_out_check(hout, __func__);
wallet_htlc_update(channel->peer->ld->wallet, hout->dbid, hout->hstate,
hout->preimage, hout->failcode, hout->failuremsg);
if (hout->local) { if (hout->local) {
assert(why != NULL); assert(why != NULL);
@ -1679,6 +1681,7 @@ void htlcs_notify_new_block(struct lightningd *ld, u32 height)
} while (removed); } while (removed);
} }
#ifdef COMPAT_V061
static void fixup_hout(struct lightningd *ld, struct htlc_out *hout) static void fixup_hout(struct lightningd *ld, struct htlc_out *hout)
{ {
const char *fix; const char *fix;
@ -1724,6 +1727,7 @@ static void fixup_hout(struct lightningd *ld, struct htlc_out *hout)
&hout->key.channel->peer->id), &hout->key.channel->peer->id),
fix); fix);
} }
#endif /* COMPAT_V061 */
/** /**
* htlcs_reconnect -- Link outgoing HTLCs to their origins after initial db load * htlcs_reconnect -- Link outgoing HTLCs to their origins after initial db load
@ -1774,7 +1778,9 @@ void htlcs_reconnect(struct lightningd *ld,
hout->origin_htlc_id, hout->dbid); hout->origin_htlc_id, hout->dbid);
#endif #endif
} }
#ifdef COMPAT_V061
fixup_hout(ld, hout); fixup_hout(ld, hout);
#endif
} }
} }

7
wallet/test/run-wallet.c

@ -963,11 +963,14 @@ static bool test_htlc_crud(struct lightningd *ld, const tal_t *ctx)
wallet_err = tal_free(wallet_err); wallet_err = tal_free(wallet_err);
/* Update */ /* Update */
CHECK_MSG(transaction_wrap(w->db, wallet_htlc_update(w, in.dbid, RCVD_ADD_HTLC, NULL)), CHECK_MSG(transaction_wrap(w->db, wallet_htlc_update(w, in.dbid, RCVD_ADD_HTLC, NULL, 0, NULL)),
"Update HTLC with null payment_key failed"); "Update HTLC with null payment_key failed");
CHECK_MSG( CHECK_MSG(
transaction_wrap(w->db, wallet_htlc_update(w, in.dbid, SENT_REMOVE_HTLC, &payment_key)), transaction_wrap(w->db, wallet_htlc_update(w, in.dbid, SENT_REMOVE_HTLC, &payment_key, 0, NULL)),
"Update HTLC with payment_key failed"); "Update HTLC with payment_key failed");
CHECK_MSG(
transaction_wrap(w->db, wallet_htlc_update(w, in.dbid, SENT_REMOVE_HTLC, NULL, 0, tal_arrz(tmpctx, u8, 100))),
"Update HTLC with failreason failed");
CHECK_MSG(transaction_wrap(w->db, wallet_htlc_save_out(w, chan, &out)), CHECK_MSG(transaction_wrap(w->db, wallet_htlc_save_out(w, chan, &out)),
tal_fmt(ctx, "Save htlc_out failed: %s", wallet_err)); tal_fmt(ctx, "Save htlc_out failed: %s", wallet_err));

19
wallet/wallet.c

@ -1248,7 +1248,8 @@ void wallet_htlc_save_out(struct wallet *wallet,
void wallet_htlc_update(struct wallet *wallet, const u64 htlc_dbid, void wallet_htlc_update(struct wallet *wallet, const u64 htlc_dbid,
const enum htlc_state new_state, const enum htlc_state new_state,
const struct preimage *payment_key) const struct preimage *payment_key,
enum onion_type failcode, const u8 *failuremsg)
{ {
sqlite3_stmt *stmt; sqlite3_stmt *stmt;
@ -1257,17 +1258,25 @@ void wallet_htlc_update(struct wallet *wallet, const u64 htlc_dbid,
assert(htlc_dbid); assert(htlc_dbid);
stmt = db_prepare( stmt = db_prepare(
wallet->db, wallet->db,
"UPDATE channel_htlcs SET hstate=?, payment_key=? WHERE id=?"); "UPDATE channel_htlcs SET hstate=?, payment_key=?, malformed_onion=?, failuremsg=? WHERE id=?");
/* FIXME: htlc_state_in_db */ /* FIXME: htlc_state_in_db */
sqlite3_bind_int(stmt, 1, new_state); sqlite3_bind_int(stmt, 1, new_state);
sqlite3_bind_int64(stmt, 3, htlc_dbid); sqlite3_bind_int64(stmt, 5, htlc_dbid);
if (payment_key) if (payment_key)
sqlite3_bind_preimage(stmt, 2, payment_key); sqlite3_bind_preimage(stmt, 2, payment_key);
else else
sqlite3_bind_null(stmt, 2); sqlite3_bind_null(stmt, 2);
sqlite3_bind_int(stmt, 3, failcode);
if (failuremsg)
sqlite3_bind_blob(stmt, 4,
failuremsg, tal_bytelen(failuremsg),
SQLITE_TRANSIENT);
else
sqlite3_bind_null(stmt, 4);
db_exec_prepared(wallet->db, stmt); db_exec_prepared(wallet->db, stmt);
} }
@ -1353,6 +1362,7 @@ static bool wallet_stmt2htlc_out(struct channel *channel,
return ok; return ok;
} }
#ifdef COMPAT_V061
/* We didn't used to save failcore, failuremsg... */ /* We didn't used to save failcore, failuremsg... */
static void fixup_hin(struct wallet *wallet, struct htlc_in *hin) static void fixup_hin(struct wallet *wallet, struct htlc_in *hin)
{ {
@ -1380,6 +1390,7 @@ static void fixup_hin(struct wallet *wallet, struct htlc_in *hin)
type_to_string(tmpctx, struct pubkey, type_to_string(tmpctx, struct pubkey,
&hin->key.channel->peer->id)); &hin->key.channel->peer->id));
} }
#endif
bool wallet_htlcs_load_for_channel(struct wallet *wallet, bool wallet_htlcs_load_for_channel(struct wallet *wallet,
struct channel *chan, struct channel *chan,
@ -1405,7 +1416,9 @@ bool wallet_htlcs_load_for_channel(struct wallet *wallet,
struct htlc_in *in = tal(chan, struct htlc_in); struct htlc_in *in = tal(chan, struct htlc_in);
ok &= wallet_stmt2htlc_in(chan, stmt, in); ok &= wallet_stmt2htlc_in(chan, stmt, in);
connect_htlc_in(htlcs_in, in); connect_htlc_in(htlcs_in, in);
#ifdef COMPAT_V061
fixup_hin(wallet, in); fixup_hin(wallet, in);
#endif
ok &= htlc_in_check(in, NULL) != NULL; ok &= htlc_in_check(in, NULL) != NULL;
incount++; incount++;
} }

7
wallet/wallet.h

@ -454,14 +454,17 @@ void wallet_htlc_save_out(struct wallet *wallet,
* @new_state: the state we should transition to * @new_state: the state we should transition to
* @payment_key: the `payment_key` which hashes to the `payment_hash`, * @payment_key: the `payment_key` which hashes to the `payment_hash`,
* or NULL if unknown. * or NULL if unknown.
* @failcode: the current failure code, or 0.
* @failuremsg: the current failure message (from peer), or NULL.
* *
* Used to update the state of an HTLC, either a `struct htlc_in` or a * Used to update the state of an HTLC, either a `struct htlc_in` or a
* `struct htlc_out` and optionally set the `payment_key` should the * `struct htlc_out` and optionally set the `payment_key` should the
* HTLC have been settled. * HTLC have been settled, or `failcode`/`failuremsg` if failed.
*/ */
void wallet_htlc_update(struct wallet *wallet, const u64 htlc_dbid, void wallet_htlc_update(struct wallet *wallet, const u64 htlc_dbid,
const enum htlc_state new_state, const enum htlc_state new_state,
const struct preimage *payment_key); const struct preimage *payment_key,
enum onion_type failcode, const u8 *failuremsg);
/** /**
* wallet_htlcs_load_for_channel - Load HTLCs associated with chan from DB. * wallet_htlcs_load_for_channel - Load HTLCs associated with chan from DB.

Loading…
Cancel
Save