paymod: Iterate through the routehints in order

We store an offset of the current routehint in the modifier data. It gets
incremented on retry, and it gets reset to 0 on split. This is because once we
split we have a different amount and a previously unusable routehint becomes
usable again.
This commit is contained in:
Christian Decker
2020-07-23 11:43:11 +02:00
parent 1e28d661fd
commit 56dd18e01e
2 changed files with 14 additions and 4 deletions

View File

@@ -1771,15 +1771,13 @@ static struct route_info *next_routehint(struct routehints_data *d,
struct payment *p)
{
size_t numhints = tal_count(d->routehints);
size_t offset;
struct route_info *curr;
if (d->routehints == NULL || numhints == 0)
return NULL;
offset = pseudorand(numhints);
for (size_t i=0; i<tal_count(d->routehints); i++) {
curr = d->routehints[(offset + i) % numhints];
for (; d->offset <numhints; d->offset++) {
curr = d->routehints[d->offset];
if (curr == NULL || !routehint_excluded(p, curr))
return curr;
}
@@ -1971,10 +1969,17 @@ static struct routehints_data *routehint_data_init(struct payment *p)
pd = payment_mod_routehints_get_data(payment_root(p));
d->destination_reachable = pd->destination_reachable;
d->routehints = pd->routehints;
if (p->parent->step == PAYMENT_STEP_RETRY)
d->offset = pd->offset + 1;
else
d->offset = 0;
return d;
} else {
/* We defer the actual initialization of the routehints array to
* the step callback when we have the invoice attached. */
d->routehints = NULL;
d->offset = 0;
return d;
}
return d;
}

View File

@@ -296,6 +296,11 @@ struct routehints_data {
/* Current routehint, if any. */
struct route_info *current_routehint;
/* Position of the current routehint in the routehints
* array. Inherited and incremented on child payments and reset on
* split. */
int offset;
/* We modify the CLTV in the getroute call, so we need to remember
* what the final cltv delta was so we re-apply it correctly. */
u32 final_cltv;