message: Restart catchup in case of Timout was most popular vote
diff: @@ -56,7 +56,7 @@ pub fn check_nodes_responses_on_status(nodes_votes: &HashMap<(String, usize, Opt
  let is_consensus_reached = votes_cnt == node_cnt - f;
  if is_consensus_reached {
  if most_popular_vote.0.eq("timeout") {
  - return Err(err_msg(IndyErrorKind::PoolTimeout, "Pool timeout"));
  + return _try_to_restart_catch_up(pool_name, err_msg(IndyErrorKind::PoolTimeout, "Pool timeout"))
  }
  return _try_to_catch_up(most_popular_vote, merkle_tree).or_else(|err| {
  @@ -68,22 +68,26 @@ pub fn check_nodes_responses_on_status(nodes_votes: &HashMap<(String, usize, Opt
  }
  });
  } else {
  - let reps_cnt: usize = nodes_votes.values().map(|set| set.len()).sum();
  + let reps_cnt: usize = nodes_votes.values().map(HashSet::len).sum();
  let positive_votes_cnt = votes_cnt + (node_cnt - reps_cnt);
  let is_consensus_reachable = positive_votes_cnt < node_cnt - f;
  if is_consensus_reachable {
  + return _try_to_restart_catch_up(pool_name, err_msg(IndyErrorKind::PoolTimeout, "No consensus possible"))
  + }
  + }
  + }
  + Ok(CatchupProgress::InProgress)
  +}
  +
  +fn _try_to_restart_catch_up(pool_name: &str, err: IndyError) -> IndyResult<CatchupProgress>{
  if merkle_tree_factory::drop_cache(pool_name).is_ok() {
  let merkle_tree = merkle_tree_factory::create(pool_name)?;
  return Ok(CatchupProgress::Restart(merkle_tree))
  } else {
  //TODO: maybe we should change the error, but it was made to escape changing of ErrorCode returned to client
  - return Err(err_msg(IndyErrorKind::PoolTimeout, "No consensus possible"));
  - }
  - }
  + return Err(err);
  }
  }
  - Ok(CatchupProgress::InProgress)
  -}
  fn _try_to_catch_up(ledger_status: &(String, usize, Option<Vec<String>>), merkle_tree: &MerkleTree) -> IndyResult<CatchupProgress> {
  let &(ref target_mt_root, target_mt_size, ref hashes) = ledger_status;
  