Browse Source

db: add partid field to htlc_out.

This is in preparation for partial payments.  For existing payments,
partid is 0 (to match the corresponding payment).

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
travis-debug
Rusty Russell 5 years ago
committed by Christian Decker
parent
commit
345ca9b122
  1. 3
      lightningd/htlc_end.c
  2. 4
      lightningd/htlc_end.h
  3. 30
      lightningd/pay.c
  4. 9
      lightningd/peer_htlcs.c
  5. 1
      lightningd/peer_htlcs.h
  6. 2
      wallet/db.c
  7. 15
      wallet/wallet.c

3
lightningd/htlc_end.c

@ -252,6 +252,7 @@ struct htlc_out *new_htlc_out(const tal_t *ctx,
const struct sha256 *payment_hash,
const u8 *onion_routing_packet,
bool am_origin,
u64 partid,
struct htlc_in *in)
{
struct htlc_out *hout = tal(ctx, struct htlc_out);
@ -273,6 +274,8 @@ struct htlc_out *new_htlc_out(const tal_t *ctx,
hout->preimage = NULL;
hout->am_origin = am_origin;
if (am_origin)
hout->partid = partid;
hout->in = NULL;
if (in)
htlc_out_connect_htlc_in(hout, in);

4
lightningd/htlc_end.h

@ -82,6 +82,9 @@ struct htlc_out {
/* Is this a locally-generated payment? Implies ->in is NULL. */
bool am_origin;
/* If am_origin, this is the partid of the payment. */
u64 partid;
/* Where it's from, if not going to us. */
struct htlc_in *in;
};
@ -140,6 +143,7 @@ struct htlc_out *new_htlc_out(const tal_t *ctx,
const struct sha256 *payment_hash,
const u8 *onion_routing_packet,
bool am_origin,
u64 partid,
struct htlc_in *in);
void connect_htlc_in(struct htlc_in_map *map, struct htlc_in *hin);

30
lightningd/pay.c

@ -503,7 +503,7 @@ void payment_failed(struct lightningd *ld, const struct htlc_out *hout,
payment = wallet_payment_by_hash(tmpctx, ld->wallet,
&hout->payment_hash,
/* FIXME: Set partid! */0);
hout->partid);
#ifdef COMPAT_V052
/* Prior to "pay: delete HTLC when we delete payment." we would
@ -573,11 +573,13 @@ void payment_failed(struct lightningd *ld, const struct htlc_out *hout,
}
/* Save to DB */
payment_store(ld, &hout->payment_hash, /* FIXME: Set partid! */ 0);
wallet_payment_set_status(ld->wallet, &hout->payment_hash, /* FIXME: Set partid! */ 0,
payment_store(ld, &hout->payment_hash, hout->partid);
wallet_payment_set_status(ld->wallet, &hout->payment_hash,
hout->partid,
PAYMENT_FAILED, NULL);
wallet_payment_set_failinfo(ld->wallet,
&hout->payment_hash, /* FIXME: Set partid! */ 0,
&hout->payment_hash,
hout->partid,
fail ? NULL : hout->failuremsg,
pay_errcode == PAY_DESTINATION_PERM_FAIL,
fail ? fail->erring_index : -1,
@ -697,19 +699,20 @@ static bool should_use_tlv(enum route_hop_style style)
}
static enum onion_type send_onion(struct lightningd *ld,
const struct onionpacket *packet,
const struct route_hop *first_hop,
const struct sha256 *payment_hash,
struct channel *channel,
struct htlc_out **hout)
const struct onionpacket *packet,
const struct route_hop *first_hop,
const struct sha256 *payment_hash,
u64 partid,
struct channel *channel,
struct htlc_out **hout)
{
const u8 *onion;
unsigned int base_expiry;
base_expiry = get_block_height(ld->topology) + 1;
onion = serialize_onionpacket(tmpctx, packet);
return send_htlc_out(channel, first_hop->amount,
base_expiry + first_hop->delay,
payment_hash, onion, NULL, hout);
base_expiry + first_hop->delay,
payment_hash, partid, onion, NULL, hout);
}
/* Returns command_result if cmd was resolved, NULL if not yet called. */
@ -840,7 +843,8 @@ send_payment(struct lightningd *ld,
}
packet = create_onionpacket(tmpctx, path, &path_secrets);
failcode = send_onion(ld, packet, &route[0], rhash, channel, &hout);
failcode = send_onion(ld, packet, &route[0], rhash, partid,
channel, &hout);
log_info(ld->log, "Sending %s over %zu hops to deliver %s",
type_to_string(tmpctx, struct amount_msat, &route[0].amount),
n_hops, type_to_string(tmpctx, struct amount_msat, &msat));
@ -1048,7 +1052,7 @@ static struct command_result *json_sendonion(struct command *cmd,
wallet_local_htlc_out_delete(ld->wallet, channel, payment_hash, /* FIXME: Set partid! */0);
}
failcode = send_onion(cmd->ld, &packet, first_hop, payment_hash, channel,
failcode = send_onion(cmd->ld, &packet, first_hop, payment_hash, /* FIXME: Set partid! */0, channel,
&hout);
payment = tal(hout, struct wallet_payment);

9
lightningd/peer_htlcs.c

@ -452,6 +452,7 @@ static void htlc_offer_timeout(struct channel *channel)
enum onion_type send_htlc_out(struct channel *out,
struct amount_msat amount, u32 cltv,
const struct sha256 *payment_hash,
u64 partid,
const u8 *onion_routing_packet,
struct htlc_in *in,
struct htlc_out **houtp)
@ -479,7 +480,8 @@ enum onion_type send_htlc_out(struct channel *out,
/* Make peer's daemon own it, catch if it dies. */
hout = new_htlc_out(out->owner, out, amount, cltv,
payment_hash, onion_routing_packet, in == NULL, in);
payment_hash, onion_routing_packet, in == NULL,
partid, in);
tal_add_destructor(hout, destroy_hout_subd_died);
/* Give channel 30 seconds to commit (first) htlc. */
@ -590,7 +592,7 @@ static void forward_htlc(struct htlc_in *hin,
hout = tal(tmpctx, struct htlc_out);
failcode = send_htlc_out(next, amt_to_forward,
outgoing_cltv_value, &hin->payment_hash,
next_onion, hin, &hout);
0, next_onion, hin, &hout);
if (!failcode)
return;
@ -1274,8 +1276,7 @@ static bool update_out_htlc(struct channel *channel,
/* For our own HTLCs, we commit payment to db lazily */
if (hout->origin_htlc_id == 0)
payment_store(ld,
&hout->payment_hash,
/* FIXME: Set partid! */ 0);
&hout->payment_hash, hout->partid);
}
if (!htlc_out_update_state(channel, hout, newstate))

1
lightningd/peer_htlcs.h

@ -51,6 +51,7 @@ void update_per_commit_point(struct channel *channel,
enum onion_type send_htlc_out(struct channel *out,
struct amount_msat amount, u32 cltv,
const struct sha256 *payment_hash,
u64 partid,
const u8 *onion_routing_packet,
struct htlc_in *in,
struct htlc_out **houtp);

2
wallet/db.c

@ -559,6 +559,8 @@ static struct migration dbmigrations[] = {
{SQL("UPDATE payments SET total_msat = msatoshi;"), NULL},
{SQL("UPDATE payments SET partid = 0;"), NULL},
{SQL("DROP TABLE temp_payments;"), NULL},
{SQL("ALTER TABLE channel_htlcs ADD partid BIGINT;"), NULL},
{SQL("UPDATE channel_htlcs SET partid = 0;"), NULL},
};
/* Leak tracking. */

15
wallet/wallet.c

@ -1661,7 +1661,8 @@ void wallet_htlc_save_out(struct wallet *wallet,
" payment_hash,"
" payment_key,"
" hstate,"
" routing_onion) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?);"));
" routing_onion,"
" partid) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);"));
db_bind_u64(stmt, 0, chan->dbid);
db_bind_u64(stmt, 1, out->key.id);
@ -1682,6 +1683,10 @@ 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)
db_bind_null(stmt, 10);
else
db_bind_u64(stmt, 10, out->partid);
db_exec_prepared_v2(stmt);
out->dbid = db_last_insert_id_v2(stmt);
@ -1796,6 +1801,7 @@ static bool wallet_stmt2htlc_out(struct channel *channel,
out->am_origin = false;
} else {
out->origin_htlc_id = 0;
out->partid = db_column_u64(stmt, 13);
out->am_origin = true;
}
@ -1900,6 +1906,7 @@ bool wallet_htlcs_load_for_channel(struct wallet *wallet,
", origin_htlc"
", shared_secret"
", received_time"
", partid"
" FROM channel_htlcs"
" WHERE direction = ?"
" AND channel_id = ?"
@ -2047,15 +2054,15 @@ void wallet_local_htlc_out_delete(struct wallet *wallet,
{
struct db_stmt *stmt;
/* FIXME: Put partid into locally-generated htlc_out, select here! */
stmt = db_prepare_v2(wallet->db, SQL("DELETE FROM channel_htlcs"
" WHERE direction = ?"
" AND origin_htlc = ?"
" AND payment_hash = ?"));
" AND payment_hash = ?"
" AND partid = ?;"));
db_bind_int(stmt, 0, DIRECTION_OUTGOING);
db_bind_int(stmt, 1, 0);
db_bind_sha256(stmt, 2, payment_hash);
db_bind_u64(stmt, 3, partid);
db_exec_prepared_v2(take(stmt));
}

Loading…
Cancel
Save