Skip to content

Commit 2868677

Browse files
committed
Sort candidate route once with custom comparator.
1 parent 8ca8d88 commit 2868677

File tree

1 file changed

+16
-10
lines changed

1 file changed

+16
-10
lines changed

lightning/src/routing/router.rs

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1485,16 +1485,22 @@ where L::Target: Logger {
14851485
// also makes routing more reliable.
14861486
let mut overpaid_value_msat = aggregate_route_value_msat - final_value_msat;
14871487

1488-
// First, we drop some expensive low-value paths entirely if possible.
1489-
// In order to do so, we pre-sort by total fees paid, so that in case of equal
1490-
// values we prefer lower cost paths.
1491-
// (Descending order, so we drop higher-fee paths first)
1492-
cur_route.sort_by_key(|path| path.get_total_fee_paid_msat());
1493-
cur_route.reverse();
1494-
1495-
// Then sort by value so that we drop many really-low values first, since
1496-
// fewer paths is better: the payment is less likely to fail.
1497-
cur_route.sort_by_key(|path| path.get_value_msat());
1488+
// First, we drop some expensive low-value paths entirely if possible, since fewer
1489+
// paths is better: the payment is less likely to fail. In order to do so, we sort
1490+
// by value and fall back to total fees paid, i.e., in case of equal values values
1491+
// we prefer lower cost paths.
1492+
cur_route.sort_unstable_by(|a, b| {
1493+
let a_value = a.get_value_msat();
1494+
let b_value = b.get_value_msat();
1495+
if a_value.cmp(&b_value).is_eq() {
1496+
let a_fees = a.get_total_fee_paid_msat();
1497+
let b_fees = b.get_total_fee_paid_msat();
1498+
// Reverse ordering here, so we drop higher-fee paths first
1499+
b_fees.cmp(&a_fees)
1500+
} else {
1501+
a_value.cmp(&b_value)
1502+
}
1503+
});
14981504

14991505
// We should make sure that at least 1 path left.
15001506
let mut paths_left = cur_route.len();

0 commit comments

Comments
 (0)