plugin: Split out the struct channel_hint handling
We're getting serious about how we manage the channel_hints, so let's give them a proper home.
This commit is contained in:
@@ -388,87 +388,6 @@ void payment_start(struct payment *p)
|
||||
payment_start_at_blockheight(p, INVALID_BLOCKHEIGHT);
|
||||
}
|
||||
|
||||
static void channel_hint_to_json(const char *name, const struct channel_hint *hint, struct json_stream *dest)
|
||||
{
|
||||
json_object_start(dest, name);
|
||||
json_add_u32(dest, "timestamp", hint->timestamp);
|
||||
json_add_short_channel_id_dir(dest, "scid", hint->scid);
|
||||
json_add_amount_msat(dest, "estimated_capacity_msat", hint->estimated_capacity);
|
||||
json_add_amount_msat(dest, "overall_capacity_msat", hint->overall_capacity);
|
||||
json_add_bool(dest, "enabled", hint->enabled);
|
||||
json_object_end(dest);
|
||||
}
|
||||
|
||||
#define PAY_REFILL_TIME 7200
|
||||
|
||||
/**
|
||||
* Update the `channel_hint` in place, return whether it should be kept.
|
||||
*
|
||||
* This computes the refill-rate based on the overall capacity, and
|
||||
* the time elapsed since the last update and relaxes the upper bound
|
||||
* on the capacity, and resets the enabled flag if appropriate. If the
|
||||
* hint is no longer useful, i.e., it does not provide any additional
|
||||
* information on top of the structural information we've learned from
|
||||
* the gossip, then we return `false` to signal that the
|
||||
* `channel_hint` may be removed.
|
||||
*/
|
||||
static bool channel_hint_update(const struct timeabs now,
|
||||
struct channel_hint *hint)
|
||||
{
|
||||
/* Precision is not required here, so integer division is good enough.
|
||||
*/
|
||||
u64 refill_rate = hint->overall_capacity.millisatoshis / PAY_REFILL_TIME; /* Raw: just simpler */
|
||||
u64 seconds = now.ts.tv_sec - hint->timestamp;
|
||||
hint->estimated_capacity.millisatoshis += refill_rate * seconds; /* Raw: simpler */
|
||||
|
||||
/* Clamp the value to the `overall_capacity` */
|
||||
if (amount_msat_greater(hint->estimated_capacity,
|
||||
hint->overall_capacity))
|
||||
hint->estimated_capacity = hint->overall_capacity;
|
||||
|
||||
/* TODO This is rather coarse. We could map the disabled flag
|
||||
to having 0msat capacity, and then relax from there. But it'd
|
||||
likely be too slow of a relaxation.*/
|
||||
if (seconds > 60)
|
||||
hint->enabled = true;
|
||||
|
||||
/* Since we update in-place we should make sure that we can
|
||||
* just call update again and the result is stable, if no time
|
||||
* has passed. */
|
||||
hint->timestamp = now.ts.tv_sec;
|
||||
|
||||
/* We report this hint as useless, if the hint does not
|
||||
* restrict the channel, i.e., if it is enabled and the
|
||||
* estimate is the same as the overall capacity. */
|
||||
return !hint->enabled || amount_msat_greater(hint->overall_capacity,
|
||||
hint->estimated_capacity);
|
||||
}
|
||||
|
||||
/**
|
||||
* Load a channel_hint from its JSON representation.
|
||||
*
|
||||
* @return The initialized `channel_hint` or `NULL` if we encountered a parsing
|
||||
* error.
|
||||
*/
|
||||
/*
|
||||
static struct channel_hint *channel_hint_from_json(const tal_t *ctx,
|
||||
const char *buffer,
|
||||
const jsmntok_t *toks)
|
||||
{
|
||||
const char *ret;
|
||||
struct channel_hint *hint = tal(ctx, struct channel_hint);
|
||||
ret = json_scan(ctx, buffer, toks,
|
||||
"{timestamp:%,scid:%,estimated_capacity_msat:%,overall_capacity_msat:%,enabled:%}",
|
||||
JSON_SCAN(json_to_u32, &hint->timestamp),
|
||||
JSON_SCAN(json_to_short_channel_id_dir, &hint->scid),
|
||||
JSON_SCAN(json_to_msat, &hint->estimated_capacity),
|
||||
JSON_SCAN(json_to_bool, &hint->enabled));
|
||||
|
||||
if (ret != NULL)
|
||||
hint = tal_free(hint);
|
||||
return hint;
|
||||
}
|
||||
*/
|
||||
/**
|
||||
* Notify subscribers of the `channel_hint` topic about a changed hint
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user