@@ -1745,7 +1745,7 @@ static struct channel *wallet_stmt2channel(struct wallet *w, struct db_stmt *stm
17451745 alias [LOCAL ] = db_col_optional_scid (tmpctx , stmt , "alias_local" );
17461746 alias [REMOTE ] = db_col_optional_scid (tmpctx , stmt , "alias_remote" );
17471747
1748- ok &= wallet_shachain_load (w , db_col_u64 (stmt , "shachain_remote_id" ),
1748+ ok &= wallet_shachain_load (w , db_col_u64 (stmt , "shachain_remote_id" ),
17491749 & wshachain );
17501750
17511751 remote_shutdown_scriptpubkey = db_col_arr (tmpctx , stmt ,
@@ -2015,6 +2015,7 @@ static struct closed_channel *wallet_stmt2closed_channel(const tal_t *ctx,
20152015 struct db_stmt * stmt )
20162016{
20172017 struct closed_channel * cc = tal (ctx , struct closed_channel );
2018+ struct wallet_shachain wshachain ;
20182019
20192020 /* Can be missing in older dbs! */
20202021 cc -> peer_id = db_col_optional (cc , stmt , "p.node_id" , node_id );
@@ -2047,6 +2048,11 @@ static struct closed_channel *wallet_stmt2closed_channel(const tal_t *ctx,
20472048 cc -> state_change_cause
20482049 = state_change_in_db (db_col_int (stmt , "state_change_reason" ));
20492050 cc -> leased = !db_col_is_null (stmt , "lease_commit_sig" );
2051+ /* This was deleted on channel closure for older dbs! */
2052+ if (wallet_shachain_load (w , db_col_u64 (stmt , "shachain_remote_id" ), & wshachain ))
2053+ cc -> their_shachain = tal_dup (cc , struct shachain , & wshachain .chain );
2054+ else
2055+ cc -> their_shachain = NULL ;
20502056
20512057 return cc ;
20522058}
@@ -2081,6 +2087,7 @@ void wallet_load_closed_channels(struct wallet *w,
20812087 ", state_change_reason"
20822088 ", lease_commit_sig"
20832089 ", last_stable_connection"
2090+ ", shachain_remote_id"
20842091 " FROM channels"
20852092 " LEFT JOIN peers p ON p.id = peer_id"
20862093 " WHERE state = ?;" ));
@@ -2125,6 +2132,7 @@ void wallet_load_one_closed_channel(struct wallet *w,
21252132 ", state_change_reason"
21262133 ", lease_commit_sig"
21272134 ", last_stable_connection"
2135+ ", shachain_remote_id"
21282136 " FROM channels"
21292137 " LEFT JOIN peers p ON p.id = peer_id"
21302138 " WHERE channels.id = ?;" ));
@@ -2836,7 +2844,10 @@ void wallet_channel_insert(struct wallet *w, struct channel *chan)
28362844void wallet_channel_close (struct wallet * w , u64 wallet_id )
28372845{
28382846 /* We keep the entry in the channel_configs table, since that might
2839- * help us debug some issues, and it is rather limited in size. */
2847+ * help us debug some issues, and it is rather limited in size. We
2848+ * also keep shachains: it's limited and we can use it for sending
2849+ * reestablish messages with enough information for nodes with lost
2850+ * dbs to recover. */
28402851 struct db_stmt * stmt ;
28412852
28422853 /* Delete entries from `channel_htlcs` */
@@ -2864,16 +2875,6 @@ void wallet_channel_close(struct wallet *w, u64 wallet_id)
28642875 db_bind_u64 (stmt , wallet_id );
28652876 db_exec_prepared_v2 (take (stmt ));
28662877
2867- /* Delete shachains */
2868- stmt = db_prepare_v2 (w -> db , SQL ("DELETE FROM shachains "
2869- "WHERE id IN ("
2870- " SELECT shachain_remote_id "
2871- " FROM channels "
2872- " WHERE channels.id=?"
2873- ")" ));
2874- db_bind_u64 (stmt , wallet_id );
2875- db_exec_prepared_v2 (take (stmt ));
2876-
28772878 /* Delete transaction annotations */
28782879 stmt = db_prepare_v2 (w -> db , SQL ("DELETE FROM transaction_annotations "
28792880 "WHERE channel=?" ));
@@ -2916,6 +2917,19 @@ void wallet_channel_delete(struct wallet *w, const struct channel *channel)
29162917 assert (db_count_changes (stmt ) == 2 );
29172918 tal_free (stmt );
29182919
2920+ /* Delete shachains */
2921+ stmt = db_prepare_v2 (w -> db , SQL ("DELETE FROM shachains "
2922+ "WHERE id IN ("
2923+ " SELECT shachain_remote_id "
2924+ " FROM channels "
2925+ " WHERE channels.id=?"
2926+ ")" ));
2927+ db_bind_u64 (stmt , channel -> dbid );
2928+ db_exec_prepared_v2 (stmt );
2929+
2930+ assert (db_count_changes (stmt ) == 1 );
2931+ tal_free (stmt );
2932+
29192933 stmt = db_prepare_v2 (w -> db , SQL ("DELETE FROM channels"
29202934 " WHERE state = ?"
29212935 " AND id=?" ));
0 commit comments