@@ -1763,7 +1763,7 @@ static struct channel *wallet_stmt2channel(struct wallet *w, struct db_stmt *stm
17631763 alias [LOCAL ] = db_col_optional_scid (tmpctx , stmt , "alias_local" );
17641764 alias [REMOTE ] = db_col_optional_scid (tmpctx , stmt , "alias_remote" );
17651765
1766- ok &= wallet_shachain_load (w , db_col_u64 (stmt , "shachain_remote_id" ),
1766+ ok &= wallet_shachain_load (w , db_col_u64 (stmt , "shachain_remote_id" ),
17671767 & wshachain );
17681768
17691769 remote_shutdown_scriptpubkey = db_col_arr (tmpctx , stmt ,
@@ -2033,6 +2033,7 @@ static struct closed_channel *wallet_stmt2closed_channel(const tal_t *ctx,
20332033 struct db_stmt * stmt )
20342034{
20352035 struct closed_channel * cc = tal (ctx , struct closed_channel );
2036+ struct wallet_shachain wshachain ;
20362037
20372038 /* Can be missing in older dbs! */
20382039 cc -> peer_id = db_col_optional (cc , stmt , "p.node_id" , node_id );
@@ -2065,6 +2066,11 @@ static struct closed_channel *wallet_stmt2closed_channel(const tal_t *ctx,
20652066 cc -> state_change_cause
20662067 = state_change_in_db (db_col_int (stmt , "state_change_reason" ));
20672068 cc -> leased = !db_col_is_null (stmt , "lease_commit_sig" );
2069+ /* This was deleted on channel closure for older dbs! */
2070+ if (wallet_shachain_load (w , db_col_u64 (stmt , "shachain_remote_id" ), & wshachain ))
2071+ cc -> their_shachain = tal_dup (cc , struct shachain , & wshachain .chain );
2072+ else
2073+ cc -> their_shachain = NULL ;
20682074
20692075 return cc ;
20702076}
@@ -2099,6 +2105,7 @@ void wallet_load_closed_channels(struct wallet *w,
20992105 ", state_change_reason"
21002106 ", lease_commit_sig"
21012107 ", last_stable_connection"
2108+ ", shachain_remote_id"
21022109 " FROM channels"
21032110 " LEFT JOIN peers p ON p.id = peer_id"
21042111 " WHERE state = ?;" ));
@@ -2143,6 +2150,7 @@ void wallet_load_one_closed_channel(struct wallet *w,
21432150 ", state_change_reason"
21442151 ", lease_commit_sig"
21452152 ", last_stable_connection"
2153+ ", shachain_remote_id"
21462154 " FROM channels"
21472155 " LEFT JOIN peers p ON p.id = peer_id"
21482156 " WHERE channels.id = ?;" ));
@@ -2855,7 +2863,10 @@ void wallet_channel_close(struct wallet *w,
28552863 const struct channel * chan )
28562864{
28572865 /* We keep the entry in the channel_configs table, since that might
2858- * help us debug some issues, and it is rather limited in size. */
2866+ * help us debug some issues, and it is rather limited in size. We
2867+ * also keep shachains: it's limited and we can use it for sending
2868+ * reestablish messages with enough information for nodes with lost
2869+ * dbs to recover. */
28592870 struct db_stmt * stmt ;
28602871
28612872 /* Delete entries from `channel_htlcs` */
@@ -2887,16 +2898,6 @@ void wallet_channel_close(struct wallet *w,
28872898 db_bind_u64 (stmt , chan -> dbid );
28882899 db_exec_prepared_v2 (take (stmt ));
28892900
2890- /* Delete shachains */
2891- stmt = db_prepare_v2 (w -> db , SQL ("DELETE FROM shachains "
2892- "WHERE id IN ("
2893- " SELECT shachain_remote_id "
2894- " FROM channels "
2895- " WHERE channels.id=?"
2896- ")" ));
2897- db_bind_u64 (stmt , chan -> dbid );
2898- db_exec_prepared_v2 (take (stmt ));
2899-
29002901 /* Delete transaction annotations */
29012902 stmt = db_prepare_v2 (w -> db , SQL ("DELETE FROM transaction_annotations "
29022903 "WHERE channel=?" ));
@@ -2939,6 +2940,19 @@ void wallet_channel_delete(struct wallet *w, const struct channel *channel)
29392940 assert (db_count_changes (stmt ) == 2 );
29402941 tal_free (stmt );
29412942
2943+ /* Delete shachains */
2944+ stmt = db_prepare_v2 (w -> db , SQL ("DELETE FROM shachains "
2945+ "WHERE id IN ("
2946+ " SELECT shachain_remote_id "
2947+ " FROM channels "
2948+ " WHERE channels.id=?"
2949+ ")" ));
2950+ db_bind_u64 (stmt , channel -> dbid );
2951+ db_exec_prepared_v2 (stmt );
2952+
2953+ assert (db_count_changes (stmt ) == 1 );
2954+ tal_free (stmt );
2955+
29422956 stmt = db_prepare_v2 (w -> db , SQL ("DELETE FROM channels"
29432957 " WHERE state = ?"
29442958 " AND id=?" ));
0 commit comments