@@ -1763,7 +1763,7 @@ static struct channel *wallet_stmt2channel(struct wallet *w, struct db_stmt *stm
1763
1763
alias [LOCAL ] = db_col_optional_scid (tmpctx , stmt , "alias_local" );
1764
1764
alias [REMOTE ] = db_col_optional_scid (tmpctx , stmt , "alias_remote" );
1765
1765
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" ),
1767
1767
& wshachain );
1768
1768
1769
1769
remote_shutdown_scriptpubkey = db_col_arr (tmpctx , stmt ,
@@ -2033,6 +2033,7 @@ static struct closed_channel *wallet_stmt2closed_channel(const tal_t *ctx,
2033
2033
struct db_stmt * stmt )
2034
2034
{
2035
2035
struct closed_channel * cc = tal (ctx , struct closed_channel );
2036
+ struct wallet_shachain wshachain ;
2036
2037
2037
2038
/* Can be missing in older dbs! */
2038
2039
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,
2065
2066
cc -> state_change_cause
2066
2067
= state_change_in_db (db_col_int (stmt , "state_change_reason" ));
2067
2068
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 ;
2068
2074
2069
2075
return cc ;
2070
2076
}
@@ -2099,6 +2105,7 @@ void wallet_load_closed_channels(struct wallet *w,
2099
2105
", state_change_reason"
2100
2106
", lease_commit_sig"
2101
2107
", last_stable_connection"
2108
+ ", shachain_remote_id"
2102
2109
" FROM channels"
2103
2110
" LEFT JOIN peers p ON p.id = peer_id"
2104
2111
" WHERE state = ?;" ));
@@ -2143,6 +2150,7 @@ void wallet_load_one_closed_channel(struct wallet *w,
2143
2150
", state_change_reason"
2144
2151
", lease_commit_sig"
2145
2152
", last_stable_connection"
2153
+ ", shachain_remote_id"
2146
2154
" FROM channels"
2147
2155
" LEFT JOIN peers p ON p.id = peer_id"
2148
2156
" WHERE channels.id = ?;" ));
@@ -2855,7 +2863,10 @@ void wallet_channel_close(struct wallet *w,
2855
2863
const struct channel * chan )
2856
2864
{
2857
2865
/* 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. */
2859
2870
struct db_stmt * stmt ;
2860
2871
2861
2872
/* Delete entries from `channel_htlcs` */
@@ -2887,16 +2898,6 @@ void wallet_channel_close(struct wallet *w,
2887
2898
db_bind_u64 (stmt , chan -> dbid );
2888
2899
db_exec_prepared_v2 (take (stmt ));
2889
2900
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
-
2900
2901
/* Delete transaction annotations */
2901
2902
stmt = db_prepare_v2 (w -> db , SQL ("DELETE FROM transaction_annotations "
2902
2903
"WHERE channel=?" ));
@@ -2939,6 +2940,19 @@ void wallet_channel_delete(struct wallet *w, const struct channel *channel)
2939
2940
assert (db_count_changes (stmt ) == 2 );
2940
2941
tal_free (stmt );
2941
2942
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
+
2942
2956
stmt = db_prepare_v2 (w -> db , SQL ("DELETE FROM channels"
2943
2957
" WHERE state = ?"
2944
2958
" AND id=?" ));
0 commit comments