listpeerchannels: use struct channel stats, don't fetch from db.

This avoids a db lookup on every iteration of listpeerchannels, which
can be slow on large nodes (Postgres, I assume).

We can now simply add the fields we want to channel load, and remove
wallet_channel_stats_load entirely.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
Rusty Russell 2024-09-19 16:30:39 +09:30
parent 762d624810
commit 3aace10828
4 changed files with 36 additions and 68 deletions

View file

@ -818,7 +818,6 @@ static void NON_NULL_ARGS(1, 2, 4, 5) json_add_channel(struct command *cmd,
const struct peer *peer)
{
struct lightningd *ld = cmd->ld;
struct channel_stats channel_stats;
struct amount_msat funding_msat;
struct amount_sat peer_funded_sats;
struct state_change_entry *state_changes;
@ -1191,27 +1190,26 @@ static void NON_NULL_ARGS(1, 2, 4, 5) json_add_channel(struct command *cmd,
json_array_end(response);
/* Provide channel statistics */
wallet_channel_stats_load(ld->wallet, channel->dbid, &channel_stats);
json_add_u64(response, "in_payments_offered",
channel_stats.in_payments_offered);
channel->stats.in_payments_offered);
json_add_amount_msat(response,
"in_offered_msat",
channel_stats.in_msatoshi_offered);
channel->stats.in_msatoshi_offered);
json_add_u64(response, "in_payments_fulfilled",
channel_stats.in_payments_fulfilled);
channel->stats.in_payments_fulfilled);
json_add_amount_msat(response,
"in_fulfilled_msat",
channel_stats.in_msatoshi_fulfilled);
channel->stats.in_msatoshi_fulfilled);
json_add_u64(response, "out_payments_offered",
channel_stats.out_payments_offered);
channel->stats.out_payments_offered);
json_add_amount_msat(response,
"out_offered_msat",
channel_stats.out_msatoshi_offered);
channel->stats.out_msatoshi_offered);
json_add_u64(response, "out_payments_fulfilled",
channel_stats.out_payments_fulfilled);
channel->stats.out_payments_fulfilled);
json_add_amount_msat(response,
"out_fulfilled_msat",
channel_stats.out_msatoshi_fulfilled);
channel->stats.out_msatoshi_fulfilled);
json_add_htlcs(ld, response, channel);
json_object_end(response);

View file

@ -1023,9 +1023,6 @@ const char *version(void)
/* Generated stub for wallet_channel_save */
void wallet_channel_save(struct wallet *w UNNEEDED, struct channel *chan UNNEEDED)
{ fprintf(stderr, "wallet_channel_save called!\n"); abort(); }
/* Generated stub for wallet_channel_stats_load */
void wallet_channel_stats_load(struct wallet *w UNNEEDED, u64 cdbid UNNEEDED, struct channel_stats *stats UNNEEDED)
{ fprintf(stderr, "wallet_channel_stats_load called!\n"); abort(); }
/* Generated stub for wallet_channeltxs_add */
void wallet_channeltxs_add(struct wallet *w UNNEEDED, struct channel *chan UNNEEDED,
const int type UNNEEDED, const struct bitcoin_txid *txid UNNEEDED,

View file

@ -1719,7 +1719,26 @@ static struct channel *wallet_stmt2channel(struct wallet *w, struct db_stmt *stm
db_col_ignore(stmt, "remote_htlc_maximum_msat");
}
wallet_channel_stats_load(w, db_col_u64(stmt, "id"), &stats);
stats.in_payments_offered
= db_col_int_or_default(stmt, "in_payments_offered", 0);
stats.in_payments_fulfilled
= db_col_int_or_default(stmt, "in_payments_fulfilled", 0);
db_col_amount_msat_or_default(stmt, "in_msatoshi_offered",
&stats.in_msatoshi_offered,
AMOUNT_MSAT(0));
db_col_amount_msat_or_default(stmt, "in_msatoshi_fulfilled",
&stats.in_msatoshi_fulfilled,
AMOUNT_MSAT(0));
stats.out_payments_offered
= db_col_int_or_default(stmt, "out_payments_offered", 0);
stats.out_payments_fulfilled
= db_col_int_or_default(stmt, "out_payments_fulfilled", 0);
db_col_amount_msat_or_default(stmt, "out_msatoshi_offered",
&stats.out_msatoshi_offered,
AMOUNT_MSAT(0));
db_col_amount_msat_or_default(stmt, "out_msatoshi_fulfilled",
&stats.out_msatoshi_fulfilled,
AMOUNT_MSAT(0));
chan = new_channel(peer, db_col_u64(stmt, "id"),
&wshachain,
@ -1977,6 +1996,14 @@ static bool wallet_channels_load_active(struct wallet *w)
", remote_htlc_minimum_msat"
", remote_htlc_maximum_msat"
", last_stable_connection"
", in_payments_offered"
", in_payments_fulfilled"
", in_msatoshi_offered"
", in_msatoshi_fulfilled"
", out_payments_offered"
", out_payments_fulfilled"
", out_msatoshi_offered"
", out_msatoshi_fulfilled"
" FROM channels"
" WHERE state != ?;")); //? 0
db_bind_int(stmt, CLOSED);
@ -2080,51 +2107,6 @@ void wallet_channel_stats_incr_out_fulfilled(struct wallet *w, u64 id,
wallet_channel_stats_incr_x(w, "out", "fulfilled", id, m);
}
void wallet_channel_stats_load(struct wallet *w,
u64 id,
struct channel_stats *stats)
{
struct db_stmt *stmt;
int res;
stmt = db_prepare_v2(w->db, SQL(
"SELECT"
" in_payments_offered, in_payments_fulfilled"
", in_msatoshi_offered, in_msatoshi_fulfilled"
", out_payments_offered, out_payments_fulfilled"
", out_msatoshi_offered, out_msatoshi_fulfilled"
" FROM channels"
" WHERE id = ?"));
db_bind_u64(stmt, id);
db_query_prepared(stmt);
res = db_step(stmt);
/* This must succeed, since we know the channel exists */
assert(res);
stats->in_payments_offered
= db_col_int_or_default(stmt, "in_payments_offered", 0);
stats->in_payments_fulfilled
= db_col_int_or_default(stmt, "in_payments_fulfilled", 0);
db_col_amount_msat_or_default(stmt, "in_msatoshi_offered",
&stats->in_msatoshi_offered,
AMOUNT_MSAT(0));
db_col_amount_msat_or_default(stmt, "in_msatoshi_fulfilled",
&stats->in_msatoshi_fulfilled,
AMOUNT_MSAT(0));
stats->out_payments_offered
= db_col_int_or_default(stmt, "out_payments_offered", 0);
stats->out_payments_fulfilled
= db_col_int_or_default(stmt, "out_payments_fulfilled", 0);
db_col_amount_msat_or_default(stmt, "out_msatoshi_offered",
&stats->out_msatoshi_offered,
AMOUNT_MSAT(0));
db_col_amount_msat_or_default(stmt, "out_msatoshi_fulfilled",
&stats->out_msatoshi_fulfilled,
AMOUNT_MSAT(0));
tal_free(stmt);
}
u32 wallet_blocks_maxheight(struct wallet *w)
{
u32 max = 0;

View file

@ -715,15 +715,6 @@ void wallet_channel_stats_incr_in_fulfilled(struct wallet *w, u64 cdbid, struct
void wallet_channel_stats_incr_out_offered(struct wallet *w, u64 cdbid, struct amount_msat msatoshi);
void wallet_channel_stats_incr_out_fulfilled(struct wallet *w, u64 cdbid, struct amount_msat msatoshi);
/**
* wallet_channel_stats_load - Load channel statistics
*
* @w: wallet containing the channel
* @cdbid: channel database id
* @stats: location to load statistics to
*/
void wallet_channel_stats_load(struct wallet *w, u64 cdbid, struct channel_stats *stats);
/**
* Retrieve the blockheight of the last block processed by lightningd.
*