Skip to content

Commit

Permalink
return empty StateResponse if cannot build
Browse files Browse the repository at this point in the history
  • Loading branch information
Kouprin committed Jan 18, 2020
1 parent 3cfa645 commit ffd2f2b
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 10 deletions.
19 changes: 13 additions & 6 deletions chain/client/src/client_actor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -203,7 +203,7 @@ impl Handler<NetworkClientMessages> for ClientActor {
NetworkClientMessages::StateResponse(StateResponseInfo {
shard_id,
sync_hash: hash,
shard_state,
state_response,
}) => {
// Get the download that matches the shard_id and hash
let download = {
Expand Down Expand Up @@ -245,7 +245,7 @@ impl Handler<NetworkClientMessages> for ClientActor {
if let Some(shard_sync_download) = download {
match shard_sync_download.status {
ShardSyncStatus::StateDownloadHeader => {
if let Some(header) = &shard_state.header {
if let Some(header) = &state_response.header {
if !shard_sync_download.downloads[0].done {
match self.client.chain.set_state_header(
shard_id,
Expand All @@ -256,16 +256,23 @@ impl Handler<NetworkClientMessages> for ClientActor {
shard_sync_download.downloads[0].done = true;
}
Err(err) => {
error!(target: "sync", "State sync header error, shard = {}, hash = {}: {:?}", shard_id, hash, err);
error!(target: "sync", "State sync set_state_header error, shard = {}, hash = {}: {:?}", shard_id, hash, err);
shard_sync_download.downloads[0].error = true;
}
}
}
} else {
// No header found.
// It may happen because requested node couldn't build state response.
if !shard_sync_download.downloads[0].done {
info!(target: "sync", "state_response doesn't have header, should be re-requested, shard = {}, hash = {}", shard_id, hash);
shard_sync_download.downloads[0].error = true;
}
}
}
ShardSyncStatus::StateDownloadParts => {
let num_parts = shard_sync_download.downloads.len();
for (i, part_id) in shard_state.part_ids.iter().enumerate() {
for (i, part_id) in state_response.part_ids.iter().enumerate() {
let part_id = *part_id as usize;
if part_id >= num_parts {
// This may happen only if we somehow have accepted wrong header
Expand All @@ -277,13 +284,13 @@ impl Handler<NetworkClientMessages> for ClientActor {
hash,
part_id as u64,
num_parts as u64,
&shard_state.data[i],
&state_response.data[i],
) {
Ok(()) => {
shard_sync_download.downloads[part_id].done = true;
}
Err(err) => {
error!(target: "sync", "State sync part error, shard = {}, part = {}, hash = {}: {:?}", shard_id, part_id, hash, err);
error!(target: "sync", "State sync set_state_part error, shard = {}, part = {}, hash = {}: {:?}", shard_id, part_id, hash, err);
shard_sync_download.downloads[part_id].error = true;
}
}
Expand Down
17 changes: 14 additions & 3 deletions chain/client/src/view_client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ use std::sync::Arc;
use actix::{Actor, Context, Handler};
use log::{error, warn};

use near_chain::types::ShardStateSyncResponse;
use near_chain::{Chain, ChainGenesis, ChainStoreAccess, ErrorKind, RuntimeAdapter};
use near_primitives::types::AccountId;
use near_primitives::views::{
Expand Down Expand Up @@ -492,7 +493,7 @@ impl Handler<NetworkViewClientMessages> for ViewClientActor {
}
},
NetworkViewClientMessages::StateRequest { shard_id, sync_hash, need_header, parts } => {
if let Ok(shard_state) = self.chain.get_state_response_by_request(
if let Ok(state_response) = self.chain.get_state_response_by_request(
shard_id,
sync_hash,
need_header,
Expand All @@ -501,10 +502,20 @@ impl Handler<NetworkViewClientMessages> for ViewClientActor {
NetworkViewClientResponses::StateResponse(StateResponseInfo {
shard_id,
sync_hash,
shard_state,
state_response,
})
} else {
NetworkViewClientResponses::NoResponse
// We couldn't build state response for any reason.
// Send empty StateResponse to help requesting node unstuck.
NetworkViewClientResponses::StateResponse(StateResponseInfo {
shard_id,
sync_hash,
state_response: ShardStateSyncResponse {
header: None,
part_ids: vec![],
data: vec![],
},
})
}
}
NetworkViewClientMessages::AnnounceAccount(announce_accounts) => {
Expand Down
2 changes: 1 addition & 1 deletion chain/network/src/types.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1191,7 +1191,7 @@ impl Message for NetworkRequests {
pub struct StateResponseInfo {
pub shard_id: ShardId,
pub sync_hash: CryptoHash,
pub shard_state: ShardStateSyncResponse,
pub state_response: ShardStateSyncResponse,
}

#[derive(Debug)]
Expand Down

0 comments on commit ffd2f2b

Please sign in to comment.