mirror of
https://github.com/ElementsProject/lightning.git
synced 2024-11-19 01:43:36 +01:00
db: Add groupid
to HTLCs
This commit is contained in:
parent
0bb0d8a707
commit
817b1b361e
@ -277,6 +277,7 @@ struct htlc_out *new_htlc_out(const tal_t *ctx,
|
||||
const struct pubkey *blinding,
|
||||
bool am_origin,
|
||||
u64 partid,
|
||||
u64 groupid,
|
||||
struct htlc_in *in)
|
||||
{
|
||||
struct htlc_out *hout = tal(ctx, struct htlc_out);
|
||||
@ -303,8 +304,10 @@ struct htlc_out *new_htlc_out(const tal_t *ctx,
|
||||
else
|
||||
hout->blinding = NULL;
|
||||
hout->am_origin = am_origin;
|
||||
if (am_origin)
|
||||
if (am_origin) {
|
||||
hout->partid = partid;
|
||||
hout->groupid = groupid;
|
||||
}
|
||||
hout->in = NULL;
|
||||
if (in)
|
||||
htlc_out_connect_htlc_in(hout, in);
|
||||
|
@ -91,6 +91,9 @@ struct htlc_out {
|
||||
/* If am_origin, this is the partid of the payment. */
|
||||
u64 partid;
|
||||
|
||||
/* Is this is part of a group of HTLCs, which group is it? */
|
||||
u64 groupid;
|
||||
|
||||
/* Where it's from, if not going to us. */
|
||||
struct htlc_in *in;
|
||||
|
||||
@ -163,6 +166,7 @@ struct htlc_out *new_htlc_out(const tal_t *ctx,
|
||||
const struct pubkey *blinding,
|
||||
bool am_origin,
|
||||
u64 partid,
|
||||
u64 groupid,
|
||||
struct htlc_in *in);
|
||||
|
||||
void connect_htlc_in(struct htlc_in_map *map, struct htlc_in *hin);
|
||||
|
@ -323,7 +323,7 @@ void payment_succeeded(struct lightningd *ld, struct htlc_out *hout,
|
||||
struct wallet_payment *payment;
|
||||
|
||||
wallet_payment_set_status(ld->wallet, &hout->payment_hash,
|
||||
hout->partid,
|
||||
hout->partid, hout->groupid,
|
||||
PAYMENT_COMPLETE, rval);
|
||||
payment = wallet_payment_by_hash(tmpctx, ld->wallet,
|
||||
&hout->payment_hash,
|
||||
@ -627,7 +627,7 @@ void payment_failed(struct lightningd *ld, const struct htlc_out *hout,
|
||||
/* Save to DB */
|
||||
payment_store(ld, payment);
|
||||
wallet_payment_set_status(ld->wallet, &hout->payment_hash,
|
||||
hout->partid,
|
||||
hout->partid, hout->groupid,
|
||||
PAYMENT_FAILED, NULL);
|
||||
wallet_payment_set_failinfo(ld->wallet,
|
||||
&hout->payment_hash,
|
||||
@ -767,6 +767,7 @@ static const u8 *send_onion(const tal_t *ctx, struct lightningd *ld,
|
||||
const struct sha256 *payment_hash,
|
||||
const struct pubkey *blinding,
|
||||
u64 partid,
|
||||
u64 groupid,
|
||||
struct channel *channel,
|
||||
struct htlc_out **hout)
|
||||
{
|
||||
@ -776,8 +777,8 @@ static const u8 *send_onion(const tal_t *ctx, struct lightningd *ld,
|
||||
base_expiry = get_block_height(ld->topology) + 1;
|
||||
onion = serialize_onionpacket(tmpctx, packet);
|
||||
return send_htlc_out(ctx, channel, first_hop->amount,
|
||||
base_expiry + first_hop->delay,
|
||||
payment_hash, blinding, partid, onion, NULL, hout,
|
||||
base_expiry + first_hop->delay, payment_hash,
|
||||
blinding, partid, groupid, onion, NULL, hout,
|
||||
&dont_care_about_channel_update);
|
||||
}
|
||||
|
||||
@ -1010,7 +1011,7 @@ send_payment_core(struct lightningd *ld,
|
||||
}
|
||||
|
||||
failmsg = send_onion(tmpctx, ld, packet, first_hop, rhash, NULL, partid,
|
||||
channel, &hout);
|
||||
group, channel, &hout);
|
||||
|
||||
if (failmsg) {
|
||||
fail = immediate_routing_failure(cmd, ld,
|
||||
|
@ -621,6 +621,7 @@ const u8 *send_htlc_out(const tal_t *ctx,
|
||||
const struct sha256 *payment_hash,
|
||||
const struct pubkey *blinding,
|
||||
u64 partid,
|
||||
u64 groupid,
|
||||
const u8 *onion_routing_packet,
|
||||
struct htlc_in *in,
|
||||
struct htlc_out **houtp,
|
||||
@ -654,7 +655,7 @@ const u8 *send_htlc_out(const tal_t *ctx,
|
||||
*houtp = new_htlc_out(out->owner, out, amount, cltv,
|
||||
payment_hash, onion_routing_packet,
|
||||
blinding, in == NULL,
|
||||
partid, in);
|
||||
partid, groupid, in);
|
||||
tal_add_destructor(*houtp, destroy_hout_subd_died);
|
||||
|
||||
/* Give channel 30 seconds to commit this htlc. */
|
||||
@ -766,8 +767,8 @@ static void forward_htlc(struct htlc_in *hin,
|
||||
|
||||
failmsg = send_htlc_out(tmpctx, next, amt_to_forward,
|
||||
outgoing_cltv_value, &hin->payment_hash,
|
||||
next_blinding, 0, next_onion, hin,
|
||||
&hout, &needs_update_appended);
|
||||
next_blinding, 0 /* partid */, 0 /* groupid */,
|
||||
next_onion, hin, &hout, &needs_update_appended);
|
||||
if (!failmsg)
|
||||
return;
|
||||
|
||||
|
@ -46,6 +46,7 @@ const u8 *send_htlc_out(const tal_t *ctx,
|
||||
const struct sha256 *payment_hash,
|
||||
const struct pubkey *blinding,
|
||||
u64 partid,
|
||||
u64 groupid,
|
||||
const u8 *onion_routing_packet,
|
||||
struct htlc_in *in,
|
||||
struct htlc_out **houtp,
|
||||
|
@ -832,6 +832,9 @@ static struct migration dbmigrations[] = {
|
||||
", 0"
|
||||
", local_offer_id FROM temp_payments;"), NULL},
|
||||
{SQL("DROP TABLE temp_payments;"), NULL},
|
||||
/* HTLCs also need to carry the groupid around so we can
|
||||
* selectively update them. */
|
||||
{SQL("ALTER TABLE channel_htlcs ADD groupid BIGINT;"), NULL},
|
||||
};
|
||||
|
||||
/* Leak tracking. */
|
||||
|
@ -1820,6 +1820,7 @@ static bool test_payment_crud(struct lightningd *ld, const tal_t *ctx)
|
||||
t->payment_preimage = NULL;
|
||||
memset(&t->payment_hash, 1, sizeof(t->payment_hash));
|
||||
t->partid = 0;
|
||||
t->groupid = 0;
|
||||
|
||||
db_begin_transaction(w->db);
|
||||
t2 = tal_dup(NULL, struct wallet_payment, t);
|
||||
@ -1839,8 +1840,8 @@ static bool test_payment_crud(struct lightningd *ld, const tal_t *ctx)
|
||||
t->status = PAYMENT_COMPLETE;
|
||||
t->payment_preimage = tal(w, struct preimage);
|
||||
memset(t->payment_preimage, 2, sizeof(*t->payment_preimage));
|
||||
wallet_payment_set_status(w, &t->payment_hash, t->partid, t->status,
|
||||
t->payment_preimage);
|
||||
wallet_payment_set_status(w, &t->payment_hash, t->partid, t->groupid,
|
||||
t->status, t->payment_preimage);
|
||||
t2 = wallet_payment_by_hash(ctx, w, &t->payment_hash, t->partid);
|
||||
CHECK(t2 != NULL);
|
||||
CHECK(t2->status == t->status);
|
||||
|
@ -2368,7 +2368,9 @@ void wallet_htlc_save_out(struct wallet *wallet,
|
||||
" hstate,"
|
||||
" routing_onion,"
|
||||
" malformed_onion,"
|
||||
" partid) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 0, ?);"));
|
||||
" partid,"
|
||||
" groupid"
|
||||
") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 0, ?, ?);"));
|
||||
|
||||
db_bind_u64(stmt, 0, chan->dbid);
|
||||
db_bind_u64(stmt, 1, out->key.id);
|
||||
@ -2389,10 +2391,15 @@ void wallet_htlc_save_out(struct wallet *wallet,
|
||||
|
||||
db_bind_blob(stmt, 9, out->onion_routing_packet,
|
||||
sizeof(out->onion_routing_packet));
|
||||
if (!out->am_origin)
|
||||
|
||||
/* groupid and partid are only relevant when we are the origin */
|
||||
if (!out->am_origin) {
|
||||
db_bind_null(stmt, 10);
|
||||
else
|
||||
db_bind_null(stmt, 11);
|
||||
} else {
|
||||
db_bind_u64(stmt, 10, out->partid);
|
||||
db_bind_u64(stmt, 11, out->groupid);
|
||||
}
|
||||
|
||||
db_exec_prepared_v2(stmt);
|
||||
out->dbid = db_last_insert_id_v2(stmt);
|
||||
@ -2587,6 +2594,7 @@ static bool wallet_stmt2htlc_out(struct wallet *wallet,
|
||||
}
|
||||
} else {
|
||||
out->partid = db_column_u64(stmt, 13);
|
||||
out->groupid = db_column_u64(stmt, 15);
|
||||
out->am_origin = true;
|
||||
}
|
||||
|
||||
@ -2697,6 +2705,7 @@ bool wallet_htlcs_load_out_for_channel(struct wallet *wallet,
|
||||
", received_time"
|
||||
", partid"
|
||||
", localfailmsg"
|
||||
", groupid"
|
||||
" FROM channel_htlcs"
|
||||
" WHERE direction = ?"
|
||||
" AND channel_id = ?"
|
||||
@ -3181,7 +3190,7 @@ wallet_payment_by_hash(const tal_t *ctx, struct wallet *wallet,
|
||||
|
||||
void wallet_payment_set_status(struct wallet *wallet,
|
||||
const struct sha256 *payment_hash,
|
||||
u64 partid,
|
||||
u64 partid, u64 groupid,
|
||||
const enum wallet_payment_status newstatus,
|
||||
const struct preimage *preimage)
|
||||
{
|
||||
@ -3198,21 +3207,23 @@ void wallet_payment_set_status(struct wallet *wallet,
|
||||
|
||||
stmt = db_prepare_v2(wallet->db,
|
||||
SQL("UPDATE payments SET status=? "
|
||||
"WHERE payment_hash=? AND partid=?"));
|
||||
"WHERE payment_hash=? AND partid=? AND groupid=?"));
|
||||
|
||||
db_bind_int(stmt, 0, wallet_payment_status_in_db(newstatus));
|
||||
db_bind_sha256(stmt, 1, payment_hash);
|
||||
db_bind_u64(stmt, 2, partid);
|
||||
db_bind_u64(stmt, 3, groupid);
|
||||
db_exec_prepared_v2(take(stmt));
|
||||
|
||||
if (preimage) {
|
||||
stmt = db_prepare_v2(wallet->db,
|
||||
SQL("UPDATE payments SET payment_preimage=? "
|
||||
"WHERE payment_hash=? AND partid=?"));
|
||||
"WHERE payment_hash=? AND partid=? AND groupid=?"));
|
||||
|
||||
db_bind_preimage(stmt, 0, preimage);
|
||||
db_bind_sha256(stmt, 1, payment_hash);
|
||||
db_bind_u64(stmt, 2, partid);
|
||||
db_bind_u64(stmt, 3, groupid);
|
||||
db_exec_prepared_v2(take(stmt));
|
||||
}
|
||||
if (newstatus != PAYMENT_PENDING) {
|
||||
@ -3222,9 +3233,10 @@ void wallet_payment_set_status(struct wallet *wallet,
|
||||
" , route_nodes = NULL"
|
||||
" , route_channels = NULL"
|
||||
" WHERE payment_hash = ?"
|
||||
" AND partid = ?;"));
|
||||
" AND partid = ? AND groupid=?;"));
|
||||
db_bind_sha256(stmt, 0, payment_hash);
|
||||
db_bind_u64(stmt, 1, partid);
|
||||
db_bind_u64(stmt, 2, groupid);
|
||||
db_exec_prepared_v2(take(stmt));
|
||||
}
|
||||
}
|
||||
|
@ -1067,7 +1067,7 @@ u64 wallet_payment_get_groupid(struct wallet *wallet,
|
||||
*/
|
||||
void wallet_payment_set_status(struct wallet *wallet,
|
||||
const struct sha256 *payment_hash,
|
||||
u64 partid,
|
||||
u64 partid, u64 groupid,
|
||||
const enum wallet_payment_status newstatus,
|
||||
const struct preimage *preimage);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user