Skip to content

Commit 7ebaefb

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 55b62f2 commit 7ebaefb

File tree

1 file changed

+97
-101
lines changed

1 file changed

+97
-101
lines changed

fuzz/src/chanmon_consistency.rs

+97-101
Original file line numberDiff line numberDiff line change
@@ -678,95 +678,97 @@ 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 for
722-
// node B) by shifting `use_old_mons` one in base-3.
723-
use_old_mons /= 3;
724-
let mon = <(BlockHash, ChannelMonitor<TestChannelSigner>)>::read(
725-
&mut &serialized_mon[..],
726-
(&*$keys, &*$keys),
727-
)
728-
.expect("Failed to read monitor");
729-
monitors.insert(channel_id, mon.1);
730-
// Update the latest `ChannelMonitor` state to match what we just told LDK.
731-
prev_state.persisted_monitor = serialized_mon;
732-
// Wipe any `ChannelMonitor`s which we never told LDK we finished persisting,
733-
// considering them discarded. LDK should replay these for us as they're stored in
734-
// the `ChannelManager`.
735-
prev_state.pending_monitors.clear();
736-
chain_monitor.latest_monitors.lock().unwrap().insert(channel_id, prev_state);
737-
}
738-
let mut monitor_refs = new_hash_map();
739-
for (channel_id, monitor) in monitors.iter() {
740-
monitor_refs.insert(*channel_id, monitor);
741-
}
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+
}
742707

743-
let read_args = ChannelManagerReadArgs {
744-
entropy_source: Arc::clone(&keys_manager),
745-
node_signer: Arc::clone(&keys_manager),
746-
signer_provider: keys_manager,
747-
fee_estimator: $fee_estimator.clone(),
748-
chain_monitor: chain_monitor.clone(),
749-
tx_broadcaster: broadcast.clone(),
750-
router: &router,
751-
message_router: &router,
752-
logger,
753-
default_config: config,
754-
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)
755723
};
724+
// Use a different value of `use_old_mons` if we have another monitor (only for node B)
725+
// by shifting `use_old_mons` one in base-3.
726+
use_old_mons /= 3;
727+
let mon = <(BlockHash, ChannelMonitor<TestChannelSigner>)>::read(
728+
&mut &serialized_mon[..],
729+
(&**keys, &**keys),
730+
)
731+
.expect("Failed to read monitor");
732+
monitors.insert(channel_id, mon.1);
733+
// Update the latest `ChannelMonitor` state to match what we just told LDK.
734+
prev_state.persisted_monitor = serialized_mon;
735+
// Wipe any `ChannelMonitor`s which we never told LDK we finished persisting,
736+
// considering them discarded. LDK should replay these for us as they're stored in
737+
// the `ChannelManager`.
738+
prev_state.pending_monitors.clear();
739+
chain_monitor.latest_monitors.lock().unwrap().insert(channel_id, prev_state);
740+
}
741+
let mut monitor_refs = new_hash_map();
742+
for (channel_id, monitor) in monitors.iter() {
743+
monitor_refs.insert(*channel_id, monitor);
744+
}
756745

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

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

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

10061005
macro_rules! test_return {
10071006
() => {{
@@ -1676,7 +1675,7 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out, anchors: bool) {
16761675
ba_events.clear();
16771676
}
16781677
let (new_node_a, new_monitor_a) =
1679-
reload_node!(node_a_ser, 0, monitor_a, v, keys_manager_a, fee_est_a);
1678+
reload_node(&node_a_ser, 0, &monitor_a, v, &keys_manager_a, &fee_est_a);
16801679
nodes[0] = new_node_a;
16811680
monitor_a = new_monitor_a;
16821681
},
@@ -1698,7 +1697,7 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out, anchors: bool) {
16981697
cb_events.clear();
16991698
}
17001699
let (new_node_b, new_monitor_b) =
1701-
reload_node!(node_b_ser, 1, monitor_b, v, keys_manager_b, fee_est_b);
1700+
reload_node(&node_b_ser, 1, &monitor_b, v, &keys_manager_b, &fee_est_b);
17021701
nodes[1] = new_node_b;
17031702
monitor_b = new_monitor_b;
17041703
},
@@ -1716,7 +1715,7 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out, anchors: bool) {
17161715
cb_events.clear();
17171716
}
17181717
let (new_node_c, new_monitor_c) =
1719-
reload_node!(node_c_ser, 2, monitor_c, v, keys_manager_c, fee_est_c);
1718+
reload_node(&node_c_ser, 2, &monitor_c, v, &keys_manager_c, &fee_est_c);
17201719
nodes[2] = new_node_c;
17211720
monitor_c = new_monitor_c;
17221721
},
@@ -1861,16 +1860,13 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out, anchors: bool) {
18611860
}
18621861

18631862
if nodes[0].get_and_clear_needs_persistence() == true {
1864-
node_a_ser.0.clear();
1865-
nodes[0].write(&mut node_a_ser).unwrap();
1863+
node_a_ser = nodes[0].encode();
18661864
}
18671865
if nodes[1].get_and_clear_needs_persistence() == true {
1868-
node_b_ser.0.clear();
1869-
nodes[1].write(&mut node_b_ser).unwrap();
1866+
node_b_ser = nodes[1].encode();
18701867
}
18711868
if nodes[2].get_and_clear_needs_persistence() == true {
1872-
node_c_ser.0.clear();
1873-
nodes[2].write(&mut node_c_ser).unwrap();
1869+
node_c_ser = nodes[2].encode();
18741870
}
18751871
}
18761872
}

0 commit comments

Comments
 (0)