@@ -37,6 +37,7 @@ use chain::chaininterface::{BroadcasterInterface, FeeEstimator};
37
37
use chain:: channelmonitor:: { ChannelMonitor , ChannelMonitorUpdate , ChannelMonitorUpdateErr , MonitorEvent , MonitorUpdateError } ;
38
38
use chain:: transaction:: { OutPoint , TransactionData } ;
39
39
use chain:: keysinterface:: ChannelKeys ;
40
+ use ln:: data_persister:: ChannelDataPersister ;
40
41
use util:: logger:: Logger ;
41
42
use util:: events;
42
43
use util:: events:: Event ;
@@ -55,25 +56,28 @@ use std::ops::Deref;
55
56
/// [`chain::Watch`]: ../trait.Watch.html
56
57
/// [`ChannelManager`]: ../../ln/channelmanager/struct.ChannelManager.html
57
58
/// [module-level documentation]: index.html
58
- pub struct ChainMonitor < ChanSigner : ChannelKeys , C : Deref , T : Deref , F : Deref , L : Deref >
59
+ pub struct ChainMonitor < ChanSigner : ChannelKeys , C : Deref , T : Deref , F : Deref , L : Deref , D : Deref >
59
60
where C :: Target : chain:: Filter ,
60
61
T :: Target : BroadcasterInterface ,
61
62
F :: Target : FeeEstimator ,
62
63
L :: Target : Logger ,
64
+ D :: Target : ChannelDataPersister < Keys =ChanSigner > ,
63
65
{
64
66
/// The monitors
65
67
pub monitors : Mutex < HashMap < OutPoint , ChannelMonitor < ChanSigner > > > ,
66
68
chain_source : Option < C > ,
67
69
broadcaster : T ,
68
70
logger : L ,
69
- fee_estimator : F
71
+ fee_estimator : F ,
72
+ data_persister : D ,
70
73
}
71
74
72
- impl < ChanSigner : ChannelKeys , C : Deref , T : Deref , F : Deref , L : Deref > ChainMonitor < ChanSigner , C , T , F , L >
73
- where C :: Target : chain:: Filter ,
74
- T :: Target : BroadcasterInterface ,
75
- F :: Target : FeeEstimator ,
76
- L :: Target : Logger ,
75
+ impl < ChanSigner : ChannelKeys , C : Deref , T : Deref , F : Deref , L : Deref , D : Deref > ChainMonitor < ChanSigner , C , T , F , L , D >
76
+ where C :: Target : chain:: Filter ,
77
+ T :: Target : BroadcasterInterface ,
78
+ F :: Target : FeeEstimator ,
79
+ L :: Target : Logger ,
80
+ D :: Target : ChannelDataPersister < Keys =ChanSigner > ,
77
81
{
78
82
/// Dispatches to per-channel monitors, which are responsible for updating their on-chain view
79
83
/// of a channel and reacting accordingly based on transactions in the connected block. See
@@ -128,13 +132,14 @@ impl<ChanSigner: ChannelKeys, C: Deref, T: Deref, F: Deref, L: Deref> ChainMonit
128
132
/// transactions relevant to the watched channels.
129
133
///
130
134
/// [`chain::Filter`]: ../trait.Filter.html
131
- pub fn new ( chain_source : Option < C > , broadcaster : T , logger : L , feeest : F ) -> Self {
135
+ pub fn new ( chain_source : Option < C > , broadcaster : T , logger : L , feeest : F , data_persister : D ) -> Self {
132
136
Self {
133
137
monitors : Mutex :: new ( HashMap :: new ( ) ) ,
134
138
chain_source,
135
139
broadcaster,
136
140
logger,
137
141
fee_estimator : feeest,
142
+ data_persister,
138
143
}
139
144
}
140
145
@@ -143,10 +148,12 @@ impl<ChanSigner: ChannelKeys, C: Deref, T: Deref, F: Deref, L: Deref> ChainMonit
143
148
/// Calls back to [`chain::Filter`] with the funding transaction and outputs to watch.
144
149
///
145
150
/// [`chain::Filter`]: ../trait.Filter.html
146
- fn add_monitor ( & self , outpoint : OutPoint , monitor : ChannelMonitor < ChanSigner > ) -> Result < ( ) , MonitorUpdateError > {
151
+ fn add_monitor ( & self , outpoint : OutPoint , monitor : ChannelMonitor < ChanSigner > ) -> Result < ( ) , ChannelMonitorUpdateErr > {
147
152
let mut monitors = self . monitors . lock ( ) . unwrap ( ) ;
148
153
let entry = match monitors. entry ( outpoint) {
149
- hash_map:: Entry :: Occupied ( _) => return Err ( MonitorUpdateError ( "Channel monitor for given outpoint is already present" ) ) ,
154
+ hash_map:: Entry :: Occupied ( _) => {
155
+ log_error ! ( self . logger, "Failed to add new channel data: channel monitor for given outpoint is already present" ) ;
156
+ return Err ( ChannelMonitorUpdateErr :: PermanentFailure ) } ,
150
157
hash_map:: Entry :: Vacant ( e) => e,
151
158
} ;
152
159
{
@@ -162,43 +169,69 @@ impl<ChanSigner: ChannelKeys, C: Deref, T: Deref, F: Deref, L: Deref> ChainMonit
162
169
}
163
170
}
164
171
}
172
+ match self . data_persister . persist_channel_data ( outpoint, & monitor) {
173
+ Err ( e) => {
174
+ log_error ! ( self . logger, "Failed to persist new channel data" ) ;
175
+ return Err ( e) ;
176
+ } ,
177
+ _ => { }
178
+ }
165
179
entry. insert ( monitor) ;
166
180
Ok ( ( ) )
167
181
}
168
182
169
183
/// Updates the monitor that watches the channel referred to by the given outpoint.
170
- fn update_monitor ( & self , outpoint : OutPoint , update : ChannelMonitorUpdate ) -> Result < ( ) , MonitorUpdateError > {
184
+ fn update_monitor ( & self , outpoint : OutPoint , update : ChannelMonitorUpdate ) -> Result < ( ) , ChannelMonitorUpdateErr > {
171
185
let mut monitors = self . monitors . lock ( ) . unwrap ( ) ;
172
- match monitors. get_mut ( & outpoint) {
173
- Some ( orig_monitor) => {
174
- log_trace ! ( self . logger, "Updating Channel Monitor for channel {}" , log_funding_info!( orig_monitor) ) ;
175
- orig_monitor. update_monitor ( update, & self . broadcaster , & self . logger )
176
- } ,
177
- None => Err ( MonitorUpdateError ( "No such monitor registered" ) )
178
- }
186
+ if let Some ( orig_monitor) = monitors. get_mut ( & outpoint) {
187
+ log_trace ! ( self . logger, "Updating Channel Monitor for channel {}" , log_funding_info!( orig_monitor) ) ;
188
+ let mut should_persist = true ;
189
+ let res = orig_monitor. update_monitor ( & update, & self . broadcaster , & self . logger ) ;
190
+ match res {
191
+ Err ( MonitorUpdateError :: PersistMonitor ( msg) ) => {
192
+ log_error ! ( self . logger, "{}" , msg) ;
193
+ } ,
194
+ Err ( MonitorUpdateError :: NoPersistMonitor ( msg) ) => {
195
+ log_error ! ( self . logger, "{}" , msg) ;
196
+ should_persist = false ;
197
+ } ,
198
+ Ok ( ( ) ) => { } ,
199
+ }
200
+ if should_persist {
201
+ match self . data_persister . update_channel_data ( outpoint, & update, orig_monitor) {
202
+ Err ( e) => {
203
+ if !res. is_err ( ) {
204
+ return Err ( e) ;
205
+ }
206
+ } ,
207
+ _ => { }
208
+ }
209
+ }
210
+ if res. is_err ( ) { return Err ( ChannelMonitorUpdateErr :: PermanentFailure ) ; }
211
+ } else {
212
+ log_error ! ( self . logger, "Failed to update channel monitor: no such monitor registered" ) ;
213
+ return Err ( ChannelMonitorUpdateErr :: PermanentFailure ) ;
214
+ }
215
+
216
+ Ok ( ( ) )
179
217
}
180
218
}
181
219
182
- impl < ChanSigner : ChannelKeys , C : Deref + Sync + Send , T : Deref + Sync + Send , F : Deref + Sync + Send , L : Deref + Sync + Send > chain:: Watch for ChainMonitor < ChanSigner , C , T , F , L >
183
- where C :: Target : chain:: Filter ,
184
- T :: Target : BroadcasterInterface ,
185
- F :: Target : FeeEstimator ,
186
- L :: Target : Logger ,
220
+ impl < ChanSigner : ChannelKeys , C : Deref + Sync + Send , T : Deref + Sync + Send , F : Deref + Sync + Send , L : Deref + Sync + Send , D : Deref + Sync + Send > chain:: Watch for ChainMonitor < ChanSigner , C , T , F , L , D >
221
+ where C :: Target : chain:: Filter ,
222
+ T :: Target : BroadcasterInterface ,
223
+ F :: Target : FeeEstimator ,
224
+ L :: Target : Logger ,
225
+ D :: Target : ChannelDataPersister < Keys =ChanSigner > ,
187
226
{
188
227
type Keys = ChanSigner ;
189
228
190
229
fn watch_channel ( & self , funding_txo : OutPoint , monitor : ChannelMonitor < ChanSigner > ) -> Result < ( ) , ChannelMonitorUpdateErr > {
191
- match self . add_monitor ( funding_txo, monitor) {
192
- Ok ( _) => Ok ( ( ) ) ,
193
- Err ( _) => Err ( ChannelMonitorUpdateErr :: PermanentFailure ) ,
194
- }
230
+ self . add_monitor ( funding_txo, monitor)
195
231
}
196
232
197
233
fn update_channel ( & self , funding_txo : OutPoint , update : ChannelMonitorUpdate ) -> Result < ( ) , ChannelMonitorUpdateErr > {
198
- match self . update_monitor ( funding_txo, update) {
199
- Ok ( _) => Ok ( ( ) ) ,
200
- Err ( _) => Err ( ChannelMonitorUpdateErr :: PermanentFailure ) ,
201
- }
234
+ self . update_monitor ( funding_txo, update)
202
235
}
203
236
204
237
fn release_pending_monitor_events ( & self ) -> Vec < MonitorEvent > {
@@ -210,11 +243,12 @@ impl<ChanSigner: ChannelKeys, C: Deref + Sync + Send, T: Deref + Sync + Send, F:
210
243
}
211
244
}
212
245
213
- impl < ChanSigner : ChannelKeys , C : Deref , T : Deref , F : Deref , L : Deref > events:: EventsProvider for ChainMonitor < ChanSigner , C , T , F , L >
246
+ impl < ChanSigner : ChannelKeys , C : Deref , T : Deref , F : Deref , L : Deref , D : Deref > events:: EventsProvider for ChainMonitor < ChanSigner , C , T , F , L , D >
214
247
where C :: Target : chain:: Filter ,
215
248
T :: Target : BroadcasterInterface ,
216
249
F :: Target : FeeEstimator ,
217
250
L :: Target : Logger ,
251
+ D :: Target : ChannelDataPersister < Keys =ChanSigner > ,
218
252
{
219
253
fn get_and_clear_pending_events ( & self ) -> Vec < Event > {
220
254
let mut pending_events = Vec :: new ( ) ;
0 commit comments