routing: precalc per-block risk factor.

Saves a little by doing up-front calculation.

# 1M nodes:
$ /gossipd/test/run-bench-find_route 1000000 1 > /tmp/out
=> 42863 msec

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
Rusty Russell 2017-12-18 14:45:41 +10:30 committed by Christian Decker
parent 2824ff2b30
commit a7eee0b669
4 changed files with 14 additions and 9 deletions

View File

@ -267,7 +267,7 @@ static u64 connection_fee(const struct node_connection *c, u64 msatoshi)
* in order to prefer shorter routes, all things equal. */
static u64 risk_fee(u64 amount, u32 delay, double riskfactor)
{
return 1 + amount * delay * riskfactor / BLOCKS_PER_YEAR / 10000;
return 1 + amount * delay * riskfactor;
}
/* We track totals, rather than costs. That's because the fee depends
@ -311,6 +311,7 @@ static void bfg_one_edge(struct node *node, size_t edgenum, double riskfactor)
}
}
/* riskfactor is already scaled to per-block amount */
static struct node_connection *
find_route(const tal_t *ctx, struct routing_state *rstate,
const struct pubkey *from, const struct pubkey *to, u64 msatoshi,
@ -803,7 +804,8 @@ struct route_hop *get_route(tal_t *ctx, struct routing_state *rstate,
struct node_connection *first_conn;
first_conn = find_route(ctx, rstate, source, destination, msatoshi,
riskfactor, &fee, &route);
riskfactor / BLOCKS_PER_YEAR / 10000,
&fee, &route);
if (!first_conn) {
return NULL;

View File

@ -158,6 +158,7 @@ int main(int argc, char *argv[])
size_t num_success;
struct pubkey me = nodeid(0);
bool perfme = false;
const double riskfactor = 0.01 / BLOCKS_PER_YEAR / 10000;
secp256k1_ctx = secp256k1_context_create(SECP256K1_CONTEXT_VERIFY
| SECP256K1_CONTEXT_SIGN);
@ -192,7 +193,7 @@ int main(int argc, char *argv[])
nc = find_route(ctx, rstate, &from, &to,
pseudorand(100000),
0.01,
riskfactor,
&fee, &route);
num_success += (nc != NULL);
tal_free(route);

View File

@ -63,6 +63,7 @@ int main(void)
struct pubkey a, b, c;
u64 fee;
struct node_connection **route;
const double riskfactor = 1.0 / BLOCKS_PER_YEAR / 10000;
secp256k1_ctx = secp256k1_context_create(SECP256K1_CONTEXT_VERIFY
| SECP256K1_CONTEXT_SIGN);
@ -115,7 +116,7 @@ int main(void)
nc->flags = 1;
nc->last_timestamp = 1504064344;
nc = find_route(ctx, rstate, &a, &c, 100000, 1.0, &fee, &route);
nc = find_route(ctx, rstate, &a, &c, 100000, riskfactor, &fee, &route);
assert(nc);
assert(tal_count(route) == 1);
assert(pubkey_eq(&route[0]->src->id, &b));

View File

@ -74,6 +74,7 @@ int main(void)
struct privkey tmp;
u64 fee;
struct node_connection **route;
const double riskfactor = 1.0 / BLOCKS_PER_YEAR / 10000;
secp256k1_ctx = secp256k1_context_create(SECP256K1_CONTEXT_VERIFY
| SECP256K1_CONTEXT_SIGN);
@ -91,7 +92,7 @@ int main(void)
/* A<->B */
add_connection(rstate, &a, &b, 1, 1, 1);
nc = find_route(ctx, rstate, &a, &b, 1000, 1.0, &fee, &route);
nc = find_route(ctx, rstate, &a, &b, 1000, riskfactor, &fee, &route);
assert(nc);
assert(tal_count(route) == 0);
assert(fee == 0);
@ -106,7 +107,7 @@ int main(void)
status_trace("C = %s", type_to_string(trc, struct pubkey, &c));
add_connection(rstate, &b, &c, 1, 1, 1);
nc = find_route(ctx, rstate, &a, &c, 1000, 1.0, &fee, &route);
nc = find_route(ctx, rstate, &a, &c, 1000, riskfactor, &fee, &route);
assert(nc);
assert(tal_count(route) == 1);
assert(fee == 1);
@ -121,14 +122,14 @@ int main(void)
add_connection(rstate, &d, &c, 0, 2, 1);
/* Will go via D for small amounts. */
nc = find_route(ctx, rstate, &a, &c, 1000, 1.0, &fee, &route);
nc = find_route(ctx, rstate, &a, &c, 1000, riskfactor, &fee, &route);
assert(nc);
assert(tal_count(route) == 1);
assert(pubkey_eq(&route[0]->src->id, &d));
assert(fee == 0);
/* Will go via B for large amounts. */
nc = find_route(ctx, rstate, &a, &c, 3000000, 1.0, &fee, &route);
nc = find_route(ctx, rstate, &a, &c, 3000000, riskfactor, &fee, &route);
assert(nc);
assert(tal_count(route) == 1);
assert(pubkey_eq(&route[0]->src->id, &b));
@ -136,7 +137,7 @@ int main(void)
/* Make B->C inactive, force it back via D */
get_connection(rstate, &b, &c)->active = false;
nc = find_route(ctx, rstate, &a, &c, 3000000, 1.0, &fee, &route);
nc = find_route(ctx, rstate, &a, &c, 3000000, riskfactor, &fee, &route);
assert(nc);
assert(tal_count(route) == 1);
assert(pubkey_eq(&route[0]->src->id, &d));