1
0
Fork 0
mirror of https://github.com/romanz/electrs.git synced 2025-02-24 23:08:39 +01:00

Simplify latest headers' retrieval

This commit is contained in:
Roman Zeyde 2018-05-27 11:49:46 +03:00
parent 548de46410
commit 313420b0e1
No known key found for this signature in database
GPG key ID: 87CAE5FA46917CBB
3 changed files with 14 additions and 20 deletions

View file

@ -288,30 +288,24 @@ impl Daemon {
Ok(result)
}
fn add_missing_headers(&self, mut header_map: HeaderMap) -> Result<(HeaderMap, Sha256dHash)> {
pub fn get_latest_headers(&self, indexed_headers: &HeaderList) -> Result<HeaderList> {
let mut header_map = if indexed_headers.headers().is_empty() {
self.get_all_headers()
.chain_err(|| "failed to download all headers")?
} else {
indexed_headers.as_map()
};
// Get current best blockhash (using JSONRPC API)
let bestblockhash = self.getbestblockhash()?;
// Iterate back over headers until known blockash is found:
let mut blockhash = bestblockhash;
while !header_map.contains_key(&blockhash) {
let header = self.getblockheader(&blockhash)
.chain_err(|| format!("failed to get missing header for {}", blockhash))?;
.chain_err(|| format!("failed to get {} header", blockhash))?;
debug!("downloaded {} block header", blockhash);
header_map.insert(blockhash, header);
blockhash = header.prev_blockhash;
}
Ok((header_map, bestblockhash))
}
pub fn enumerate_headers(&self, indexed_headers: &HeaderList) -> Result<HeaderList> {
let header_map = if indexed_headers.headers().is_empty() {
self.get_all_headers()
.chain_err(|| "failed to download all headers")?
} else {
indexed_headers.as_map()
};
let (header_map, blockhash) = self.add_missing_headers(header_map)
.chain_err(|| "failed to add missing headers")?;
Ok(HeaderList::build(header_map, blockhash))
Ok(HeaderList::build(header_map, bestblockhash))
}
}

View file

@ -360,16 +360,16 @@ impl Index {
read_last_indexed_blockhash(store),
));
}
let current_headers = daemon.enumerate_headers(&*indexed_headers)?;
let latest_headers = daemon.get_latest_headers(&*indexed_headers)?;
for rows in Batching::new(Indexer::new(
current_headers.get_missing_headers(&indexed_headers.as_map()),
latest_headers.get_missing_headers(&indexed_headers.as_map()),
&daemon,
/*use_progress_bar=*/ no_indexed_headers,
)) {
store.write(rows);
}
let tip = current_headers.tip();
*(self.headers.write().unwrap()) = Arc::new(current_headers);
let tip = latest_headers.tip();
*(self.headers.write().unwrap()) = Arc::new(latest_headers);
Ok(tip)
}
}

View file

@ -65,7 +65,7 @@ impl HeaderList {
blockhash = header.prev_blockhash;
}
if !header_map.is_empty() {
warn!("orphaned blocks: {:?}", header_map);
warn!("{} orphaned blocks: {:?}", header_map.len(), header_map);
}
HeaderList {
headers: hashed_headers