@@ -74,7 +74,7 @@ impl Writer for VecWriter {
74
74
75
75
static mut IN_RESTORE : bool = false ;
76
76
pub struct TestChannelMonitor {
77
- pub simple_monitor : Arc < channelmonitor:: SimpleManyChannelMonitor < OutPoint > > ,
77
+ pub simple_monitor : channelmonitor:: SimpleManyChannelMonitor < OutPoint > ,
78
78
pub update_ret : Mutex < Result < ( ) , channelmonitor:: ChannelMonitorUpdateErr > > ,
79
79
pub latest_good_update : Mutex < HashMap < OutPoint , Vec < u8 > > > ,
80
80
pub latest_update_good : Mutex < HashMap < OutPoint , bool > > ,
@@ -172,34 +172,41 @@ impl KeysInterface for KeyProvider {
172
172
}
173
173
}
174
174
175
+ pub struct NodeCfg {
176
+ pub chain_monitor : Arc < chaininterface:: ChainWatchInterfaceUtil > ,
177
+ pub chan_monitor : TestChannelMonitor ,
178
+ keys_manager : Arc < KeyProvider > ,
179
+ pub logger : Arc < Logger > ,
180
+ }
181
+
175
182
#[ inline]
176
183
pub fn do_test ( data : & [ u8 ] ) {
177
184
let fee_est = Arc :: new ( FuzzEstimator { } ) ;
178
185
let broadcast = Arc :: new ( TestBroadcaster { } ) ;
179
186
180
- macro_rules! make_node {
187
+ macro_rules! make_node_cfg {
181
188
( $node_id: expr) => { {
182
189
let logger: Arc <dyn Logger > = Arc :: new( test_logger:: TestLogger :: new( $node_id. to_string( ) ) ) ;
183
- let watch = Arc :: new( ChainWatchInterfaceUtil :: new( Network :: Bitcoin , Arc :: clone( & logger) ) ) ;
184
- let monitor = Arc :: new( TestChannelMonitor :: new( watch. clone( ) , broadcast. clone( ) , logger. clone( ) , fee_est. clone( ) ) ) ;
185
-
190
+ let chain_monitor = Arc :: new( ChainWatchInterfaceUtil :: new( Network :: Bitcoin , Arc :: clone( & logger) ) ) ;
191
+ let chan_monitor = TestChannelMonitor :: new( chain_monitor. clone( ) , broadcast. clone( ) , logger. clone( ) , fee_est. clone( ) ) ;
186
192
let keys_manager = Arc :: new( KeyProvider { node_id: $node_id, session_id: atomic:: AtomicU8 :: new( 0 ) , channel_id: atomic:: AtomicU8 :: new( 0 ) } ) ;
193
+ Box :: pin( NodeCfg { logger: Arc :: clone( & logger) , chain_monitor, chan_monitor, keys_manager } )
194
+ } }
195
+ }
196
+
197
+ macro_rules! make_node {
198
+ ( $node_cfg: expr) => { {
187
199
let mut config = UserConfig :: default ( ) ;
188
200
config. channel_options. fee_proportional_millionths = 0 ;
189
201
config. channel_options. announced_channel = true ;
190
202
config. peer_channel_config_limits. min_dust_limit_satoshis = 0 ;
191
- ( ChannelManager :: new ( Network :: Bitcoin , fee_est . clone ( ) , monitor . clone ( ) , broadcast . clone ( ) , Arc :: clone ( & logger ) , keys_manager . clone ( ) , config , 0 ) . unwrap ( ) ,
192
- monitor )
203
+ let chan_monitor_ref = unsafe { & ( * ( & ( * $node_cfg ) as * const NodeCfg ) ) . chan_monitor } ;
204
+ ChannelManager :: new ( Network :: Bitcoin , fee_est . clone ( ) , chan_monitor_ref , broadcast . clone ( ) , Arc :: clone ( & $node_cfg . logger ) , $node_cfg . keys_manager . clone ( ) , config , 0 ) . unwrap ( )
193
205
} }
194
206
}
195
207
196
208
macro_rules! reload_node {
197
- ( $ser: expr, $node_id: expr, $old_monitors: expr) => { {
198
- let logger: Arc <dyn Logger > = Arc :: new( test_logger:: TestLogger :: new( $node_id. to_string( ) ) ) ;
199
- let watch = Arc :: new( ChainWatchInterfaceUtil :: new( Network :: Bitcoin , Arc :: clone( & logger) ) ) ;
200
- let monitor = Arc :: new( TestChannelMonitor :: new( watch. clone( ) , broadcast. clone( ) , logger. clone( ) , fee_est. clone( ) ) ) ;
201
-
202
- let keys_manager = Arc :: new( KeyProvider { node_id: $node_id, session_id: atomic:: AtomicU8 :: new( 0 ) , channel_id: atomic:: AtomicU8 :: new( 0 ) } ) ;
209
+ ( $ser: expr, $new_cfg: expr, $old_monitors: expr) => { {
203
210
let mut config = UserConfig :: default ( ) ;
204
211
config. channel_options. fee_proportional_millionths = 0 ;
205
212
config. channel_options. announced_channel = true ;
@@ -208,25 +215,26 @@ pub fn do_test(data: &[u8]) {
208
215
let mut monitors = HashMap :: new( ) ;
209
216
let mut old_monitors = $old_monitors. latest_good_update. lock( ) . unwrap( ) ;
210
217
for ( outpoint, monitor_ser) in old_monitors. drain( ) {
211
- monitors. insert( outpoint, <( Sha256d , ChannelMonitor ) >:: read( & mut Cursor :: new( & monitor_ser) , Arc :: clone( & logger) ) . expect( "Failed to read monitor" ) . 1 ) ;
212
- monitor . latest_good_update. lock( ) . unwrap( ) . insert( outpoint, monitor_ser) ;
218
+ monitors. insert( outpoint, <( Sha256d , ChannelMonitor ) >:: read( & mut Cursor :: new( & monitor_ser) , Arc :: clone( & $new_cfg . logger) ) . expect( "Failed to read monitor" ) . 1 ) ;
219
+ $new_cfg . chan_monitor . latest_good_update. lock( ) . unwrap( ) . insert( outpoint, monitor_ser) ;
213
220
}
214
221
let mut monitor_refs = HashMap :: new( ) ;
215
222
for ( outpoint, monitor) in monitors. iter( ) {
216
223
monitor_refs. insert( * outpoint, monitor) ;
217
224
}
218
225
226
+ let chan_monitor_ref = unsafe { & ( * ( & ( * $new_cfg) as * const NodeCfg ) ) . chan_monitor } ;
219
227
let read_args = ChannelManagerReadArgs {
220
- keys_manager,
228
+ keys_manager: $new_cfg . keys_manager . clone ( ) ,
221
229
fee_estimator: fee_est. clone( ) ,
222
- monitor: monitor . clone ( ) ,
230
+ monitor: chan_monitor_ref ,
223
231
tx_broadcaster: broadcast. clone( ) ,
224
- logger,
232
+ logger: $new_cfg . logger . clone ( ) ,
225
233
default_config: config,
226
234
channel_monitors: & monitor_refs,
227
235
} ;
228
236
229
- let res = ( <( Sha256d , ChannelManager <EnforcingChannelKeys >) >:: read( & mut Cursor :: new( & $ser. 0 ) , read_args) . expect( "Failed to read manager" ) . 1 , monitor ) ;
237
+ let res = ( <( Sha256d , ChannelManager <EnforcingChannelKeys >) >:: read( & mut Cursor :: new( & $ser. 0 ) , read_args) . expect( "Failed to read manager" ) . 1 , chan_monitor_ref ) ;
230
238
for ( _, was_good) in $old_monitors. latest_updates_good_at_last_ser. lock( ) . unwrap( ) . iter( ) {
231
239
if !was_good {
232
240
// If the last time we updated a monitor we didn't successfully update (and we
@@ -349,9 +357,12 @@ pub fn do_test(data: &[u8]) {
349
357
350
358
// 3 nodes is enough to hit all the possible cases, notably unknown-source-unknown-dest
351
359
// forwarding.
352
- let ( mut node_a, mut monitor_a) = make_node ! ( 0 ) ;
353
- let ( mut node_b, mut monitor_b) = make_node ! ( 1 ) ;
354
- let ( mut node_c, mut monitor_c) = make_node ! ( 2 ) ;
360
+ let mut cfg_a = make_node_cfg ! ( 0 ) ;
361
+ let mut cfg_b = make_node_cfg ! ( 1 ) ;
362
+ let mut cfg_c = make_node_cfg ! ( 2 ) ;
363
+ let mut node_a = make_node ! ( cfg_a) ;
364
+ let mut node_b = make_node ! ( cfg_b) ;
365
+ let mut node_c = make_node ! ( cfg_c) ;
355
366
356
367
let mut nodes = [ node_a, node_b, node_c] ;
357
368
@@ -618,12 +629,12 @@ pub fn do_test(data: &[u8]) {
618
629
}
619
630
620
631
match get_slice ! ( 1 ) [ 0 ] {
621
- 0x00 => * monitor_a . update_ret . lock ( ) . unwrap ( ) = Err ( ChannelMonitorUpdateErr :: TemporaryFailure ) ,
622
- 0x01 => * monitor_b . update_ret . lock ( ) . unwrap ( ) = Err ( ChannelMonitorUpdateErr :: TemporaryFailure ) ,
623
- 0x02 => * monitor_c . update_ret . lock ( ) . unwrap ( ) = Err ( ChannelMonitorUpdateErr :: TemporaryFailure ) ,
624
- 0x03 => * monitor_a . update_ret . lock ( ) . unwrap ( ) = Ok ( ( ) ) ,
625
- 0x04 => * monitor_b . update_ret . lock ( ) . unwrap ( ) = Ok ( ( ) ) ,
626
- 0x05 => * monitor_c . update_ret . lock ( ) . unwrap ( ) = Ok ( ( ) ) ,
632
+ 0x00 => * cfg_a . chan_monitor . update_ret . lock ( ) . unwrap ( ) = Err ( ChannelMonitorUpdateErr :: TemporaryFailure ) ,
633
+ 0x01 => * cfg_b . chan_monitor . update_ret . lock ( ) . unwrap ( ) = Err ( ChannelMonitorUpdateErr :: TemporaryFailure ) ,
634
+ 0x02 => * cfg_c . chan_monitor . update_ret . lock ( ) . unwrap ( ) = Err ( ChannelMonitorUpdateErr :: TemporaryFailure ) ,
635
+ 0x03 => * cfg_a . chan_monitor . update_ret . lock ( ) . unwrap ( ) = Ok ( ( ) ) ,
636
+ 0x04 => * cfg_b . chan_monitor . update_ret . lock ( ) . unwrap ( ) = Ok ( ( ) ) ,
637
+ 0x05 => * cfg_c . chan_monitor . update_ret . lock ( ) . unwrap ( ) = Ok ( ( ) ) ,
627
638
0x06 => { unsafe { IN_RESTORE = true } ; nodes[ 0 ] . test_restore_channel_monitor ( ) ; unsafe { IN_RESTORE = false } ; } ,
628
639
0x07 => { unsafe { IN_RESTORE = true } ; nodes[ 1 ] . test_restore_channel_monitor ( ) ; unsafe { IN_RESTORE = false } ; } ,
629
640
0x08 => { unsafe { IN_RESTORE = true } ; nodes[ 2 ] . test_restore_channel_monitor ( ) ; unsafe { IN_RESTORE = false } ; } ,
@@ -681,10 +692,10 @@ pub fn do_test(data: &[u8]) {
681
692
chan_a_disconnected = true ;
682
693
drain_msg_events_on_disconnect ! ( 0 ) ;
683
694
}
684
- let ( new_node_a , new_monitor_a ) = reload_node ! ( node_a_ser , 0 , monitor_a ) ;
685
- node_a = Arc :: new ( new_node_a ) ;
686
- nodes[ 0 ] = node_a . clone ( ) ;
687
- monitor_a = new_monitor_a ;
695
+ let new_cfg_a = make_node_cfg ! ( 0 ) ;
696
+ let new_node_a = reload_node ! ( node_a_ser , new_cfg_a , & cfg_a . chan_monitor ) ;
697
+ nodes[ 0 ] = new_node_a . 0 ;
698
+ cfg_a = new_cfg_a ;
688
699
} ,
689
700
0x20 => {
690
701
if !chan_a_disconnected {
@@ -699,42 +710,45 @@ pub fn do_test(data: &[u8]) {
699
710
nodes[ 2 ] . get_and_clear_pending_msg_events ( ) ;
700
711
bc_events. clear ( ) ;
701
712
}
702
- let ( new_node_b , new_monitor_b ) = reload_node ! ( node_b_ser , 1 , monitor_b ) ;
703
- node_b = Arc :: new ( new_node_b ) ;
704
- nodes[ 1 ] = node_b . clone ( ) ;
705
- monitor_b = new_monitor_b ;
713
+ let new_cfg_b = make_node_cfg ! ( 1 ) ;
714
+ let new_node_b = reload_node ! ( node_b_ser , new_cfg_b , & cfg_b . chan_monitor ) ;
715
+ nodes[ 0 ] = new_node_b . 0 ;
716
+ cfg_b = new_cfg_b ;
706
717
} ,
707
718
0x21 => {
708
719
if !chan_b_disconnected {
709
720
nodes[ 1 ] . peer_disconnected ( & nodes[ 2 ] . get_our_node_id ( ) , false ) ;
710
721
chan_b_disconnected = true ;
711
722
drain_msg_events_on_disconnect ! ( 2 ) ;
712
723
}
713
- let ( new_node_c , new_monitor_c ) = reload_node ! ( node_c_ser , 2 , monitor_c ) ;
714
- node_c = Arc :: new ( new_node_c ) ;
715
- nodes[ 2 ] = node_c . clone ( ) ;
716
- monitor_c = new_monitor_c ;
724
+ let new_cfg_c = make_node_cfg ! ( 2 ) ;
725
+ let new_node_c = reload_node ! ( node_c_ser , new_cfg_c , & cfg_c . chan_monitor ) ;
726
+ nodes[ 0 ] = new_node_c . 0 ;
727
+ cfg_c = new_cfg_c ;
717
728
} ,
718
729
_ => test_return ! ( ) ,
719
730
}
720
731
721
- if monitor_a . should_update_manager . load ( atomic:: Ordering :: Relaxed ) {
732
+ if cfg_a . chan_monitor . should_update_manager . load ( atomic:: Ordering :: Relaxed ) {
722
733
node_a_ser. 0 . clear ( ) ;
723
734
nodes[ 0 ] . write ( & mut node_a_ser) . unwrap ( ) ;
724
- monitor_a. should_update_manager . store ( false , atomic:: Ordering :: Relaxed ) ;
725
- * monitor_a. latest_updates_good_at_last_ser . lock ( ) . unwrap ( ) = monitor_a. latest_update_good . lock ( ) . unwrap ( ) . clone ( ) ;
735
+ cfg_a. chan_monitor . should_update_manager . store ( false , atomic:: Ordering :: Relaxed ) ;
736
+ let chan_monitor_ref = unsafe { & ( * ( & ( * cfg_a) as * const NodeCfg ) ) . chan_monitor } ;
737
+ * chan_monitor_ref. latest_updates_good_at_last_ser . lock ( ) . unwrap ( ) = cfg_a. chan_monitor . latest_update_good . lock ( ) . unwrap ( ) . clone ( ) ;
726
738
}
727
- if monitor_b . should_update_manager . load ( atomic:: Ordering :: Relaxed ) {
739
+ if cfg_b . chan_monitor . should_update_manager . load ( atomic:: Ordering :: Relaxed ) {
728
740
node_b_ser. 0 . clear ( ) ;
729
741
nodes[ 1 ] . write ( & mut node_b_ser) . unwrap ( ) ;
730
- monitor_b. should_update_manager . store ( false , atomic:: Ordering :: Relaxed ) ;
731
- * monitor_b. latest_updates_good_at_last_ser . lock ( ) . unwrap ( ) = monitor_b. latest_update_good . lock ( ) . unwrap ( ) . clone ( ) ;
742
+ cfg_b. chan_monitor . should_update_manager . store ( false , atomic:: Ordering :: Relaxed ) ;
743
+ let chan_monitor_ref = unsafe { & ( * ( & ( * cfg_b) as * const NodeCfg ) ) . chan_monitor } ;
744
+ * chan_monitor_ref. latest_updates_good_at_last_ser . lock ( ) . unwrap ( ) = cfg_b. chan_monitor . latest_update_good . lock ( ) . unwrap ( ) . clone ( ) ;
732
745
}
733
- if monitor_c . should_update_manager . load ( atomic:: Ordering :: Relaxed ) {
746
+ if cfg_c . chan_monitor . should_update_manager . load ( atomic:: Ordering :: Relaxed ) {
734
747
node_c_ser. 0 . clear ( ) ;
735
748
nodes[ 2 ] . write ( & mut node_c_ser) . unwrap ( ) ;
736
- monitor_c. should_update_manager . store ( false , atomic:: Ordering :: Relaxed ) ;
737
- * monitor_c. latest_updates_good_at_last_ser . lock ( ) . unwrap ( ) = monitor_c. latest_update_good . lock ( ) . unwrap ( ) . clone ( ) ;
749
+ cfg_c. chan_monitor . should_update_manager . store ( false , atomic:: Ordering :: Relaxed ) ;
750
+ let chan_monitor_ref = unsafe { & ( * ( & ( * cfg_c) as * const NodeCfg ) ) . chan_monitor } ;
751
+ * chan_monitor_ref. latest_updates_good_at_last_ser . lock ( ) . unwrap ( ) = cfg_c. chan_monitor . latest_update_good . lock ( ) . unwrap ( ) . clone ( ) ;
738
752
}
739
753
}
740
754
}
0 commit comments