Skip to content

Commit d27c161

Browse files
committed
De-macroify chanmon_consistency's reload_node
`chanmon_consistency` was originally written with lots of macros due to some misguided concept of code being unrolled at compile-time. This is, of course, a terrible idea not just for compile times but also for performance. Here, we make `reload_node` a function in anticipation of it being used in additional places in future work.
1 parent 3b2e8e3 commit d27c161

File tree

1 file changed

+96
-100
lines changed

1 file changed

+96
-100
lines changed

fuzz/src/chanmon_consistency.rs

+96-100
Original file line numberDiff line numberDiff line change
@@ -678,94 +678,96 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out, anchors: bool) {
678678
let default_mon_style = RefCell::new(ChannelMonitorUpdateStatus::Completed);
679679
let mon_style = [default_mon_style.clone(), default_mon_style.clone(), default_mon_style];
680680

681-
macro_rules! reload_node {
682-
($ser: expr, $node_id: expr, $old_monitors: expr, $use_old_mons: expr, $keys: expr, $fee_estimator: expr) => {{
683-
let keys_manager = Arc::clone(&$keys);
684-
let logger: Arc<dyn Logger> =
685-
Arc::new(test_logger::TestLogger::new($node_id.to_string(), out.clone()));
686-
let chain_monitor = Arc::new(TestChainMonitor::new(
687-
broadcast.clone(),
688-
logger.clone(),
689-
$fee_estimator.clone(),
690-
Arc::new(TestPersister {
691-
update_ret: Mutex::new(ChannelMonitorUpdateStatus::Completed),
692-
}),
693-
Arc::clone(&$keys),
694-
));
695-
696-
let mut config = UserConfig::default();
697-
config.channel_config.forwarding_fee_proportional_millionths = 0;
698-
config.channel_handshake_config.announce_for_forwarding = true;
699-
if anchors {
700-
config.channel_handshake_config.negotiate_anchors_zero_fee_htlc_tx = true;
701-
config.manually_accept_inbound_channels = true;
702-
}
703-
704-
let mut monitors = new_hash_map();
705-
let mut old_monitors = $old_monitors.latest_monitors.lock().unwrap();
706-
let mut use_old_mons = $use_old_mons;
707-
for (channel_id, mut prev_state) in old_monitors.drain() {
708-
let serialized_mon = if use_old_mons % 3 == 0 {
709-
// Reload with the oldest `ChannelMonitor` (the one that we already told
710-
// `ChannelManager` we finished persisting).
711-
prev_state.persisted_monitor
712-
} else if use_old_mons % 3 == 1 {
713-
// Reload with the second-oldest `ChannelMonitor`
714-
let old_mon = prev_state.persisted_monitor;
715-
prev_state.pending_monitors.drain(..).next().map(|(_, v)| v).unwrap_or(old_mon)
716-
} else {
717-
// Reload with the newest `ChannelMonitor`
718-
let old_mon = prev_state.persisted_monitor;
719-
prev_state.pending_monitors.pop().map(|(_, v)| v).unwrap_or(old_mon)
720-
};
721-
// Use a different value of `use_old_mons` if we have another monitor (only node B)
722-
use_old_mons /= 3;
723-
let mon = <(BlockHash, ChannelMonitor<TestChannelSigner>)>::read(
724-
&mut &serialized_mon[..],
725-
(&*$keys, &*$keys),
726-
)
727-
.expect("Failed to read monitor");
728-
monitors.insert(channel_id, mon.1);
729-
// Update the latest `ChannelMonitor` state to match what we just told LDK.
730-
prev_state.persisted_monitor = serialized_mon;
731-
// Wipe any `ChannelMonitor`s which we never told LDK we finished persisting,
732-
// considering them discarded. LDK should replay these for us as they're stored in
733-
// the `ChannelManager`.
734-
prev_state.pending_monitors.clear();
735-
chain_monitor.latest_monitors.lock().unwrap().insert(channel_id, prev_state);
736-
}
737-
let mut monitor_refs = new_hash_map();
738-
for (channel_id, monitor) in monitors.iter() {
739-
monitor_refs.insert(*channel_id, monitor);
740-
}
681+
let reload_node = |ser: &Vec<u8>,
682+
node_id: u8,
683+
old_monitors: &TestChainMonitor,
684+
mut use_old_mons,
685+
keys,
686+
fee_estimator| {
687+
let keys_manager = Arc::clone(keys);
688+
let logger: Arc<dyn Logger> =
689+
Arc::new(test_logger::TestLogger::new(node_id.to_string(), out.clone()));
690+
let chain_monitor = Arc::new(TestChainMonitor::new(
691+
broadcast.clone(),
692+
logger.clone(),
693+
Arc::clone(fee_estimator),
694+
Arc::new(TestPersister {
695+
update_ret: Mutex::new(ChannelMonitorUpdateStatus::Completed),
696+
}),
697+
Arc::clone(keys),
698+
));
699+
700+
let mut config = UserConfig::default();
701+
config.channel_config.forwarding_fee_proportional_millionths = 0;
702+
config.channel_handshake_config.announce_for_forwarding = true;
703+
if anchors {
704+
config.channel_handshake_config.negotiate_anchors_zero_fee_htlc_tx = true;
705+
config.manually_accept_inbound_channels = true;
706+
}
741707

742-
let read_args = ChannelManagerReadArgs {
743-
entropy_source: Arc::clone(&keys_manager),
744-
node_signer: Arc::clone(&keys_manager),
745-
signer_provider: keys_manager,
746-
fee_estimator: $fee_estimator.clone(),
747-
chain_monitor: chain_monitor.clone(),
748-
tx_broadcaster: broadcast.clone(),
749-
router: &router,
750-
message_router: &router,
751-
logger,
752-
default_config: config,
753-
channel_monitors: monitor_refs,
708+
let mut monitors = new_hash_map();
709+
let mut old_monitors = old_monitors.latest_monitors.lock().unwrap();
710+
for (channel_id, mut prev_state) in old_monitors.drain() {
711+
let serialized_mon = if use_old_mons % 3 == 0 {
712+
// Reload with the oldest `ChannelMonitor` (the one that we already told
713+
// `ChannelManager` we finished persisting).
714+
prev_state.persisted_monitor
715+
} else if use_old_mons % 3 == 1 {
716+
// Reload with the second-oldest `ChannelMonitor`
717+
let old_mon = prev_state.persisted_monitor;
718+
prev_state.pending_monitors.drain(..).next().map(|(_, v)| v).unwrap_or(old_mon)
719+
} else {
720+
// Reload with the newest `ChannelMonitor`
721+
let old_mon = prev_state.persisted_monitor;
722+
prev_state.pending_monitors.pop().map(|(_, v)| v).unwrap_or(old_mon)
754723
};
724+
// Use a different value of `use_old_mons` if we have another monitor (only node B)
725+
use_old_mons /= 3;
726+
let mon = <(BlockHash, ChannelMonitor<TestChannelSigner>)>::read(
727+
&mut &serialized_mon[..],
728+
(&**keys, &**keys),
729+
)
730+
.expect("Failed to read monitor");
731+
monitors.insert(channel_id, mon.1);
732+
// Update the latest `ChannelMonitor` state to match what we just told LDK.
733+
prev_state.persisted_monitor = serialized_mon;
734+
// Wipe any `ChannelMonitor`s which we never told LDK we finished persisting,
735+
// considering them discarded. LDK should replay these for us as they're stored in
736+
// the `ChannelManager`.
737+
prev_state.pending_monitors.clear();
738+
chain_monitor.latest_monitors.lock().unwrap().insert(channel_id, prev_state);
739+
}
740+
let mut monitor_refs = new_hash_map();
741+
for (channel_id, monitor) in monitors.iter() {
742+
monitor_refs.insert(*channel_id, monitor);
743+
}
755744

756-
let manager = <(BlockHash, ChanMan)>::read(&mut &$ser.0[..], read_args)
757-
.expect("Failed to read manager");
758-
let res = (manager.1, chain_monitor.clone());
759-
for (channel_id, mon) in monitors.drain() {
760-
assert_eq!(
761-
chain_monitor.chain_monitor.watch_channel(channel_id, mon),
762-
Ok(ChannelMonitorUpdateStatus::Completed)
763-
);
764-
}
765-
*chain_monitor.persister.update_ret.lock().unwrap() = *mon_style[$node_id].borrow();
766-
res
767-
}};
768-
}
745+
let read_args = ChannelManagerReadArgs {
746+
entropy_source: Arc::clone(&keys_manager),
747+
node_signer: Arc::clone(&keys_manager),
748+
signer_provider: keys_manager,
749+
fee_estimator: Arc::clone(fee_estimator),
750+
chain_monitor: chain_monitor.clone(),
751+
tx_broadcaster: broadcast.clone(),
752+
router: &router,
753+
message_router: &router,
754+
logger,
755+
default_config: config,
756+
channel_monitors: monitor_refs,
757+
};
758+
759+
let manager =
760+
<(BlockHash, ChanMan)>::read(&mut &ser[..], read_args).expect("Failed to read manager");
761+
let res = (manager.1, chain_monitor.clone());
762+
for (channel_id, mon) in monitors.drain() {
763+
assert_eq!(
764+
chain_monitor.chain_monitor.watch_channel(channel_id, mon),
765+
Ok(ChannelMonitorUpdateStatus::Completed)
766+
);
767+
}
768+
*chain_monitor.persister.update_ret.lock().unwrap() = *mon_style[node_id as usize].borrow();
769+
res
770+
};
769771

770772
let mut channel_txn = Vec::new();
771773
macro_rules! make_channel {
@@ -995,12 +997,9 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out, anchors: bool) {
995997
let mut bc_events = Vec::new();
996998
let mut cb_events = Vec::new();
997999

998-
let mut node_a_ser = VecWriter(Vec::new());
999-
nodes[0].write(&mut node_a_ser).unwrap();
1000-
let mut node_b_ser = VecWriter(Vec::new());
1001-
nodes[1].write(&mut node_b_ser).unwrap();
1002-
let mut node_c_ser = VecWriter(Vec::new());
1003-
nodes[2].write(&mut node_c_ser).unwrap();
1000+
let mut node_a_ser = nodes[0].encode();
1001+
let mut node_b_ser = nodes[1].encode();
1002+
let mut node_c_ser = nodes[2].encode();
10041003

10051004
macro_rules! test_return {
10061005
() => {{
@@ -1675,7 +1674,7 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out, anchors: bool) {
16751674
ba_events.clear();
16761675
}
16771676
let (new_node_a, new_monitor_a) =
1678-
reload_node!(node_a_ser, 0, monitor_a, v, keys_manager_a, fee_est_a);
1677+
reload_node(&node_a_ser, 0, &monitor_a, v, &keys_manager_a, &fee_est_a);
16791678
nodes[0] = new_node_a;
16801679
monitor_a = new_monitor_a;
16811680
},
@@ -1699,7 +1698,7 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out, anchors: bool) {
16991698
// Note that we ensure 0x2d represents "use oldest monitor" to retain backwards
17001699
// compatibility with existing fuzz corpuses by using setting v % 3 == 0
17011700
let (new_node_b, new_monitor_b) =
1702-
reload_node!(node_b_ser, 1, monitor_b, v, keys_manager_b, fee_est_b);
1701+
reload_node(&node_b_ser, 1, &monitor_b, v, &keys_manager_b, &fee_est_b);
17031702
nodes[1] = new_node_b;
17041703
monitor_b = new_monitor_b;
17051704
},
@@ -1717,7 +1716,7 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out, anchors: bool) {
17171716
cb_events.clear();
17181717
}
17191718
let (new_node_c, new_monitor_c) =
1720-
reload_node!(node_c_ser, 2, monitor_c, v, keys_manager_c, fee_est_c);
1719+
reload_node(&node_c_ser, 2, &monitor_c, v, &keys_manager_c, &fee_est_c);
17211720
nodes[2] = new_node_c;
17221721
monitor_c = new_monitor_c;
17231722
},
@@ -1862,16 +1861,13 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out, anchors: bool) {
18621861
}
18631862

18641863
if nodes[0].get_and_clear_needs_persistence() == true {
1865-
node_a_ser.0.clear();
1866-
nodes[0].write(&mut node_a_ser).unwrap();
1864+
node_a_ser = nodes[0].encode();
18671865
}
18681866
if nodes[1].get_and_clear_needs_persistence() == true {
1869-
node_b_ser.0.clear();
1870-
nodes[1].write(&mut node_b_ser).unwrap();
1867+
node_b_ser = nodes[1].encode();
18711868
}
18721869
if nodes[2].get_and_clear_needs_persistence() == true {
1873-
node_c_ser.0.clear();
1874-
nodes[2].write(&mut node_c_ser).unwrap();
1870+
node_c_ser = nodes[2].encode();
18751871
}
18761872
}
18771873
}

0 commit comments

Comments
 (0)