renepay: global record of computed routes

Use a single global map of computed routes instead of one for each
payment.

Signed-off-by: Lagrang3 <lagrang3@protonmail.com>
This commit is contained in:
Lagrang3 2024-05-29 20:20:18 +01:00 committed by ShahanaFarooqui
parent 8b2d45e52e
commit ec431276ac
4 changed files with 22 additions and 53 deletions

View file

@ -32,7 +32,7 @@ static void memleak_mark(struct plugin *p, struct htable *memtable)
memleak_scan_htable(memtable,
&pay_plugin->uncertainty->chan_extra_map->raw);
memleak_scan_htable(memtable, &pay_plugin->payment_map->raw);
memleak_scan_htable(memtable, &pay_plugin->route_map->raw);
memleak_scan_htable(memtable, &pay_plugin->pending_routes->raw);
}
static const char *init(struct plugin *p,
@ -70,8 +70,8 @@ static const char *init(struct plugin *p,
pay_plugin->payment_map = tal(pay_plugin, struct payment_map);
payment_map_init(pay_plugin->payment_map);
pay_plugin->route_map = tal(pay_plugin,struct route_map);
route_map_init(pay_plugin->route_map);
pay_plugin->pending_routes = tal(pay_plugin, struct route_map);
route_map_init(pay_plugin->pending_routes);
pay_plugin->gossmap = gossmap_load(pay_plugin,
GOSSIP_STORE_FILENAME,

View file

@ -64,7 +64,7 @@ struct pay_plugin {
struct uncertainty *uncertainty;
/* Pending sendpays (to match notifications to). */
struct route_map *route_map;
struct route_map *pending_routes;
bool debug_mcf;
bool debug_payflow;

View file

@ -25,9 +25,6 @@ struct routetracker *new_routetracker(const tal_t *ctx, struct payment *payment)
rt->sent_routes = tal(rt, struct route_map);
route_map_init(rt->sent_routes);
rt->pending_routes = tal(rt, struct route_map);
route_map_init(rt->pending_routes);
rt->finalized_routes = tal_arr(rt, struct route *, 0);
return rt;
}
@ -46,11 +43,6 @@ void routetracker_cleanup(struct routetracker *routetracker)
static void routetracker_add_to_final(struct routetracker *routetracker,
struct route *route)
{
if (!route_map_del(routetracker->pending_routes, route))
plugin_err(pay_plugin->plugin,
"%s: route with key %s is not in pending_routes",
__PRETTY_FUNCTION__,
fmt_routekey(tmpctx, &route->key));
tal_arr_expand(&routetracker->finalized_routes, route);
tal_steal(routetracker, route);
}
@ -71,7 +63,7 @@ static void remove_route(struct route *route, struct route_map *map)
}
static void route_sent_register(struct routetracker *routetracker,
struct route *route)
struct route *route STEALS)
{
route_map_add(routetracker->sent_routes, route);
tal_steal(routetracker, route);
@ -80,7 +72,7 @@ static void route_sendpay_fail(struct routetracker *routetracker,
struct route *route TAKES)
{
if (!route_map_del(routetracker->sent_routes, route))
plugin_log(pay_plugin->plugin, LOG_UNUSUAL,
plugin_err(pay_plugin->plugin,
"%s: route (%s) is not marked as sent",
__PRETTY_FUNCTION__,
fmt_routekey(tmpctx, &route->key));
@ -103,11 +95,14 @@ void route_pending_register(struct routetracker *routetracker,
assert(payment->groupid == route->key.groupid);
/* we already keep track of this route */
if (route_map_get(routetracker->pending_routes, &route->key))
return;
if (route_map_get(pay_plugin->pending_routes, &route->key))
plugin_err(pay_plugin->plugin,
"%s: tracking a route (%s) duplicate?",
__PRETTY_FUNCTION__,
fmt_routekey(tmpctx, &route->key));
if (!route_map_del(routetracker->sent_routes, route))
plugin_log(pay_plugin->plugin, LOG_DBG,
plugin_err(pay_plugin->plugin,
"%s: tracking a route (%s) not computed by this "
"payment call",
__PRETTY_FUNCTION__,
@ -115,10 +110,10 @@ void route_pending_register(struct routetracker *routetracker,
uncertainty_commit_htlcs(pay_plugin->uncertainty, route);
if (!route_map_add(routetracker->pending_routes, route) ||
!tal_steal(routetracker, route) ||
!route_map_add(pay_plugin->route_map, route) ||
!tal_add_destructor2(route, remove_route, pay_plugin->route_map))
if (!tal_steal(pay_plugin, route) ||
!route_map_add(pay_plugin->pending_routes, route) ||
!tal_add_destructor2(route, remove_route,
pay_plugin->pending_routes))
plugin_err(pay_plugin->plugin, "%s: failed to register route.",
__PRETTY_FUNCTION__);
@ -133,28 +128,6 @@ void route_pending_register(struct routetracker *routetracker,
}
}
bool routetracker_get_amount(struct routetracker *routetracker,
struct amount_msat *amount,
struct amount_msat *amount_sent)
{
assert(routetracker);
assert(amount);
assert(amount_sent);
*amount = AMOUNT_MSAT(0);
*amount_sent = AMOUNT_MSAT(0);
struct route_map *rmap = routetracker->pending_routes;
struct route_map_iter it;
for (struct route *r = route_map_first(rmap, &it); r;
r = route_map_next(rmap, &it)) {
if (!amount_msat_add(amount, *amount, route_delivers(r)) ||
!amount_msat_add(amount_sent, *amount_sent, route_sends(r)))
return false;
}
return true;
}
static void route_result_collected(struct routetracker *routetracker,
struct route *route TAKES)
{
@ -329,7 +302,7 @@ struct command_result *notification_sendpay_failure(struct command *cmd,
assert(payment->routetracker);
struct route *route =
route_map_get(payment->routetracker->pending_routes, key);
route_map_get(pay_plugin->pending_routes, key);
if (!route) {
/* This can happen if payment is first tried with renepay and
* then retried using another payment plugin. */
@ -388,7 +361,7 @@ struct command_result *notification_sendpay_success(struct command *cmd,
assert(payment->routetracker);
struct route *route =
route_map_get(payment->routetracker->pending_routes, key);
route_map_get(pay_plugin->pending_routes, key);
if (!route) {
/* This can happen if payment is first tried with renepay and
* then retried using another payment plugin. */

View file

@ -10,12 +10,13 @@ struct routetracker{
/* Routes that we sendpay and are still waiting for rpc returning
* success. */
struct route_map *sent_routes;
struct route_map *pending_routes;
/* Routes that have concluded (either SENDPAY_FAILED or
* SENDPAY_COMPLETE). */
struct route **finalized_routes;
};
struct routetracker *new_routetracker(const tal_t *ctx, struct payment *payment);
// bool routetracker_is_ready(const struct routetracker *routetracker);
void routetracker_cleanup(struct routetracker *routetracker);
bool routetracker_have_results(struct routetracker *routetracker);
@ -52,11 +53,6 @@ struct command_result *notification_sendpay_success(struct command *cmd,
void route_failure_register(struct routetracker *routetracker,
struct route *route);
/* How much is the amount being tracked. */
bool routetracker_get_amount(struct routetracker *routetracker,
struct amount_msat *amount,
struct amount_msat *amount_sent);
// FIXME: double-check that we actually get one notification for each sendpay,
// ie. that after some time we don't have yet pending sendpays for old failed or
// successful payments that we havent processed because we haven't received the