mirror of
https://github.com/ElementsProject/lightning.git
synced 2025-02-22 14:42:40 +01:00
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:
parent
8b2d45e52e
commit
ec431276ac
4 changed files with 22 additions and 53 deletions
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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. */
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue