1mod error;
5pub mod message;
6pub mod request_manager;
7mod state;
8
9#[cfg(test)]
10pub mod tests;
11
12mod synchronization_graph;
13mod synchronization_phases;
14mod synchronization_protocol_handler;
15mod synchronization_service;
16mod synchronization_state;
17pub mod utils;
18
19pub use self::{
20 error::Error,
21 state::StateSyncConfiguration,
22 synchronization_graph::{
23 SharedSynchronizationGraph, SyncGraphConfig, SyncGraphStatistics,
24 SynchronizationGraph, SynchronizationGraphInner,
25 SynchronizationGraphNode,
26 },
27 synchronization_phases::{
28 CatchUpCheckpointPhase, CatchUpFillBlockBodyPhase,
29 CatchUpRecoverBlockHeaderFromDbPhase, CatchUpSyncBlockHeaderPhase,
30 CatchUpSyncBlockPhase, NormalSyncPhase, SyncPhaseType,
31 SynchronizationPhaseManager, SynchronizationPhaseTrait,
32 },
33 synchronization_protocol_handler::{
34 LocalMessageTask, ProtocolConfiguration, SyncHandlerWorkType,
35 SynchronizationProtocolHandler, CHECK_RPC_REQUEST_TIMER,
36 },
37 synchronization_service::{
38 SharedSynchronizationService, SynchronizationService,
39 },
40 synchronization_state::{SynchronizationPeerState, SynchronizationState},
41};
42use network::service::ProtocolVersion;
43
44const SYNCHRONIZATION_PROTOCOL_VERSION: ProtocolVersion = ProtocolVersion(3);
57const SYNCHRONIZATION_PROTOCOL_OLD_VERSIONS_TO_SUPPORT: u8 = 2;
59pub const SYNC_PROTO_V1: ProtocolVersion = ProtocolVersion(1);
61pub const SYNC_PROTO_V2: ProtocolVersion = ProtocolVersion(2);
62pub const SYNC_PROTO_V3: ProtocolVersion = ProtocolVersion(3);
63
64pub mod random {
65 use rand;
66 pub fn new() -> rand::prelude::ThreadRng { rand::rng() }
67}
68
69pub mod msg_sender {
70 use super::message::msgid;
71 use crate::message::MsgId;
72 use metrics::{register_meter_with_group, Meter};
73 use std::sync::Arc;
74
75 pub const NULL: usize = !0;
76
77 lazy_static! {
78 static ref GET_BLOCK_TXN_RESPOPNSE_METER: Arc<dyn Meter> =
79 register_meter_with_group(
80 "network_connection_data",
81 "get_block_txn_response"
82 );
83 static ref GET_BLOCK_TXN_RESPOPNSE_COUNTER: Arc<dyn Meter> =
84 register_meter_with_group(
85 "network_connection_data_counter",
86 "get_block_txn_response_counter"
87 );
88 static ref DYNAMIC_CAPABILITY_CHANGE_METER: Arc<dyn Meter> =
89 register_meter_with_group(
90 "network_connection_data",
91 "dynamic_capability_change"
92 );
93 static ref DYNAMIC_CAPABILITY_CHANGE_COUNTER: Arc<dyn Meter> =
94 register_meter_with_group(
95 "network_connection_data_counter",
96 "dynamic_capability_change_counter"
97 );
98 static ref TRANSACTION_DIGESTS_METER: Arc<dyn Meter> =
99 register_meter_with_group(
100 "network_connection_data",
101 "transaction_digests"
102 );
103 static ref TRANSACTION_DIGESTS_COUNTER: Arc<dyn Meter> =
104 register_meter_with_group(
105 "network_connection_data_counter",
106 "transaction_digests_counter"
107 );
108 static ref GET_TRANSACTIONS_METER: Arc<dyn Meter> =
109 register_meter_with_group(
110 "network_connection_data",
111 "get_transactions"
112 );
113 static ref GET_TRANSACTIONS_COUNTER: Arc<dyn Meter> =
114 register_meter_with_group(
115 "network_connection_data_counter",
116 "get_transactions_counter"
117 );
118 static ref GET_TRANSACTIONS_RESPONSE_METER: Arc<dyn Meter> =
119 register_meter_with_group(
120 "network_connection_data",
121 "get_transactions_response"
122 );
123 static ref GET_TRANSACTIONS_RESPONSE_COUNTER: Arc<dyn Meter> =
124 register_meter_with_group(
125 "network_connection_data_counter",
126 "get_transactions_response_counter"
127 );
128 static ref GET_BLOCK_HASHES_BY_EPOCH_METER: Arc<dyn Meter> =
129 register_meter_with_group(
130 "network_connection_data",
131 "get_block_hashes_by_epoch"
132 );
133 static ref GET_BLOCK_HASHES_BY_EPOCH_COUNTER: Arc<dyn Meter> =
134 register_meter_with_group(
135 "network_connection_data_counter",
136 "get_block_hashes_by_epoch_counter"
137 );
138 static ref GET_BLOCK_HASHES_RESPONSE_METER: Arc<dyn Meter> =
139 register_meter_with_group(
140 "network_connection_data",
141 "get_block_hashes_response"
142 );
143 static ref GET_BLOCK_HASHES_RESPONSE_COUNTER: Arc<dyn Meter> =
144 register_meter_with_group(
145 "network_connection_data_counter",
146 "get_block_hashes_response_counter"
147 );
148 static ref OTHER_HIGH_METER: Arc<dyn Meter> = register_meter_with_group(
149 "network_connection_data",
150 "other_high_meter"
151 );
152 static ref OTHER_HIGH_COUNTER: Arc<dyn Meter> =
153 register_meter_with_group(
154 "network_connection_data_counter",
155 "other_high_meter_counter"
156 );
157 }
158 lazy_static! {
159 static ref ON_STATUS_METER: Arc<dyn Meter> =
160 register_meter_with_group("network_connection_data", "on_status");
161 static ref ON_STATUS_COUNTER: Arc<dyn Meter> =
162 register_meter_with_group(
163 "network_connection_data_counter",
164 "on_status_counter"
165 );
166 static ref GET_BLOCK_HEADER_RESPONSE_METER: Arc<dyn Meter> =
167 register_meter_with_group(
168 "network_connection_data",
169 "get_block_header_response"
170 );
171 static ref GET_BLOCK_HEADER_RESPONSE_COUNTER: Arc<dyn Meter> =
172 register_meter_with_group(
173 "network_connection_data_counter",
174 "get_block_header_response_counter"
175 );
176 static ref GET_BLOCK_HEADERS_METER: Arc<dyn Meter> =
177 register_meter_with_group(
178 "network_connection_data",
179 "get_block_headers"
180 );
181 static ref GET_BLOCK_HEADERS_COUNTER: Arc<dyn Meter> =
182 register_meter_with_group(
183 "network_connection_data_counter",
184 "get_block_headers_counter"
185 );
186 static ref GET_BLOCK_HEADER_CHAIN_METER: Arc<dyn Meter> =
187 register_meter_with_group(
188 "network_connection_data",
189 "get_block_header_chain"
190 );
191 static ref GET_BLOCK_HEADER_CHAIN_COUNTER: Arc<dyn Meter> =
192 register_meter_with_group(
193 "network_connection_data_counter",
194 "get_block_header_chain_counter"
195 );
196 static ref NEW_BLOCK_METER: Arc<dyn Meter> =
197 register_meter_with_group("network_connection_data", "new_block");
198 static ref NEW_BLOCK_COUNTER: Arc<dyn Meter> =
199 register_meter_with_group(
200 "network_connection_data_counter",
201 "new_block_counter"
202 );
203 static ref NEW_BLOCK_HASHES_METER: Arc<dyn Meter> =
204 register_meter_with_group(
205 "network_connection_data",
206 "new_block_hashes"
207 );
208 static ref NEW_BLOCK_HASHES_COUNTER: Arc<dyn Meter> =
209 register_meter_with_group(
210 "network_connection_data_counter",
211 "new_block_hashes_counter"
212 );
213 static ref GET_BLOCKS_RESPONSE_METER: Arc<dyn Meter> =
214 register_meter_with_group(
215 "network_connection_data",
216 "get_blocks_response"
217 );
218 static ref GET_BLOCKS_RESPONSE_COUNTER: Arc<dyn Meter> =
219 register_meter_with_group(
220 "network_connection_data_counter",
221 "get_blocks_response_counter"
222 );
223 static ref GET_BLOCKS_WITH_PUBLIC_RESPONSE_METER: Arc<dyn Meter> =
224 register_meter_with_group(
225 "network_connection_data",
226 "get_blocks_with_public_response"
227 );
228 static ref GET_BLOCKS_WITH_PUBLIC_RESPONSE_COUNTER: Arc<dyn Meter> =
229 register_meter_with_group(
230 "network_connection_data_counter",
231 "get_blocks_with_public_response_counter"
232 );
233 static ref GET_BLOCKS_METER: Arc<dyn Meter> =
234 register_meter_with_group("network_connection_data", "get_blocks");
235 static ref GET_BLOCKS_COUNTER: Arc<dyn Meter> =
236 register_meter_with_group(
237 "network_connection_data_counter",
238 "get_blocks_counter"
239 );
240 static ref GET_TERMINAL_BLOCK_HASHES_RESPONSE_METER: Arc<dyn Meter> =
241 register_meter_with_group(
242 "network_connection_data",
243 "get_terminal_block_hashes_response"
244 );
245 static ref GET_TERMINAL_BLOCK_HASHES_RESPONSE_COUNTER: Arc<dyn Meter> =
246 register_meter_with_group(
247 "network_connection_data_counter",
248 "get_terminal_block_hashes_response_counter"
249 );
250 static ref GET_TERMINAL_BLOCK_HASHES_METER: Arc<dyn Meter> =
251 register_meter_with_group(
252 "network_connection_data",
253 "get_terminal_block_hashes"
254 );
255 static ref GET_TERMINAL_BLOCK_HASHES_COUNTER: Arc<dyn Meter> =
256 register_meter_with_group(
257 "network_connection_data_counter",
258 "get_terminal_block_hashes_counter"
259 );
260 static ref TRANSACTIONS_COUNTER: Arc<dyn Meter> =
261 register_meter_with_group(
262 "network_connection_data_counter",
263 "transactions_counter"
264 );
265 static ref GET_CMPCT_BLOCKS_METER: Arc<dyn Meter> =
266 register_meter_with_group(
267 "network_connection_data",
268 "get_cmpct_blocks"
269 );
270 static ref GET_CMPCT_BLOCKS_COUNTER: Arc<dyn Meter> =
271 register_meter_with_group(
272 "network_connection_data_counter",
273 "get_cmpct_blocks_counter"
274 );
275 static ref GET_CMPCT_BLOCKS_RESPONSE_METER: Arc<dyn Meter> =
276 register_meter_with_group(
277 "network_connection_data",
278 "get_cmpct_blocks_response"
279 );
280 static ref GET_CMPCT_BLOCKS_RESPONSE_COUNTER: Arc<dyn Meter> =
281 register_meter_with_group(
282 "network_connection_data_counter",
283 "get_cmpct_blocks_response_counter"
284 );
285 static ref GET_BLOCK_TXN_METER: Arc<dyn Meter> =
286 register_meter_with_group(
287 "network_connection_data",
288 "get_block_txn"
289 );
290 static ref GET_BLOCK_TXN_COUNTER: Arc<dyn Meter> =
291 register_meter_with_group(
292 "network_connection_data_counter",
293 "get_block_txn_counter"
294 );
295 }
296 lazy_static! {
297 static ref GET_TRANSACTIONS_FROM_TX_HASHES_METER: Arc<dyn Meter> =
298 register_meter_with_group(
299 "network_connection_data",
300 "get_transactions_from_tx_hashes"
301 );
302 static ref GET_TRANSACTIONS_FROM_TX_HASHES_COUNTRER: Arc<dyn Meter> =
303 register_meter_with_group(
304 "network_connection_data_counter",
305 "get_transactions_from_tx_hashes_counter"
306 );
307 static ref GET_TRANSACTIONS_FROM_TX_HASHES_RESPONSE_METER: Arc<dyn Meter> =
308 register_meter_with_group(
309 "network_connection_data",
310 "get_transactions_from_tx_hashes_response"
311 );
312 static ref GET_TRANSACTIONS_FROM_TX_HASHES_RESPONSE_COUNTER: Arc<dyn Meter> =
313 register_meter_with_group(
314 "network_connection_data_counter",
315 "get_transactions_from_tx_hashes_response_counter"
316 );
317 }
318
319 pub fn metric_message(msg_id: MsgId, size: usize) {
320 match msg_id {
321 msgid::STATUS_V2 => ON_STATUS_METER.mark(size),
322 msgid::STATUS_V3 => ON_STATUS_METER.mark(size),
323 msgid::GET_BLOCK_HEADERS_RESPONSE => {
324 GET_BLOCK_HEADER_RESPONSE_METER.mark(size);
325 GET_BLOCK_HEADER_RESPONSE_COUNTER.mark(1);
326 }
327 msgid::GET_BLOCK_HEADERS => {
328 GET_BLOCK_HEADERS_METER.mark(size);
329 GET_BLOCK_HEADERS_COUNTER.mark(1);
330 }
331 msgid::GET_BLOCK_HEADER_CHAIN => {
332 GET_BLOCK_HEADER_CHAIN_METER.mark(size);
333 GET_BLOCK_HEADER_CHAIN_COUNTER.mark(1);
334 }
335 msgid::NEW_BLOCK => {
336 NEW_BLOCK_METER.mark(size);
337 NEW_BLOCK_COUNTER.mark(1);
338 }
339 msgid::NEW_BLOCK_HASHES => {
340 NEW_BLOCK_HASHES_METER.mark(size);
341 NEW_BLOCK_HASHES_COUNTER.mark(1);
342 }
343 msgid::GET_BLOCKS_RESPONSE => {
344 GET_BLOCKS_RESPONSE_METER.mark(size);
345 GET_BLOCKS_RESPONSE_COUNTER.mark(1);
346 }
347 msgid::GET_BLOCKS_WITH_PUBLIC_RESPONSE => {
348 GET_BLOCKS_WITH_PUBLIC_RESPONSE_METER.mark(size);
349 GET_BLOCKS_WITH_PUBLIC_RESPONSE_COUNTER.mark(1);
350 }
351 msgid::GET_BLOCKS => {
352 GET_BLOCKS_METER.mark(size);
353 GET_BLOCKS_COUNTER.mark(1);
354 }
355 msgid::GET_TERMINAL_BLOCK_HASHES_RESPONSE => {
356 GET_TERMINAL_BLOCK_HASHES_RESPONSE_METER.mark(size);
357 GET_TERMINAL_BLOCK_HASHES_RESPONSE_COUNTER.mark(1);
358 }
359 msgid::GET_TERMINAL_BLOCK_HASHES => {
360 GET_TERMINAL_BLOCK_HASHES_METER.mark(size);
361 GET_TERMINAL_BLOCK_HASHES_COUNTER.mark(1);
362 }
363 msgid::GET_CMPCT_BLOCKS => {
364 GET_CMPCT_BLOCKS_METER.mark(size);
365 GET_CMPCT_BLOCKS_COUNTER.mark(1);
366 }
367 msgid::GET_CMPCT_BLOCKS_RESPONSE => {
368 GET_CMPCT_BLOCKS_RESPONSE_METER.mark(size);
369 GET_CMPCT_BLOCKS_RESPONSE_COUNTER.mark(1);
370 }
371 msgid::GET_BLOCK_TXN => {
372 GET_BLOCK_TXN_METER.mark(size);
373 GET_BLOCK_TXN_COUNTER.mark(1);
374 }
375 msgid::GET_BLOCK_TXN_RESPONSE => {
376 GET_BLOCK_TXN_RESPOPNSE_METER.mark(size);
377 GET_BLOCK_TXN_RESPOPNSE_COUNTER.mark(1);
378 }
379 msgid::DYNAMIC_CAPABILITY_CHANGE => {
380 DYNAMIC_CAPABILITY_CHANGE_METER.mark(size);
381 DYNAMIC_CAPABILITY_CHANGE_COUNTER.mark(1);
382 }
383 msgid::TRANSACTION_DIGESTS => {
384 TRANSACTION_DIGESTS_METER.mark(size);
385 TRANSACTION_DIGESTS_COUNTER.mark(1);
386 }
387 msgid::GET_TRANSACTIONS => {
388 GET_TRANSACTIONS_METER.mark(size);
389 GET_TRANSACTIONS_COUNTER.mark(1);
390 }
391 msgid::GET_TRANSACTIONS_RESPONSE => {
392 GET_TRANSACTIONS_RESPONSE_METER.mark(size);
393 GET_TRANSACTIONS_RESPONSE_COUNTER.mark(1);
394 }
395 msgid::GET_BLOCK_HASHES_BY_EPOCH => {
396 GET_BLOCK_HASHES_BY_EPOCH_METER.mark(size);
397 GET_BLOCK_HASHES_BY_EPOCH_COUNTER.mark(1);
398 }
399 msgid::GET_BLOCK_HASHES_RESPONSE => {
400 GET_BLOCK_HASHES_RESPONSE_METER.mark(size);
401 GET_BLOCK_HASHES_RESPONSE_COUNTER.mark(1);
402 }
403 _ => {
404 OTHER_HIGH_METER.mark(size);
405 OTHER_HIGH_COUNTER.mark(1);
406 }
407 }
408 }
409}