Skip to content

Commit d009b39

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 d7052b0 commit d009b39

File tree

1 file changed

+94
-97
lines changed

1 file changed

+94
-97
lines changed

fuzz/src/chanmon_consistency.rs

+94-97
Original file line numberDiff line numberDiff line change
@@ -678,91 +678,94 @@ 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-
for (channel_id, mut prev_state) in old_monitors.drain() {
707-
let serialized_mon = if $use_old_mons % 3 == 0 {
708-
// Reload with the oldest `ChannelMonitor` (the one that we already told
709-
// `ChannelManager` we finished persisting).
710-
prev_state.persisted_monitor
711-
} else if $use_old_mons % 3 == 1 {
712-
// Reload with the second-oldest `ChannelMonitor`
713-
let old_mon = prev_state.persisted_monitor;
714-
prev_state.pending_monitors.drain(..).next().map(|(_, v)| v).unwrap_or(old_mon)
715-
} else {
716-
// Reload with the newest `ChannelMonitor`
717-
let old_mon = prev_state.persisted_monitor;
718-
prev_state.pending_monitors.pop().map(|(_, v)| v).unwrap_or(old_mon)
719-
};
720-
let mon = <(BlockHash, ChannelMonitor<TestChannelSigner>)>::read(
721-
&mut &serialized_mon[..],
722-
(&*$keys, &*$keys),
723-
)
724-
.expect("Failed to read monitor");
725-
monitors.insert(channel_id, mon.1);
726-
// Update the latest `ChannelMonitor` state to match what we just told LDK.
727-
prev_state.persisted_monitor = serialized_mon;
728-
// Wipe any `ChannelMonitor`s which we never told LDK we finished persisting,
729-
// considering them discarded. LDK should replay these for us as they're stored in
730-
// the `ChannelManager`.
731-
prev_state.pending_monitors.clear();
732-
chain_monitor.latest_monitors.lock().unwrap().insert(channel_id, prev_state);
733-
}
734-
let mut monitor_refs = new_hash_map();
735-
for (channel_id, monitor) in monitors.iter() {
736-
monitor_refs.insert(*channel_id, monitor);
737-
}
681+
let reload_node = |ser: &Vec<u8>,
682+
node_id: u8,
683+
old_monitors: &TestChainMonitor,
684+
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+
}
738707

739-
let read_args = ChannelManagerReadArgs {
740-
entropy_source: Arc::clone(&keys_manager),
741-
node_signer: Arc::clone(&keys_manager),
742-
signer_provider: keys_manager,
743-
fee_estimator: $fee_estimator.clone(),
744-
chain_monitor: chain_monitor.clone(),
745-
tx_broadcaster: broadcast.clone(),
746-
router: &router,
747-
message_router: &router,
748-
logger,
749-
default_config: config,
750-
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)
751723
};
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+
}
752742

753-
let manager = <(BlockHash, ChanMan)>::read(&mut &$ser.0[..], read_args)
754-
.expect("Failed to read manager");
755-
let res = (manager.1, chain_monitor.clone());
756-
for (channel_id, mon) in monitors.drain() {
757-
assert_eq!(
758-
chain_monitor.chain_monitor.watch_channel(channel_id, mon),
759-
Ok(ChannelMonitorUpdateStatus::Completed)
760-
);
761-
}
762-
*chain_monitor.persister.update_ret.lock().unwrap() = *mon_style[$node_id].borrow();
763-
res
764-
}};
765-
}
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: Arc::clone(fee_estimator),
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,
755+
};
756+
757+
let manager =
758+
<(BlockHash, ChanMan)>::read(&mut &ser[..], read_args).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 as usize].borrow();
767+
res
768+
};
766769

767770
let mut channel_txn = Vec::new();
768771
macro_rules! make_channel {
@@ -992,12 +995,9 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out, anchors: bool) {
992995
let mut bc_events = Vec::new();
993996
let mut cb_events = Vec::new();
994997

995-
let mut node_a_ser = VecWriter(Vec::new());
996-
nodes[0].write(&mut node_a_ser).unwrap();
997-
let mut node_b_ser = VecWriter(Vec::new());
998-
nodes[1].write(&mut node_b_ser).unwrap();
999-
let mut node_c_ser = VecWriter(Vec::new());
1000-
nodes[2].write(&mut node_c_ser).unwrap();
998+
let mut node_a_ser = nodes[0].encode();
999+
let mut node_b_ser = nodes[1].encode();
1000+
let mut node_c_ser = nodes[2].encode();
10011001

10021002
macro_rules! test_return {
10031003
() => {{
@@ -1527,7 +1527,7 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out, anchors: bool) {
15271527
// Note that we ensure 0x2c represents "use oldest monitor" to retain backwards
15281528
// compatibility with existing fuzz corpuses by using setting (v + 1) % 3 == 0
15291529
let (new_node_a, new_monitor_a) =
1530-
reload_node!(node_a_ser, 0, monitor_a, v + 1, keys_manager_a, fee_est_a);
1530+
reload_node(&node_a_ser, 0, &monitor_a, v + 1, &keys_manager_a, &fee_est_a);
15311531
nodes[0] = new_node_a;
15321532
monitor_a = new_monitor_a;
15331533
},
@@ -1551,7 +1551,7 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out, anchors: bool) {
15511551
// Note that we ensure 0x2d represents "use oldest monitor" to retain backwards
15521552
// compatibility with existing fuzz corpuses by using setting v % 3 == 0
15531553
let (new_node_b, new_monitor_b) =
1554-
reload_node!(node_b_ser, 1, monitor_b, v, keys_manager_b, fee_est_b);
1554+
reload_node(&node_b_ser, 1, &monitor_b, v, &keys_manager_b, &fee_est_b);
15551555
nodes[1] = new_node_b;
15561556
monitor_b = new_monitor_b;
15571557
},
@@ -1571,7 +1571,7 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out, anchors: bool) {
15711571
// Note that we ensure 0x2e represents "use oldest monitor" to retain backwards
15721572
// compatibility with existing fuzz corpuses by using setting (v + 2) % 3 == 0
15731573
let (new_node_c, new_monitor_c) =
1574-
reload_node!(node_c_ser, 2, monitor_c, v + 2, keys_manager_c, fee_est_c);
1574+
reload_node(&node_c_ser, 2, &monitor_c, v + 2, &keys_manager_c, &fee_est_c);
15751575
nodes[2] = new_node_c;
15761576
monitor_c = new_monitor_c;
15771577
},
@@ -1863,16 +1863,13 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out, anchors: bool) {
18631863
}
18641864

18651865
if nodes[0].get_and_clear_needs_persistence() == true {
1866-
node_a_ser.0.clear();
1867-
nodes[0].write(&mut node_a_ser).unwrap();
1866+
node_a_ser = nodes[0].encode();
18681867
}
18691868
if nodes[1].get_and_clear_needs_persistence() == true {
1870-
node_b_ser.0.clear();
1871-
nodes[1].write(&mut node_b_ser).unwrap();
1869+
node_b_ser = nodes[1].encode();
18721870
}
18731871
if nodes[2].get_and_clear_needs_persistence() == true {
1874-
node_c_ser.0.clear();
1875-
nodes[2].write(&mut node_c_ser).unwrap();
1872+
node_c_ser = nodes[2].encode();
18761873
}
18771874
}
18781875
}

0 commit comments

Comments
 (0)