Skip to content

Commit 397cdcb

Browse files
committed
wip
Signed-off-by: Eval EXEC <[email protected]>
1 parent a12cd96 commit 397cdcb

File tree

4 files changed

+43
-15
lines changed

4 files changed

+43
-15
lines changed

sync/src/synchronizer/get_headers_process.rs

+21-5
Original file line numberDiff line numberDiff line change
@@ -74,17 +74,33 @@ impl<'a> GetHeadersProcess<'a> {
7474
);
7575

7676
self.synchronizer.peers().getheaders_received(self.peer);
77-
let headers_vec: Vec<Vec<core::HeaderView>> =
78-
active_chain.get_locator_responses(block_number, &hash_stop);
79-
// response headers
8077

81-
debug!("headers len={}", headers_vec.len());
82-
for headers in headers_vec {
78+
let length_20_for_test =
79+
packed::Byte32::new_unchecked(packed::Uint32::from(20).as_bytes());
80+
if hash_stop.eq(length_20_for_test) {
81+
let headers: Vec<core::HeaderView> =
82+
active_chain.get_locator_response(block_number, &hash_stop);
83+
// response headers
84+
85+
debug!("headers len={}", headers_vec.len());
8386
let content = packed::SendHeaders::new_builder()
8487
.headers(headers.into_iter().map(|x| x.data()).pack())
8588
.build();
8689
let message = packed::SyncMessage::new_builder().set(content).build();
8790
attempt!(send_message_to(self.nc, self.peer, &message));
91+
} else {
92+
let headers_vec: Vec<Vec<core::HeaderView>> =
93+
active_chain.get_locator_responses(block_number, &hash_stop);
94+
// response headers
95+
96+
debug!("headers vec len={}", headers_vec.len());
97+
for headers in headers_vec {
98+
let content = packed::SendHeaders::new_builder()
99+
.headers(headers.into_iter().map(|x| x.data()).pack())
100+
.build();
101+
let message = packed::SyncMessage::new_builder().set(content).build();
102+
attempt!(send_message_to(self.nc, self.peer, &message));
103+
}
88104
}
89105
} else {
90106
return StatusCode::GetHeadersMissCommonAncestors

sync/src/synchronizer/headers_process.rs

+10-6
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ impl<'a> HeadersProcess<'a> {
5454

5555
fn is_parent_exists(&self, first_header: &core:HeaderView) -> bool {
5656
let shared: &SyncShared = self.synchronizer.shared();
57-
shared.get_header_fields(first_header.parent_hash).is_some()
57+
shared.get_header_fields(first_header.parent_hash()).is_some()
5858
}
5959

6060

@@ -98,15 +98,19 @@ impl<'a> HeadersProcess<'a> {
9898

9999
pub fn execute(self) -> Status {
100100
debug!("HeadersProcess begins");
101-
let shared: &SyncShared = self.synchronizer.shared();
102-
let consensus = shared.consensus();
103101
let headers = self
104102
.message
105103
.headers()
106104
.to_entity()
107105
.into_iter()
108106
.map(packed::Header::into_view)
109107
.collect::<Vec<_>>();
108+
self.execute_inner(headers)
109+
}
110+
111+
fn execute_inner(self, headers: Vec<core::HeaderView>) -> Status {
112+
let shared: &SyncShared = self.synchronizer.shared();
113+
let consensus = shared.consensus();
110114

111115
if headers.len() > MAX_HEADERS_LEN {
112116
warn!("HeadersProcess is oversized");
@@ -136,7 +140,7 @@ impl<'a> HeadersProcess<'a> {
136140

137141
if !self.is_parent_exists(&headers[0]) {
138142
// put the headers into a memory cache
139-
self.synchronizer.header_cache.insert(headers[0].parent_hash, headers);
143+
self.synchronizer.header_cache.insert(headers[0].parent_hash(), headers);
140144
// verify them later
141145
return Status::ok();
142146
}
@@ -226,8 +230,8 @@ impl<'a> HeadersProcess<'a> {
226230
{
227231
// these headers verify success
228232
// may the headers's tail header_hash exist in headers_cahce?
229-
if let Some(headers) = self.synchronizer.headers_cache.get(headers.last().expect("last header must exist").hash){
230-
HeadersProcess::new().execute();
233+
if let Some(headers) = self.synchronizer.header_cache.get(headers.last().expect("last header must exist").hash){
234+
return self.execute_inner(headers);
231235
}
232236
}
233237

sync/src/synchronizer/mod.rs

+4
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,13 @@ use ckb_systemtime::unix_time_as_millis;
4444

4545
#[cfg(test)]
4646
use ckb_types::core;
47+
use ckb_types::packed::Header;
4748
use ckb_types::{
4849
core::BlockNumber,
4950
packed::{self, Byte32},
5051
prelude::*,
5152
};
53+
use std::collections::HashMap;
5254
use std::{
5355
collections::HashSet,
5456
sync::{atomic::Ordering, Arc},
@@ -312,10 +314,12 @@ impl Synchronizer {
312314
///
313315
/// This is a runtime sync protocol shared state, and any Sync protocol messages will be processed and forwarded by it
314316
pub fn new(chain: ChainController, shared: Arc<SyncShared>) -> Synchronizer {
317+
let header_cache = HashMap::new();
315318
Synchronizer {
316319
chain,
317320
shared,
318321
fetch_channel: None,
322+
header_cache,
319323
}
320324
}
321325

sync/src/types/mod.rs

+8-4
Original file line numberDiff line numberDiff line change
@@ -1914,9 +1914,12 @@ impl ActiveChain {
19141914
block_number: BlockNumber,
19151915
hash_stop: &Byte32,
19161916
) -> Vec<Vec<core::HeaderView>> {
1917-
(0..32).iter().map(|index| {
1918-
get_locator_response(block_number + (i * MAX_HEADERS_LEN), &Byte32::default())
1919-
}).collect();
1917+
(0..32)
1918+
.iter()
1919+
.map(|index| {
1920+
get_locator_response(block_number + (i * MAX_HEADERS_LEN), &Byte32::default())
1921+
})
1922+
.collect();
19201923
}
19211924

19221925
pub fn send_getheaders_to_peer(
@@ -1955,9 +1958,10 @@ impl ActiveChain {
19551958
block_number_and_hash.hash()
19561959
);
19571960
let locator_hash = self.get_locator(block_number_and_hash);
1961+
let length_20_for_test = packed::Byte32::new_unchecked(packed::Uint32::from(20).as_bytes());
19581962
let content = packed::GetHeaders::new_builder()
19591963
.block_locator_hashes(locator_hash.pack())
1960-
.hash_stop(packed::Byte32::zero())
1964+
.hash_stop(length_20_for_test)
19611965
.build();
19621966
let message = packed::SyncMessage::new_builder().set(content).build();
19631967
let _status = send_message(SupportProtocols::Sync.protocol_id(), nc, peer, &message);

0 commit comments

Comments
 (0)