Browse Source

paymod: Consolidate channel_hint creation in channel_hints_update

As the hints get new fields added it is easy to forget to amend one of the
places we create them, since we already have an update method let's use that
to handle all additions to the array of known channel hints.
fixup-0.9.0
Christian Decker 4 years ago
parent
commit
89cb5a6aea
  1. 126
      plugins/libplugin-pay.c

126
plugins/libplugin-pay.c

@ -179,12 +179,63 @@ void payment_start(struct payment *p)
payment_rpc_failure, p));
}
static void payment_exclude_most_expensive(struct payment *p)
static void channel_hints_update(struct payment *p,
const struct short_channel_id scid,
int direction, bool enabled, bool local,
struct amount_msat *estimated_capacity,
u16 *htlc_budget)
{
struct payment *root = payment_root(p);
struct channel_hint hint;
/* If the channel is marked as enabled it must have an estimate. */
assert(!enabled || estimated_capacity != NULL);
/* Try and look for an existing hint: */
for (size_t i=0; i<tal_count(root->channel_hints); i++) {
struct channel_hint *hint = &root->channel_hints[i];
if (short_channel_id_eq(&hint->scid.scid, &scid) &&
hint->scid.dir == direction) {
/* Prefer to disable a channel. */
hint->enabled = hint->enabled & enabled;
/* Prefer the more conservative estimate. */
if (estimated_capacity != NULL &&
amount_msat_greater(hint->estimated_capacity,
*estimated_capacity))
hint->estimated_capacity = *estimated_capacity;
if (htlc_budget != NULL && *htlc_budget < hint->htlc_budget)
hint->htlc_budget = *htlc_budget;
return;
}
}
/* No hint found, create one. */
hint.enabled = enabled;
hint.scid.scid = scid;
hint.scid.dir = direction;
hint.local = local;
if (estimated_capacity != NULL)
hint.estimated_capacity = *estimated_capacity;
if (htlc_budget != NULL)
hint.htlc_budget = *htlc_budget;
tal_arr_expand(&root->channel_hints, hint);
plugin_log(
root->plugin, LOG_DBG,
"Added a channel hint for %s: enabled %s, estimated capacity %s",
type_to_string(tmpctx, struct short_channel_id_dir, &hint.scid),
hint.enabled ? "true" : "false",
type_to_string(tmpctx, struct amount_msat,
&hint.estimated_capacity));
}
static void payment_exclude_most_expensive(struct payment *p)
{
struct route_hop *e = &p->route[0];
struct amount_msat fee, worst = AMOUNT_MSAT(0);
struct channel_hint hint;
for (size_t i = 0; i < tal_count(p->route)-1; i++) {
if (!amount_msat_sub(&fee, p->route[i].amount, p->route[i+1].amount))
@ -195,19 +246,14 @@ static void payment_exclude_most_expensive(struct payment *p)
worst = fee;
}
}
hint.scid.scid = e->channel_id;
hint.scid.dir = e->direction;
hint.enabled = false;
hint.local = false;
tal_arr_expand(&root->channel_hints, hint);
channel_hints_update(p, e->channel_id, e->direction, false, false,
NULL, NULL);
}
static void payment_exclude_longest_delay(struct payment *p)
{
struct payment *root = payment_root(p);
struct route_hop *e = &p->route[0];
u32 delay, worst = 0;
struct channel_hint hint;
for (size_t i = 0; i < tal_count(p->route)-1; i++) {
delay = p->route[i].delay - p->route[i+1].delay;
@ -216,11 +262,8 @@ static void payment_exclude_longest_delay(struct payment *p)
worst = delay;
}
}
hint.scid.scid = e->channel_id;
hint.scid.dir = e->direction;
hint.enabled = false;
hint.local = false;
tal_arr_expand(&root->channel_hints, hint);
channel_hints_update(p, e->channel_id, e->direction, false, false,
NULL, NULL);
}
static struct amount_msat payment_route_fee(struct payment *p)
@ -605,46 +648,6 @@ fail:
return tal_free(result);
}
static void channel_hints_update(struct payment *root,
const struct short_channel_id *scid,
int direction,
bool enabled,
struct amount_msat estimated_capacity)
{
struct channel_hint hint;
/* Try and look for an existing hint: */
for (size_t i=0; i<tal_count(root->channel_hints); i++) {
struct channel_hint *hint = &root->channel_hints[i];
if (short_channel_id_eq(&hint->scid.scid, scid) &&
hint->scid.dir == direction) {
/* Prefer to disable a channel. */
hint->enabled = hint->enabled & enabled;
/* Prefer the more conservative estimate. */
if (amount_msat_greater(hint->estimated_capacity,
estimated_capacity))
hint->estimated_capacity = estimated_capacity;
return;
}
}
/* No hint found, create one. */
hint.enabled = enabled;
hint.scid.scid = *scid;
hint.scid.dir = direction;
hint.estimated_capacity = estimated_capacity;
hint.local = false;
tal_arr_expand(&root->channel_hints, hint);
plugin_log(
root->plugin, LOG_DBG,
"Added a channel hint for %s: enabled %s, estimated capacity %s",
type_to_string(tmpctx, struct short_channel_id_dir, &hint.scid),
hint.enabled ? "true" : "false",
type_to_string(tmpctx, struct amount_msat,
&hint.estimated_capacity));
}
/* Try to infer the erring_node, erring_channel and erring_direction from what
* we know, but don't override the values that are returned by `waitsendpay`. */
static void payment_result_infer(struct route_hop *route,
@ -825,9 +828,9 @@ handle_intermediate_failure(struct command *cmd,
case WIRE_UNKNOWN_NEXT_PEER:
case WIRE_REQUIRED_CHANNEL_FEATURE_MISSING:
/* All of these result in the channel being marked as disabled. */
channel_hints_update(root,
&errchan->channel_id, errchan->direction,
false, AMOUNT_MSAT(0));
channel_hints_update(root, errchan->channel_id,
errchan->direction, false, false, NULL,
NULL);
break;
case WIRE_TEMPORARY_CHANNEL_FAILURE: {
@ -835,9 +838,9 @@ handle_intermediate_failure(struct command *cmd,
* remember the amount we tried as an estimate. */
struct amount_msat est = errchan->amount;
est.millisatoshis *= 0.75; /* Raw: Multiplication */
channel_hints_update(root,
&errchan->channel_id, errchan->direction,
true, est);
channel_hints_update(root, errchan->channel_id,
errchan->direction, true, false, &est,
NULL);
goto error;
}
@ -1661,7 +1664,8 @@ local_channel_hints_listpeers(struct command *cmd, const char *buffer,
h.htlc_budget -= htlcs->size;
h.local = true;
tal_arr_expand(&p->channel_hints, h);
channel_hints_update(p, h.scid.scid, h.scid.dir,
h.enabled, true, &h.estimated_capacity, &h.htlc_budget);
}
}

Loading…
Cancel
Save