Skip to content
This repository was archived by the owner on Dec 26, 2024. It is now read-only.

Commit e23be56

Browse files
refactor(network): move responses sender into query sender (#2233)
1 parent 3bb9411 commit e23be56

File tree

9 files changed

+250
-252
lines changed

9 files changed

+250
-252
lines changed

crates/papyrus_network/src/lib.rs

-2
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,6 @@ use papyrus_config::{ParamPath, ParamPrivacyInput, SerializedParam};
3030
use serde::{Deserialize, Serialize};
3131
use validator::Validate;
3232

33-
pub use crate::network_manager::SqmrSubscriberChannels;
34-
3533
// TODO: add peer manager config to the network config
3634
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Validate)]
3735
pub struct NetworkConfig {

crates/papyrus_network/src/network_manager/mod.rs

+104-126
Large diffs are not rendered by default.

crates/papyrus_network/src/network_manager/test.rs

+15-11
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use std::collections::{HashMap, HashSet};
2+
use std::convert::Infallible;
23
use std::pin::Pin;
34
use std::sync::Arc;
45
use std::task::{Context, Poll};
@@ -21,9 +22,10 @@ use tokio::sync::Mutex;
2122
use tokio::time::sleep;
2223

2324
use super::swarm_trait::{Event, SwarmTrait};
24-
use super::{GenericNetworkManager, SqmrSubscriberChannels};
25+
use super::GenericNetworkManager;
2526
use crate::gossipsub_impl::{self, Topic};
2627
use crate::mixed_behaviour;
28+
use crate::network_manager::SqmrClientPayload;
2729
use crate::sqmr::behaviour::{PeerNotConnected, SessionIdNotFoundError};
2830
use crate::sqmr::{Bytes, GenericEvent, InboundSessionId, OutboundSessionId};
2931

@@ -215,18 +217,20 @@ async fn register_sqmr_protocol_client_and_use_channels() {
215217
let (event_notifier, mut event_listner) = oneshot::channel();
216218
mock_swarm.first_polled_event_notifier = Some(event_notifier);
217219

218-
// network manager to register subscriber and send query
220+
// network manager to register subscriber
219221
let mut network_manager = GenericNetworkManager::generic_new(mock_swarm);
220222

221-
// register subscriber and send query
222-
let SqmrSubscriberChannels { mut query_sender, response_receiver } = network_manager
223-
.register_sqmr_protocol_client::<Vec<u8>, Vec<u8>>(
224-
SIGNED_BLOCK_HEADER_PROTOCOL.to_string(),
225-
BUFFER_SIZE,
226-
);
223+
// register subscriber and send payload
224+
let mut payload_sender = network_manager.register_sqmr_protocol_client::<Vec<u8>, Vec<u8>>(
225+
SIGNED_BLOCK_HEADER_PROTOCOL.to_string(),
226+
BUFFER_SIZE,
227+
);
227228

228229
let response_receiver_length = Arc::new(Mutex::new(0));
229230
let cloned_response_receiver_length = Arc::clone(&response_receiver_length);
231+
let (responses_sender, response_receiver) =
232+
futures::channel::mpsc::channel::<Result<Vec<u8>, Infallible>>(BUFFER_SIZE);
233+
let responses_sender = Box::new(responses_sender);
230234
let response_receiver_collector = response_receiver
231235
.enumerate()
232236
.take(VEC1.len())
@@ -237,11 +241,11 @@ async fn register_sqmr_protocol_client_and_use_channels() {
237241
result
238242
})
239243
.collect::<Vec<_>>();
240-
let (_report_callback, report_receiver) = oneshot::channel::<()>();
244+
let (_report_sender, report_receiver) = oneshot::channel::<()>();
241245
tokio::select! {
242246
_ = network_manager.run() => panic!("network manager ended"),
243247
_ = poll_fn(|cx| event_listner.poll_unpin(cx)).then(|_| async move {
244-
query_sender.send((VEC1.clone(), report_receiver)).await.unwrap()})
248+
payload_sender.send(SqmrClientPayload{query : VEC1.clone(), report_receiver, responses_sender}).await.unwrap()})
245249
.then(|_| async move {
246250
*cloned_response_receiver_length.lock().await = response_receiver_collector.await.len();
247251
}) => {},
@@ -364,7 +368,7 @@ async fn receive_broadcasted_message_and_report_it() {
364368
.then(|result| {
365369
let (message_result, report_callback) = result.unwrap().unwrap();
366370
assert_eq!(message, message_result.unwrap());
367-
report_callback();
371+
report_callback.send(()).unwrap();
368372
tokio::time::timeout(TIMEOUT, reported_peer_receiver.next())
369373
}) => {
370374
assert_eq!(originated_peer_id, reported_peer_result.unwrap().unwrap());

crates/papyrus_node/src/main.rs

+6-9
Original file line numberDiff line numberDiff line change
@@ -355,11 +355,11 @@ fn run_network(
355355
};
356356
let mut network_manager = network_manager::NetworkManager::new(network_config.clone());
357357
let local_peer_id = network_manager.get_local_peer_id();
358-
let header_client_channels = network_manager
358+
let header_client_sender = network_manager
359359
.register_sqmr_protocol_client(Protocol::SignedBlockHeader.into(), BUFFER_SIZE);
360-
let state_diff_client_channels =
360+
let state_diff_client_sender =
361361
network_manager.register_sqmr_protocol_client(Protocol::StateDiff.into(), BUFFER_SIZE);
362-
let transaction_client_channels =
362+
let transaction_client_sender =
363363
network_manager.register_sqmr_protocol_client(Protocol::Transaction.into(), BUFFER_SIZE);
364364

365365
let header_server_channel = network_manager
@@ -381,12 +381,9 @@ fn run_network(
381381
None => None,
382382
};
383383
let p2p_sync_channels = P2PSyncClientChannels {
384-
header_query_sender: Box::new(header_client_channels.query_sender),
385-
header_response_receiver: Box::new(header_client_channels.response_receiver),
386-
state_diff_query_sender: Box::new(state_diff_client_channels.query_sender),
387-
state_diff_response_receiver: Box::new(state_diff_client_channels.response_receiver),
388-
transaction_query_sender: Box::new(transaction_client_channels.query_sender),
389-
transaction_response_receiver: Box::new(transaction_client_channels.response_receiver),
384+
header_payload_sender: header_client_sender,
385+
state_diff_payload_sender: state_diff_client_sender,
386+
transaction_payload_sender: transaction_client_sender,
390387
};
391388

392389
Ok((

crates/papyrus_p2p_sync/src/client/header_test.rs

+23-15
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use futures::{SinkExt, StreamExt};
2+
use papyrus_network::network_manager::SqmrClientPayload;
23
use papyrus_protobuf::sync::{
34
BlockHashOrNumber,
45
DataOrFin,
@@ -27,11 +28,9 @@ async fn signed_headers_basic_flow() {
2728
let TestArgs {
2829
p2p_sync,
2930
storage_reader,
30-
mut header_query_receiver,
31-
mut headers_sender,
31+
mut header_payload_receiver,
3232
// The test will fail if we drop these
33-
state_diff_query_receiver: _state_diff_query_receiver,
34-
state_diffs_sender: _state_diffs_sender,
33+
state_diff_payload_receiver: _state_diff_query_receiver,
3534
..
3635
} = setup();
3736
let block_hashes_and_signatures =
@@ -44,7 +43,11 @@ async fn signed_headers_basic_flow() {
4443
let end_block_number = (query_index + 1) * HEADER_QUERY_LENGTH;
4544

4645
// Receive query and validate it.
47-
let (query, _report_receiver) = header_query_receiver.next().await.unwrap();
46+
let SqmrClientPayload {
47+
query,
48+
report_receiver: _report_receiver,
49+
responses_sender: mut headers_sender,
50+
} = header_payload_receiver.next().await.unwrap();
4851
assert_eq!(
4952
query,
5053
HeaderQuery(Query {
@@ -110,18 +113,20 @@ async fn sync_sends_new_header_query_if_it_got_partial_responses() {
110113

111114
let TestArgs {
112115
p2p_sync,
113-
mut header_query_receiver,
114-
mut headers_sender,
116+
mut header_payload_receiver,
115117
// The test will fail if we drop these
116-
state_diff_query_receiver: _state_diff_query_receiver,
117-
state_diffs_sender: _state_diffs_sender,
118+
state_diff_payload_receiver: _state_diff_query_receiver,
118119
..
119120
} = setup();
120121
let block_hashes_and_signatures = create_block_hashes_and_signatures(NUM_ACTUAL_RESPONSES);
121122

122123
// Create a future that will receive a query, send partial responses and receive the next query.
123124
let parse_queries_future = async move {
124-
let _query = header_query_receiver.next().await.unwrap();
125+
let SqmrClientPayload {
126+
query: _query,
127+
report_receiver: _report_receiver,
128+
responses_sender: mut headers_sender,
129+
} = header_payload_receiver.next().await.unwrap();
125130

126131
for (i, (block_hash, signature)) in block_hashes_and_signatures.into_iter().enumerate() {
127132
headers_sender
@@ -140,11 +145,14 @@ async fn sync_sends_new_header_query_if_it_got_partial_responses() {
140145
headers_sender.send(Ok(DataOrFin(None))).await.unwrap();
141146

142147
// First unwrap is for the timeout. Second unwrap is for the Option returned from Stream.
143-
let (query, _report_receiver) =
144-
timeout(TIMEOUT_FOR_NEW_QUERY_AFTER_PARTIAL_RESPONSE, header_query_receiver.next())
145-
.await
146-
.unwrap()
147-
.unwrap();
148+
let SqmrClientPayload {
149+
query,
150+
report_receiver: _report_receiver,
151+
responses_sender: _responses_sender,
152+
} = timeout(TIMEOUT_FOR_NEW_QUERY_AFTER_PARTIAL_RESPONSE, header_payload_receiver.next())
153+
.await
154+
.unwrap()
155+
.unwrap();
148156

149157
assert_eq!(
150158
query,

crates/papyrus_p2p_sync/src/client/mod.rs

+39-31
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,12 @@ use std::time::Duration;
1414
use futures::channel::mpsc::SendError;
1515
use futures::future::{ready, Ready};
1616
use futures::sink::With;
17-
use futures::{Sink, SinkExt, Stream};
17+
use futures::{SinkExt, Stream};
1818
use header::HeaderStreamBuilder;
1919
use papyrus_config::converters::deserialize_seconds_to_duration;
2020
use papyrus_config::dumping::{ser_optional_param, ser_param, SerializeConfig};
2121
use papyrus_config::{ParamPath, ParamPrivacyInput, SerializedParam};
22-
use papyrus_network::network_manager::ReportReceiver;
22+
use papyrus_network::network_manager::{SqmrClientPayload, SqmrClientSender};
2323
use papyrus_protobuf::converters::ProtobufConversionError;
2424
use papyrus_protobuf::sync::{
2525
DataOrFin,
@@ -159,32 +159,29 @@ pub enum P2PSyncError {
159159
SendError(#[from] SendError),
160160
}
161161

162-
type Response<T> = Result<DataOrFin<T>, ProtobufConversionError>;
163162
// TODO(Eitan): Use SqmrSubscriberChannels once there is a utility function for testing
164-
type QuerySender<T> =
165-
Box<dyn Sink<(T, ReportReceiver), Error = SendError> + Unpin + Send + 'static>;
166-
type WithQuerySender<T> = With<
167-
QuerySender<T>,
168-
(T, ReportReceiver),
169-
(Query, ReportReceiver),
170-
Ready<Result<(T, ReportReceiver), SendError>>,
171-
fn((Query, ReportReceiver)) -> Ready<Result<(T, ReportReceiver), SendError>>,
163+
164+
type WithPayloadSender<TQuery, Response> = With<
165+
SqmrClientSender<TQuery, Response>,
166+
SqmrClientPayload<TQuery, Response>,
167+
SqmrClientPayload<Query, Response>,
168+
Ready<Result<SqmrClientPayload<TQuery, Response>, SendError>>,
169+
fn(
170+
SqmrClientPayload<Query, Response>,
171+
) -> Ready<Result<SqmrClientPayload<TQuery, Response>, SendError>>,
172172
>;
173-
type ResponseReceiver<T> = Box<dyn Stream<Item = Response<T>> + Unpin + Send + 'static>;
174-
type HeaderQuerySender = QuerySender<HeaderQuery>;
175-
type HeaderResponseReceiver = ResponseReceiver<SignedBlockHeader>;
176-
type StateDiffQuerySender = QuerySender<StateDiffQuery>;
177-
type StateDiffResponseReceiver = ResponseReceiver<StateDiffChunk>;
178-
type TransactionQuerySender = QuerySender<TransactionQuery>;
179-
type TransactionResponseReceiver = ResponseReceiver<(Transaction, TransactionOutput)>;
173+
type SyncResponse<T> = Result<DataOrFin<T>, ProtobufConversionError>;
174+
type ResponseReceiver<T> = Box<dyn Stream<Item = SyncResponse<T>> + Unpin + Send>;
175+
176+
type HeaderPayloadSender = SqmrClientSender<HeaderQuery, DataOrFin<SignedBlockHeader>>;
177+
type StateDiffPayloadSender = SqmrClientSender<StateDiffQuery, DataOrFin<StateDiffChunk>>;
178+
type TransactionPayloadSender =
179+
SqmrClientSender<TransactionQuery, DataOrFin<(Transaction, TransactionOutput)>>;
180180

181181
pub struct P2PSyncClientChannels {
182-
pub header_query_sender: HeaderQuerySender,
183-
pub header_response_receiver: HeaderResponseReceiver,
184-
pub state_diff_query_sender: StateDiffQuerySender,
185-
pub state_diff_response_receiver: StateDiffResponseReceiver,
186-
pub transaction_query_sender: TransactionQuerySender,
187-
pub transaction_response_receiver: TransactionResponseReceiver,
182+
pub header_payload_sender: HeaderPayloadSender,
183+
pub state_diff_payload_sender: StateDiffPayloadSender,
184+
pub transaction_payload_sender: TransactionPayloadSender,
188185
}
189186

190187
impl P2PSyncClientChannels {
@@ -194,20 +191,31 @@ impl P2PSyncClientChannels {
194191
config: P2PSyncClientConfig,
195192
) -> impl Stream<Item = DataStreamResult> + Send + 'static {
196193
let header_stream = HeaderStreamBuilder::create_stream(
197-
self.header_query_sender
198-
.with(|(query, report_receiver)| ready(Ok((HeaderQuery(query), report_receiver)))),
199-
self.header_response_receiver,
194+
self.header_payload_sender.with(
195+
|SqmrClientPayload { query, report_receiver, responses_sender }| {
196+
ready(Ok(SqmrClientPayload {
197+
query: HeaderQuery(query),
198+
report_receiver,
199+
responses_sender,
200+
}))
201+
},
202+
),
200203
storage_reader.clone(),
201204
config.wait_period_for_new_data,
202205
config.num_headers_per_query,
203206
config.stop_sync_at_block_number,
204207
);
205208

206209
let state_diff_stream = StateDiffStreamBuilder::create_stream(
207-
self.state_diff_query_sender.with(|(query, report_receiver)| {
208-
ready(Ok((StateDiffQuery(query), report_receiver)))
209-
}),
210-
self.state_diff_response_receiver,
210+
self.state_diff_payload_sender.with(
211+
|SqmrClientPayload { query, report_receiver, responses_sender }| {
212+
ready(Ok(SqmrClientPayload {
213+
query: StateDiffQuery(query),
214+
report_receiver,
215+
responses_sender,
216+
}))
217+
},
218+
),
211219
storage_reader.clone(),
212220
config.wait_period_for_new_data,
213221
config.num_block_state_diffs_per_query,

0 commit comments

Comments
 (0)