Skip to content

Commit 2186fdd

Browse files
apollo_network_benchmark: add message index detection mechanism
1 parent 3093d1d commit 2186fdd

4 files changed

Lines changed: 63 additions & 14 deletions

File tree

‎crates/apollo_network_benchmark/src/bin/broadcast_network_stress_test_node/handlers.rs‎

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use apollo_network_benchmark::node_args::NodeArgs;
55
use libp2p::PeerId;
66

77
use crate::message::{StressTestMessage, METADATA_SIZE};
8+
use crate::message_index_detector::MessageIndexTracker;
89
use crate::metrics::{
910
get_throughput,
1011
BROADCAST_MESSAGE_BYTES,
@@ -17,6 +18,7 @@ use crate::metrics::{
1718
RECEIVE_MESSAGE_BYTES_SUM,
1819
RECEIVE_MESSAGE_COUNT,
1920
RECEIVE_MESSAGE_DELAY_SECONDS,
21+
RECEIVE_MESSAGE_PENDING_COUNT,
2022
};
2123
use crate::protocol::MessageSender;
2224

@@ -62,7 +64,11 @@ pub async fn send_stress_test_messages(
6264
}
6365
}
6466

65-
pub fn receive_stress_test_message(received_message: Vec<u8>, _sender_peer_id: Option<PeerId>) {
67+
pub fn receive_stress_test_message(
68+
received_message: Vec<u8>,
69+
_sender_peer_id: Option<PeerId>,
70+
tx: tokio::sync::mpsc::UnboundedSender<(usize, u64)>,
71+
) {
6672
let end_time = SystemTime::now();
6773

6874
let received_message: StressTestMessage = received_message.into();
@@ -81,4 +87,30 @@ pub fn receive_stress_test_message(received_message: Vec<u8>, _sender_peer_id: O
8187

8288
// Use apollo_metrics histograms for latency measurements
8389
RECEIVE_MESSAGE_DELAY_SECONDS.record(delay_seconds);
90+
91+
// Send to index tracker
92+
tx.send((
93+
usize::try_from(received_message.metadata.sender_id)
94+
.expect("sender_id too large for usize"),
95+
received_message.metadata.message_index,
96+
))
97+
.unwrap();
98+
}
99+
100+
pub async fn record_indexed_message(
101+
mut rx: tokio::sync::mpsc::UnboundedReceiver<(usize, u64)>,
102+
num_peers: usize,
103+
) {
104+
let mut index_tracker = vec![MessageIndexTracker::default(); num_peers];
105+
let mut all_pending = 0;
106+
while let Some((peer_id, index)) = rx.recv().await {
107+
let old_pending = index_tracker[peer_id].pending_messages_count();
108+
index_tracker[peer_id].seen_message(index);
109+
let new_pending = index_tracker[peer_id].pending_messages_count();
110+
111+
all_pending -= old_pending;
112+
all_pending += new_pending;
113+
114+
RECEIVE_MESSAGE_PENDING_COUNT.set(all_pending.into_f64());
115+
}
84116
}

‎crates/apollo_network_benchmark/src/bin/broadcast_network_stress_test_node/message_index_detector.rs‎

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,3 @@
1-
// TODO(AndrewL): remove this once the struct is used
2-
#![allow(dead_code)]
3-
41
#[derive(Default, Clone, Copy)]
52
pub struct MessageIndexTracker {
63
seen_messages_count: u64,

‎crates/apollo_network_benchmark/src/bin/broadcast_network_stress_test_node/metrics.rs‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ define_metrics!(
2828
MetricCounter { RECEIVE_MESSAGE_COUNT, "receive_message_count", "Number of stress test messages received via broadcast", init = 0 },
2929
MetricCounter { RECEIVE_MESSAGE_BYTES_SUM, "receive_message_bytes_sum", "Sum of the stress test messages received via broadcast", init = 0 },
3030
MetricHistogram { RECEIVE_MESSAGE_DELAY_SECONDS, "receive_message_delay_seconds", "Message delay in seconds" },
31+
MetricGauge { RECEIVE_MESSAGE_PENDING_COUNT, "receive_message_pending_count", "Number of stress test messages pending to be received" },
3132

3233
MetricGauge { NETWORK_CONNECTED_PEERS, "network_connected_peers", "Number of connected peers in the network" },
3334
MetricGauge { NETWORK_BLACKLISTED_PEERS, "network_blacklisted_peers", "Number of blacklisted peers in the network" },

‎crates/apollo_network_benchmark/src/bin/broadcast_network_stress_test_node/stress_test_node.rs‎

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,11 @@ use libp2p::{Multiaddr, PeerId};
1111
use tokio::task::JoinHandle;
1212
use tracing::{info, warn};
1313

14-
use crate::handlers::{receive_stress_test_message, send_stress_test_messages};
14+
use crate::handlers::{
15+
receive_stress_test_message,
16+
record_indexed_message,
17+
send_stress_test_messages,
18+
};
1519
use crate::metrics::create_network_metrics;
1620
use crate::protocol::{register_protocol_channels, MessageReceiver, MessageSender};
1721

@@ -138,24 +142,39 @@ impl BroadcastNetworkStressTestNode {
138142
)
139143
}
140144

141-
/// Starts the message receiving task
142-
pub async fn make_message_receiver_task(&mut self) -> BoxFuture<'static, ()> {
145+
/// Starts the message receiving tasks (receiver + index tracker)
146+
pub async fn make_message_receiver_tasks(&mut self) -> Vec<BoxFuture<'static, ()>> {
143147
let message_receiver =
144148
self.message_receiver.take().expect("message_receiver should be available");
145149

146-
async move {
147-
info!("Starting message receiver");
148-
message_receiver.for_each(receive_stress_test_message).await;
149-
info!("Message receiver task ended");
150-
}
151-
.boxed()
150+
let (tx, rx) = tokio::sync::mpsc::unbounded_channel();
151+
let num_peers = self.args.runner.bootstrap.len();
152+
153+
vec![
154+
async move {
155+
record_indexed_message(rx, num_peers).await;
156+
}
157+
.boxed(),
158+
async move {
159+
info!("Starting message receiver");
160+
let tx_clone = tx.clone();
161+
message_receiver
162+
.for_each(|message, peer_id| {
163+
let tx_clone = tx_clone.clone();
164+
receive_stress_test_message(message, peer_id, tx_clone);
165+
})
166+
.await;
167+
info!("Message receiver task ended");
168+
}
169+
.boxed(),
170+
]
152171
}
153172

154173
/// Gets all the tasks that need to be run
155174
async fn get_tasks(&mut self) -> Vec<BoxFuture<'static, ()>> {
156175
let mut tasks = Vec::new();
157176
tasks.push(self.start_network_manager().await);
158-
tasks.push(self.make_message_receiver_task().await);
177+
tasks.extend(self.make_message_receiver_tasks().await);
159178

160179
if let Some(sender_task) = self.start_message_sender().await {
161180
tasks.push(sender_task);

0 commit comments

Comments
 (0)