Skip to content

Commit

Permalink
try_header_head in the syncer loop with a short timeout (#3165)
Browse files Browse the repository at this point in the history
to prevent it getting locked up after txhashset download and validation
  • Loading branch information
antiochp authored Dec 10, 2019
1 parent fd4c4c5 commit b5f73b6
Showing 1 changed file with 12 additions and 1 deletion.
13 changes: 12 additions & 1 deletion servers/src/grin/sync/syncer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,18 @@ impl SyncRunner {
// if syncing is needed
let head = unwrap_or_restart_loop!(self.chain.head());
let tail = self.chain.tail().unwrap_or_else(|_| head.clone());
let header_head = unwrap_or_restart_loop!(self.chain.header_head());

// We still do not fully understand what is blocking this but if this blocks here after
// we download and validate the txhashet we do not reliably proceed to block_sync,
// potentially blocking for an extended period of time (> 10 mins).
// Does not appear to be deadlock as it does resolve itself eventually.
// So as a workaround we try_header_head with a relatively short timeout and simply
// retry the syncer loop.
let maybe_header_head =
unwrap_or_restart_loop!(self.chain.try_header_head(time::Duration::from_secs(1)));
let header_head = unwrap_or_restart_loop!(
maybe_header_head.ok_or("failed to obtain lock for try_header_head")
);

// run each sync stage, each of them deciding whether they're needed
// except for state sync that only runs if body sync return true (means txhashset is needed)
Expand Down

0 comments on commit b5f73b6

Please sign in to comment.