cfxcore/sync/
mod.rs

1// Copyright 2019 Conflux Foundation. All rights reserved.
2// Conflux is free software and distributed under GNU General Public License.
3// See http://www.gnu.org/licenses/
4mod 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
44/// The current version of the synchronization protocol.
45///
46/// Bump the version for incompatible changes. Before the version is too
47/// high, transit to a new protocol name for the next generation of the
48/// protocol.
49///
50/// To update messages within the protocol, we would like to be
51/// backward-compatible as much as possible. DO NOT UPDATE directly on the
52/// message. Instead, create a new message, mark the old one for
53/// deprecation.
54///
55/// Do NOT make this const pub.
56const SYNCHRONIZATION_PROTOCOL_VERSION: ProtocolVersion = ProtocolVersion(3);
57/// Support at most this number of old versions.
58const SYNCHRONIZATION_PROTOCOL_OLD_VERSIONS_TO_SUPPORT: u8 = 2;
59/// The version to pass to Message for their lifetime declaration.
60pub 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}