Skip to content

Commit ade9138

Browse files
committed
lightningd: delete all trace of nonexistent channels.
We're going to start loading them into memory for nicer responses if people try to reestablish closed channels, but we don't care about ones which were never actually opened. We could add a new state, but easier to simply remove them. Signed-off-by: Rusty Russell <[email protected]>
1 parent 2e41ef2 commit ade9138

File tree

11 files changed

+80
-27
lines changed

11 files changed

+80
-27
lines changed

lightningd/channel.c

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -88,13 +88,17 @@ static void destroy_channel(struct channel *channel)
8888
list_del_from(&channel->peer->channels, &channel->list);
8989
}
9090

91-
void delete_channel(struct channel *channel STEALS)
91+
void delete_channel(struct channel *channel STEALS, bool completely_eliminate)
9292
{
9393
const u8 *msg;
9494

9595
struct peer *peer = channel->peer;
96-
if (channel->dbid != 0)
96+
if (channel->dbid != 0) {
9797
wallet_channel_close(channel->peer->ld->wallet, channel->dbid);
98+
/* Never open at all, not ours. */
99+
if (completely_eliminate)
100+
wallet_channel_delete(channel->peer->ld->wallet, channel);
101+
}
98102

99103
/* Tell the hsm to forget the channel, needs to be after it's
100104
* been forgotten here */
@@ -1035,7 +1039,7 @@ static void channel_fail_perm(struct channel *channel,
10351039
drop_to_chain(ld, channel, false, spent_by);
10361040

10371041
if (channel_state_open_uncommitted(channel->state))
1038-
delete_channel(channel);
1042+
delete_channel(channel, false);
10391043
}
10401044

10411045
void channel_fail_permanent(struct channel *channel,
@@ -1093,7 +1097,7 @@ void channel_fail_forget(struct channel *channel, const char *fmt, ...)
10931097
channel->error = towire_errorfmt(channel,
10941098
&channel->cid, "%s", why);
10951099

1096-
delete_channel(channel);
1100+
delete_channel(channel, false);
10971101
tal_free(why);
10981102
}
10991103

@@ -1162,7 +1166,7 @@ void channel_internal_error(struct channel *channel, const char *fmt, ...)
11621166
/* Nothing ventured, nothing lost! */
11631167
if (channel_state_uncommitted(channel->state)) {
11641168
channel_set_owner(channel, NULL);
1165-
delete_channel(channel);
1169+
delete_channel(channel, false);
11661170
return;
11671171
}
11681172

lightningd/channel.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -479,7 +479,8 @@ channel_current_inflight(const struct channel *channel);
479479
/* What's the last feerate used for a funding tx on this channel? */
480480
u32 channel_last_funding_feerate(const struct channel *channel);
481481

482-
void delete_channel(struct channel *channel STEALS);
482+
/* Only set completely_eliminate for never-existed channels */
483+
void delete_channel(struct channel *channel STEALS, bool completely_eliminate);
483484

484485
const char *channel_state_name(const struct channel *channel);
485486
const char *channel_state_str(enum channel_state state);

lightningd/channel_control.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1321,7 +1321,7 @@ static void forget(struct channel *channel)
13211321
channel->forgets = tal_arr(channel, struct command *, 0);
13221322

13231323
/* Forget the channel. */
1324-
delete_channel(channel);
1324+
delete_channel(channel, false);
13251325

13261326
for (size_t i = 0; i < tal_count(forgets); i++) {
13271327
assert(!forgets[i]->json_stream);
@@ -2017,8 +2017,8 @@ void channel_notify_new_block(struct lightningd *ld,
20172017
block_height - channel->first_blocknum,
20182018
fmt_bitcoin_txid(tmpctx, &channel->funding.txid));
20192019
/* FIXME: Send an error packet for this case! */
2020-
/* And forget it. */
2021-
delete_channel(channel);
2020+
/* And forget it. COMPLETELY. */
2021+
delete_channel(channel, true);
20222022
}
20232023

20242024
tal_free(to_forget);

lightningd/dual_open_control.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ void channel_unsaved_close_conn(struct channel *channel, const char *why)
6767

6868
assert(channel->owner);
6969
channel_set_owner(channel, NULL);
70-
delete_channel(channel);
70+
delete_channel(channel, false);
7171
}
7272

7373
static void channel_saved_err_broken_reconn(struct channel *channel,
@@ -3959,13 +3959,13 @@ static void dualopen_errmsg(struct channel *channel,
39593959
if (channel_state_uncommitted(channel->state)) {
39603960
log_info(channel->log, "%s", "Unsaved peer failed."
39613961
" Deleting channel.");
3962-
delete_channel(channel);
3962+
delete_channel(channel, false);
39633963
return;
39643964
}
39653965
if ((warning || disconnect) && channel_state_open_uncommitted(channel->state)) {
39663966
log_info(channel->log, "%s", "Commit ready peer failed."
39673967
" Deleting channel.");
3968-
delete_channel(channel);
3968+
delete_channel(channel, false);
39693969
return;
39703970
}
39713971

@@ -4009,7 +4009,7 @@ static void dualopen_errmsg(struct channel *channel,
40094009
if (channel_state_open_uncommitted(channel->state)) {
40104010
log_info(channel->log, "%s", "Commit ready peer can't reconnect."
40114011
" Deleting channel.");
4012-
delete_channel(channel);
4012+
delete_channel(channel, false);
40134013
return;
40144014
}
40154015
char *err = restart_dualopend(tmpctx,

lightningd/onchain_control.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -528,7 +528,7 @@ static void handle_irrevocably_resolved(struct channel *channel, const u8 *msg U
528528
log_info(channel->log, "onchaind complete, forgetting peer");
529529

530530
/* This will also free onchaind. */
531-
delete_channel(channel);
531+
delete_channel(channel, false);
532532
}
533533

534534

lightningd/peer_control.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -519,7 +519,7 @@ void channel_errmsg(struct channel *channel,
519519
if (channel_state_uncommitted(channel->state)) {
520520
log_info(channel->log, "%s", "Unsaved peer failed."
521521
" Deleting channel.");
522-
delete_channel(channel);
522+
delete_channel(channel, false);
523523
return;
524524
}
525525

@@ -3423,7 +3423,7 @@ static void process_dev_forget_channel(struct bitcoind *bitcoind UNUSED,
34233423
forget->channel->error = towire_errorfmt(forget->channel,
34243424
&forget->channel->cid,
34253425
"dev_forget_channel");
3426-
delete_channel(forget->channel);
3426+
delete_channel(forget->channel, false);
34273427

34283428
was_pending(command_success(forget->cmd, response));
34293429
}

lightningd/test/run-invoice-select-inchan.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -243,7 +243,7 @@ struct anchor_details *create_anchor_details(const tal_t *ctx UNNEEDED,
243243
const struct bitcoin_tx *tx UNNEEDED)
244244
{ fprintf(stderr, "create_anchor_details called!\n"); abort(); }
245245
/* Generated stub for delete_channel */
246-
void delete_channel(struct channel *channel STEALS UNNEEDED)
246+
void delete_channel(struct channel *channel STEALS UNNEEDED, bool completely_eliminate UNNEEDED)
247247
{ fprintf(stderr, "delete_channel called!\n"); abort(); }
248248
/* Generated stub for depthcb_update_scid */
249249
bool depthcb_update_scid(struct channel *channel UNNEEDED,

wallet/test/run-db.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -260,7 +260,8 @@ struct peer *new_peer(struct lightningd *ld UNNEEDED, u64 dbid UNNEEDED,
260260
bool connected_incoming UNNEEDED)
261261
{ fprintf(stderr, "new_peer called!\n"); abort(); }
262262
/* Generated stub for notify_chain_mvt */
263-
void notify_chain_mvt(struct lightningd *ld UNNEEDED, const struct chain_coin_mvt *mvt UNNEEDED)
263+
void notify_chain_mvt(struct lightningd *ld UNNEEDED,
264+
const struct chain_coin_mvt *chain_mvt UNNEEDED)
264265
{ fprintf(stderr, "notify_chain_mvt called!\n"); abort(); }
265266
/* Generated stub for notify_forward_event */
266267
void notify_forward_event(struct lightningd *ld UNNEEDED,

wallet/test/run-wallet.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -701,10 +701,12 @@ struct uncommitted_channel *new_uncommitted_channel(struct peer *peer UNNEEDED)
701701
bool node_announcement_same(const u8 *nann1 UNNEEDED, const u8 *nann2 UNNEEDED)
702702
{ fprintf(stderr, "node_announcement_same called!\n"); abort(); }
703703
/* Generated stub for notify_chain_mvt */
704-
void notify_chain_mvt(struct lightningd *ld UNNEEDED, const struct chain_coin_mvt *mvt UNNEEDED)
704+
void notify_chain_mvt(struct lightningd *ld UNNEEDED,
705+
const struct chain_coin_mvt *chain_mvt UNNEEDED)
705706
{ fprintf(stderr, "notify_chain_mvt called!\n"); abort(); }
706707
/* Generated stub for notify_channel_mvt */
707-
void notify_channel_mvt(struct lightningd *ld UNNEEDED, const struct channel_coin_mvt *mvt UNNEEDED)
708+
void notify_channel_mvt(struct lightningd *ld UNNEEDED,
709+
const struct channel_coin_mvt *chan_mvt UNNEEDED)
708710
{ fprintf(stderr, "notify_channel_mvt called!\n"); abort(); }
709711
/* Generated stub for notify_channel_open_failed */
710712
void notify_channel_open_failed(struct lightningd *ld UNNEEDED,
@@ -2116,7 +2118,7 @@ static bool test_channel_inflight_crud(struct lightningd *ld, const tal_t *ctx)
21162118

21172119
/* do inflights get cleared when the channel is closed?*/
21182120
dbid = chan->dbid;
2119-
delete_channel(chan); /* Also clears up peer! */
2121+
delete_channel(chan, false); /* Also clears up peer! */
21202122
CHECK_MSG(count_inflights(w, dbid) == 0, "inflights cleaned up");
21212123
db_commit_transaction(w->db);
21222124
CHECK_MSG(!wallet_err, wallet_err);

wallet/wallet.c

Lines changed: 46 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2812,12 +2812,8 @@ void wallet_channel_insert(struct wallet *w, struct channel *chan)
28122812

28132813
void wallet_channel_close(struct wallet *w, u64 wallet_id)
28142814
{
2815-
/* We keep a couple of dependent tables around as well, such as the
2816-
* channel_configs table, since that might help us debug some issues,
2817-
* and it is rather limited in size. Tables that can grow quite
2818-
* considerably and that are of limited use after channel closure will
2819-
* be pruned as well. */
2820-
2815+
/* We keep the entry in the channel_configs table, since that might
2816+
* help us debug some issues, and it is rather limited in size. */
28212817
struct db_stmt *stmt;
28222818

28232819
/* Delete entries from `channel_htlcs` */
@@ -2855,6 +2851,24 @@ void wallet_channel_close(struct wallet *w, u64 wallet_id)
28552851
db_bind_u64(stmt, wallet_id);
28562852
db_exec_prepared_v2(take(stmt));
28572853

2854+
/* Delete transaction annotations */
2855+
stmt = db_prepare_v2(w->db, SQL("DELETE FROM transaction_annotations "
2856+
"WHERE channel=?"));
2857+
db_bind_u64(stmt, wallet_id);
2858+
db_exec_prepared_v2(take(stmt));
2859+
2860+
/* Delete feerates */
2861+
stmt = db_prepare_v2(w->db, SQL("DELETE FROM channel_feerates "
2862+
"WHERE channel_id=?"));
2863+
db_bind_u64(stmt, wallet_id);
2864+
db_exec_prepared_v2(take(stmt));
2865+
2866+
/* Delete anchor information */
2867+
stmt = db_prepare_v2(w->db, SQL("DELETE FROM local_anchors "
2868+
"WHERE channel_id=?"));
2869+
db_bind_u64(stmt, wallet_id);
2870+
db_exec_prepared_v2(take(stmt));
2871+
28582872
/* Set the channel to closed */
28592873
stmt = db_prepare_v2(w->db, SQL("UPDATE channels "
28602874
"SET state=? "
@@ -2864,6 +2878,32 @@ void wallet_channel_close(struct wallet *w, u64 wallet_id)
28642878
db_exec_prepared_v2(take(stmt));
28652879
}
28662880

2881+
/* Completely unused channels get wiped entirely (we've already closed it above) */
2882+
void wallet_channel_delete(struct wallet *w, const struct channel *channel)
2883+
{
2884+
struct db_stmt *stmt;
2885+
2886+
/* Delete channel configuration for both sides */
2887+
stmt = db_prepare_v2(w->db, SQL("DELETE FROM channel_configs"
2888+
" WHERE id=? OR id=?"));
2889+
db_bind_u64(stmt, channel->channel_info.their_config.id);
2890+
db_bind_u64(stmt, channel->our_config.id);
2891+
db_exec_prepared_v2(stmt);
2892+
2893+
assert(db_count_changes(stmt) == 2);
2894+
tal_free(stmt);
2895+
2896+
stmt = db_prepare_v2(w->db, SQL("DELETE FROM channels"
2897+
" WHERE state = ?"
2898+
" AND id=?"));
2899+
db_bind_u64(stmt, channel_state_in_db(CLOSED));
2900+
db_bind_u64(stmt, channel->dbid);
2901+
db_exec_prepared_v2(stmt);
2902+
2903+
assert(db_count_changes(stmt) == 1);
2904+
tal_free(stmt);
2905+
}
2906+
28672907
void wallet_channel_inflight_cleanup_incomplete(struct wallet *w, u64 wallet_id)
28682908
{
28692909
struct db_stmt *stmt;

0 commit comments

Comments
 (0)