11use std:: time:: { Duration , SystemTime } ;
22
33use apollo_metrics:: metrics:: LossyIntoF64 ;
4- use apollo_network_benchmark:: node_args:: NodeArgs ;
4+ use apollo_network_benchmark:: node_args:: { Mode , NodeArgs } ;
55use libp2p:: PeerId ;
6+ use tracing:: trace;
67
78use crate :: message:: { StressTestMessage , METADATA_SIZE } ;
89use crate :: message_index_detector:: MessageIndexTracker ;
910use crate :: metrics:: {
1011 get_throughput,
12+ seconds_since_epoch,
1113 BROADCAST_MESSAGE_BYTES ,
1214 BROADCAST_MESSAGE_BYTES_SUM ,
1315 BROADCAST_MESSAGE_COUNT ,
@@ -33,6 +35,14 @@ fn get_message(id: u64, size_bytes: usize) -> StressTestMessage {
3335 message
3436}
3537
38+ fn should_broadcast_round_robin ( args : & NodeArgs ) -> bool {
39+ let now_seconds = seconds_since_epoch ( ) ;
40+ let round_duration_seconds = args. user . round_duration_seconds ;
41+ let num_nodes: u64 = args. runner . bootstrap . len ( ) . try_into ( ) . unwrap ( ) ;
42+ let current_round = ( now_seconds / round_duration_seconds) % num_nodes;
43+ args. runner . id == current_round
44+ }
45+
3646/// Unified implementation for sending stress test messages via any protocol
3747pub async fn send_stress_test_messages (
3848 mut message_sender : MessageSender ,
@@ -50,17 +60,30 @@ pub async fn send_stress_test_messages(
5060 loop {
5161 interval. tick ( ) . await ;
5262
53- message. metadata . time = SystemTime :: now ( ) ;
54- message. metadata . message_index = message_index;
55- let message_clone = message. clone ( ) . into ( ) ;
56- let start_time = std:: time:: Instant :: now ( ) ;
57- message_sender. send_message ( & peers, message_clone) . await ;
58- BROADCAST_MESSAGE_SEND_DELAY_SECONDS . record ( start_time. elapsed ( ) . as_secs_f64 ( ) ) ;
59- BROADCAST_MESSAGE_BYTES . set ( message. len ( ) . into_f64 ( ) ) ;
60- BROADCAST_MESSAGE_COUNT . increment ( 1 ) ;
61- BROADCAST_MESSAGE_BYTES_SUM
62- . increment ( u64:: try_from ( message. len ( ) ) . expect ( "Message length too large for u64" ) ) ;
63- message_index += 1 ;
63+ // Check if this node should broadcast based on the mode
64+ let should_broadcast_now = match args. user . mode {
65+ Mode :: AllBroadcast | Mode :: OneBroadcast => true ,
66+ Mode :: RoundRobin => should_broadcast_round_robin ( args) ,
67+ } ;
68+
69+ if should_broadcast_now {
70+ message. metadata . time = SystemTime :: now ( ) ;
71+ message. metadata . message_index = message_index;
72+ let message_clone = message. clone ( ) . into ( ) ;
73+ let start_time = std:: time:: Instant :: now ( ) ;
74+ message_sender. send_message ( & peers, message_clone) . await ;
75+ BROADCAST_MESSAGE_SEND_DELAY_SECONDS . record ( start_time. elapsed ( ) . as_secs_f64 ( ) ) ;
76+ BROADCAST_MESSAGE_BYTES . set ( message. len ( ) . into_f64 ( ) ) ;
77+ BROADCAST_MESSAGE_COUNT . increment ( 1 ) ;
78+ BROADCAST_MESSAGE_BYTES_SUM
79+ . increment ( u64:: try_from ( message. len ( ) ) . expect ( "Message length too large for u64" ) ) ;
80+ trace ! (
81+ "Node {} sent message {message_index} in mode `{}`" ,
82+ args. runner. id,
83+ args. user. mode
84+ ) ;
85+ message_index += 1 ;
86+ }
6487 }
6588}
6689
0 commit comments