From 6eac8dfe3c70c3b7b94cce434807b8b7fed9a920 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Tue, 27 Sep 2022 09:13:36 +0930 Subject: [PATCH] delforward: tally up deleted forwards so that getinfo's `fees_collected_msat` doesn't change. Signed-off-by: Rusty Russell Fixes: #5627 --- tests/test_plugin.py | 5 +++++ wallet/wallet.c | 34 +++++++++++++++++++++++++++++++++- 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/tests/test_plugin.py b/tests/test_plugin.py index e46314419..f75b4fcc1 100644 --- a/tests/test_plugin.py +++ b/tests/test_plugin.py @@ -3089,6 +3089,8 @@ def test_autoclean(node_factory): assert l2.rpc.autoclean_status()['autoclean']['failedforwards']['cleaned'] == 1 assert l2.rpc.autoclean_status()['autoclean']['succeededforwards']['cleaned'] == 0 + amt_before = l2.rpc.getinfo()['fees_collected_msat'] + # Clean succeeded ones l2.stop() l2.daemon.opts['autoclean-succeededforwards-age'] = 2 @@ -3098,6 +3100,9 @@ def test_autoclean(node_factory): assert l2.rpc.autoclean_status()['autoclean']['failedforwards']['cleaned'] == 1 assert l2.rpc.autoclean_status()['autoclean']['succeededforwards']['cleaned'] == 1 + # We still see correct total in getinfo! + assert l2.rpc.getinfo()['fees_collected_msat'] == amt_before + def test_autoclean_once(node_factory): l1, l2, l3 = node_factory.line_graph(3, opts={'may_reconnect': True}, diff --git a/wallet/wallet.c b/wallet/wallet.c index 5bd67b03b..452154e76 100644 --- a/wallet/wallet.c +++ b/wallet/wallet.c @@ -4506,7 +4506,7 @@ notify: struct amount_msat wallet_total_forward_fees(struct wallet *w) { struct db_stmt *stmt; - struct amount_msat total; + struct amount_msat total, deleted; bool res; stmt = db_prepare_v2(w->db, SQL("SELECT" @@ -4522,6 +4522,12 @@ struct amount_msat wallet_total_forward_fees(struct wallet *w) db_col_amount_msat(stmt, "CAST(COALESCE(SUM(in_msatoshi - out_msatoshi), 0) AS BIGINT)", &total); tal_free(stmt); + deleted = amount_msat(db_get_intvar(w->db, "deleted_forward_fees", 0)); + if (!amount_msat_add(&total, total, deleted)) + db_fatal("Adding forward fees %s + %s overflowed", + type_to_string(tmpctx, struct amount_msat, &total), + type_to_string(tmpctx, struct amount_msat, &deleted)); + return total; } @@ -4694,6 +4700,32 @@ bool wallet_forward_delete(struct wallet *w, struct db_stmt *stmt; bool changed; + /* When deleting settled ones, we have to add to deleted_forward_fees! */ + if (state == FORWARD_SETTLED) { + /* Of course, it might not be settled: don't add if they're wrong! */ + stmt = db_prepare_v2(w->db, SQL("SELECT" + " in_msatoshi - out_msatoshi" + " FROM forwards " + " WHERE in_channel_scid = ?" + " AND in_htlc_id = ?" + " AND state = ?;")); + db_bind_scid(stmt, 0, chan_in); + db_bind_u64(stmt, 1, htlc_id); + db_bind_int(stmt, 2, wallet_forward_status_in_db(FORWARD_SETTLED)); + db_query_prepared(stmt); + + if (db_step(stmt)) { + struct amount_msat deleted; + + db_col_amount_msat(stmt, "in_msatoshi - out_msatoshi", &deleted); + deleted.millisatoshis += /* Raw: db access */ + db_get_intvar(w->db, "deleted_forward_fees", 0); + db_set_intvar(w->db, "deleted_forward_fees", + deleted.millisatoshis); /* Raw: db access */ + } + tal_free(stmt); + } + stmt = db_prepare_v2(w->db, SQL("DELETE FROM forwards" " WHERE in_channel_scid = ?"