Skip to content

Commit 70f9409

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 586d46c commit 70f9409

File tree

1 file changed

+94
-93
lines changed

1 file changed

+94
-93
lines changed

fuzz/src/chanmon_consistency.rs

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

735-
let read_args = ChannelManagerReadArgs {
736-
entropy_source: Arc::clone(&keys_manager),
737-
node_signer: Arc::clone(&keys_manager),
738-
signer_provider: keys_manager,
739-
fee_estimator: $fee_estimator.clone(),
740-
chain_monitor: chain_monitor.clone(),
741-
tx_broadcaster: broadcast.clone(),
742-
router: &router,
743-
message_router: &router,
744-
logger,
745-
default_config: config,
746-
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+
prev_state.persisted_monitor
713+
} else if use_old_mons % 3 == 1 {
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+
let old_mon = prev_state.persisted_monitor;
718+
prev_state.pending_monitors.pop().map(|(_, v)| v).unwrap_or(old_mon)
747719
};
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+
}
748738

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

763766
let mut channel_txn = Vec::new();
764767
macro_rules! make_channel {
@@ -962,6 +965,10 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out, anchors: bool) {
962965
let (node_b, mut monitor_b, keys_manager_b) = make_node!(1, fee_est_b);
963966
let (node_c, mut monitor_c, keys_manager_c) = make_node!(2, fee_est_c);
964967

968+
let empty_node_a_ser = node_a.encode();
969+
let empty_node_b_ser = node_b.encode();
970+
let empty_node_c_ser = node_c.encode();
971+
965972
let mut nodes = [node_a, node_b, node_c];
966973

967974
let chan_1_id = make_channel!(nodes[0], nodes[1], keys_manager_b, 0);
@@ -988,12 +995,9 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out, anchors: bool) {
988995
let mut bc_events = Vec::new();
989996
let mut cb_events = Vec::new();
990997

991-
let mut node_a_ser = VecWriter(Vec::new());
992-
nodes[0].write(&mut node_a_ser).unwrap();
993-
let mut node_b_ser = VecWriter(Vec::new());
994-
nodes[1].write(&mut node_b_ser).unwrap();
995-
let mut node_c_ser = VecWriter(Vec::new());
996-
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();
9971001

9981002
macro_rules! test_return {
9991003
() => {{
@@ -1521,7 +1525,7 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out, anchors: bool) {
15211525
// Note that we ensure 0x2c represents "use oldest monitor" to retain backwards
15221526
// compatibility with existing fuzz corpuses by using setting (v + 1) % 3 == 0
15231527
let (new_node_a, new_monitor_a) =
1524-
reload_node!(node_a_ser, 0, monitor_a, v + 1, keys_manager_a, fee_est_a);
1528+
reload_node(&node_a_ser, 0, &monitor_a, v + 1, &keys_manager_a, &fee_est_a);
15251529
nodes[0] = new_node_a;
15261530
monitor_a = new_monitor_a;
15271531
},
@@ -1543,7 +1547,7 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out, anchors: bool) {
15431547
// Note that we ensure 0x2d represents "use oldest monitor" to retain backwards
15441548
// compatibility with existing fuzz corpuses by using setting v % 3 == 0
15451549
let (new_node_b, new_monitor_b) =
1546-
reload_node!(node_b_ser, 1, monitor_b, v, keys_manager_b, fee_est_b);
1550+
reload_node(&node_b_ser, 1, &monitor_b, v, &keys_manager_b, &fee_est_b);
15471551
nodes[1] = new_node_b;
15481552
monitor_b = new_monitor_b;
15491553
},
@@ -1561,7 +1565,7 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out, anchors: bool) {
15611565
// Note that we ensure 0x2e represents "use oldest monitor" to retain backwards
15621566
// compatibility with existing fuzz corpuses by using setting (v + 2) % 3 == 0
15631567
let (new_node_c, new_monitor_c) =
1564-
reload_node!(node_c_ser, 2, monitor_c, v + 2, keys_manager_c, fee_est_c);
1568+
reload_node(&node_c_ser, 2, &monitor_c, v + 2, &keys_manager_c, &fee_est_c);
15651569
nodes[2] = new_node_c;
15661570
monitor_c = new_monitor_c;
15671571
},
@@ -1855,16 +1859,13 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out, anchors: bool) {
18551859
}
18561860

18571861
if nodes[0].get_and_clear_needs_persistence() == true {
1858-
node_a_ser.0.clear();
1859-
nodes[0].write(&mut node_a_ser).unwrap();
1862+
node_a_ser = nodes[0].encode();
18601863
}
18611864
if nodes[1].get_and_clear_needs_persistence() == true {
1862-
node_b_ser.0.clear();
1863-
nodes[1].write(&mut node_b_ser).unwrap();
1865+
node_b_ser = nodes[1].encode();
18641866
}
18651867
if nodes[2].get_and_clear_needs_persistence() == true {
1866-
node_c_ser.0.clear();
1867-
nodes[2].write(&mut node_c_ser).unwrap();
1868+
node_c_ser = nodes[2].encode();
18681869
}
18691870
}
18701871
}

0 commit comments

Comments
 (0)