mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-06-17 06:41:02 +00:00
Additional logging for polkadot network protocols (#2684)
* Additional logging for polkadot network protocols * Additional log * Update node/network/bitfield-distribution/src/lib.rs Co-authored-by: Robert Habermeier <rphmeier@gmail.com> * Update node/network/availability-distribution/src/responder.rs * Added additional chunk info * Added additional peer info Co-authored-by: Robert Habermeier <rphmeier@gmail.com>
This commit is contained in:
@@ -228,6 +228,12 @@ impl RequestFromBackersPhase {
|
||||
params: &InteractionParams,
|
||||
to_state: &mut mpsc::Sender<FromInteraction>
|
||||
) -> Result<bool, mpsc::SendError> {
|
||||
tracing::trace!(
|
||||
target: LOG_TARGET,
|
||||
candidate_hash = ?params.candidate_hash,
|
||||
erasure_root = ?params.erasure_root,
|
||||
"Requesting from backers",
|
||||
);
|
||||
loop {
|
||||
// Pop the next backer, and proceed to next phase if we're out.
|
||||
let validator_index = match self.shuffled_backers.pop() {
|
||||
@@ -252,8 +258,19 @@ impl RequestFromBackersPhase {
|
||||
FromInteraction::Concluded(params.candidate_hash.clone(), Ok(data))
|
||||
).await?;
|
||||
|
||||
tracing::trace!(
|
||||
target: LOG_TARGET,
|
||||
candidate_hash = ?params.candidate_hash,
|
||||
"Received full data",
|
||||
);
|
||||
return Ok(true);
|
||||
} else {
|
||||
tracing::debug!(
|
||||
target: LOG_TARGET,
|
||||
candidate_hash = ?params.candidate_hash,
|
||||
validator = ?peer_id,
|
||||
"Invalid data response",
|
||||
);
|
||||
to_state.send(FromInteraction::ReportPeer(
|
||||
peer_id.clone(),
|
||||
COST_INVALID_AVAILABLE_DATA,
|
||||
@@ -264,12 +281,14 @@ impl RequestFromBackersPhase {
|
||||
tracing::debug!(
|
||||
target: LOG_TARGET,
|
||||
err = ?e,
|
||||
validator = ?params.validator_authority_keys[validator_index.0 as usize],
|
||||
"A response channel was cancelled while waiting for full data",
|
||||
);
|
||||
}
|
||||
None => {
|
||||
tracing::debug!(
|
||||
target: LOG_TARGET,
|
||||
validator = ?params.validator_authority_keys[validator_index.0 as usize],
|
||||
"A full data request has timed out",
|
||||
);
|
||||
}
|
||||
@@ -298,7 +317,13 @@ impl RequestChunksPhase {
|
||||
while self.requesting_chunks.len() < N_PARALLEL {
|
||||
if let Some(validator_index) = self.shuffling.pop() {
|
||||
let (tx, rx) = oneshot::channel();
|
||||
|
||||
tracing::trace!(
|
||||
target: LOG_TARGET,
|
||||
validator = ?params.validator_authority_keys[validator_index.0 as usize],
|
||||
?validator_index,
|
||||
candidate_hash = ?params.candidate_hash,
|
||||
"Requesting chunk",
|
||||
);
|
||||
to_state.send(FromInteraction::MakeChunkRequest(
|
||||
params.validator_authority_keys[validator_index.0 as usize].clone(),
|
||||
params.candidate_hash.clone(),
|
||||
@@ -335,6 +360,13 @@ impl RequestChunksPhase {
|
||||
// We need to check that the validator index matches the chunk index and
|
||||
// not blindly trust the data from an untrusted peer.
|
||||
if validator_index != chunk.index {
|
||||
tracing::debug!(
|
||||
target: LOG_TARGET,
|
||||
validator = ?peer_id,
|
||||
?validator_index,
|
||||
chunk_index = ?chunk.index,
|
||||
"Index mismatch",
|
||||
);
|
||||
to_state.send(FromInteraction::ReportPeer(
|
||||
peer_id.clone(),
|
||||
COST_MERKLE_PROOF_INVALID,
|
||||
@@ -352,14 +384,32 @@ impl RequestChunksPhase {
|
||||
let erasure_chunk_hash = BlakeTwo256::hash(&chunk.chunk);
|
||||
|
||||
if erasure_chunk_hash != anticipated_hash {
|
||||
tracing::debug!(
|
||||
target: LOG_TARGET,
|
||||
validator = ?peer_id,
|
||||
?validator_index,
|
||||
"Merkle proof mismatch",
|
||||
);
|
||||
to_state.send(FromInteraction::ReportPeer(
|
||||
peer_id.clone(),
|
||||
COST_MERKLE_PROOF_INVALID,
|
||||
)).await?;
|
||||
} else {
|
||||
tracing::debug!(
|
||||
target: LOG_TARGET,
|
||||
validator = ?peer_id,
|
||||
?validator_index,
|
||||
"Received valid Merkle proof",
|
||||
);
|
||||
self.received_chunks.insert(validator_index, chunk);
|
||||
}
|
||||
} else {
|
||||
tracing::debug!(
|
||||
target: LOG_TARGET,
|
||||
validator = ?peer_id,
|
||||
?validator_index,
|
||||
"Invalid Merkle proof",
|
||||
);
|
||||
to_state.send(FromInteraction::ReportPeer(
|
||||
peer_id.clone(),
|
||||
COST_MERKLE_PROOF_INVALID,
|
||||
@@ -397,6 +447,15 @@ impl RequestChunksPhase {
|
||||
self.shuffling.len(),
|
||||
params.threshold,
|
||||
) {
|
||||
tracing::debug!(
|
||||
target: LOG_TARGET,
|
||||
candidate_hash = ?params.candidate_hash,
|
||||
erasure_root = ?params.erasure_root,
|
||||
received = %self.received_chunks.len(),
|
||||
requesting = %self.requesting_chunks.len(),
|
||||
n_validators = %self.shuffling.len(),
|
||||
"Data recovery is not possible",
|
||||
);
|
||||
to_state.send(FromInteraction::Concluded(
|
||||
params.candidate_hash,
|
||||
Err(RecoveryError::Unavailable),
|
||||
@@ -419,18 +478,39 @@ impl RequestChunksPhase {
|
||||
) {
|
||||
Ok(data) => {
|
||||
if reconstructed_data_matches_root(params.validators.len(), ¶ms.erasure_root, &data) {
|
||||
tracing::trace!(
|
||||
target: LOG_TARGET,
|
||||
candidate_hash = ?params.candidate_hash,
|
||||
erasure_root = ?params.erasure_root,
|
||||
"Data recovery complete",
|
||||
);
|
||||
FromInteraction::Concluded(params.candidate_hash.clone(), Ok(data))
|
||||
} else {
|
||||
tracing::trace!(
|
||||
target: LOG_TARGET,
|
||||
candidate_hash = ?params.candidate_hash,
|
||||
erasure_root = ?params.erasure_root,
|
||||
"Data recovery - root mismatch",
|
||||
);
|
||||
FromInteraction::Concluded(
|
||||
params.candidate_hash.clone(),
|
||||
Err(RecoveryError::Invalid),
|
||||
)
|
||||
}
|
||||
}
|
||||
Err(_) => FromInteraction::Concluded(
|
||||
params.candidate_hash.clone(),
|
||||
Err(RecoveryError::Invalid),
|
||||
),
|
||||
Err(err) => {
|
||||
tracing::trace!(
|
||||
target: LOG_TARGET,
|
||||
candidate_hash = ?params.candidate_hash,
|
||||
erasure_root = ?params.erasure_root,
|
||||
?err,
|
||||
"Data recovery error ",
|
||||
);
|
||||
FromInteraction::Concluded(
|
||||
params.candidate_hash.clone(),
|
||||
Err(RecoveryError::Invalid),
|
||||
)
|
||||
},
|
||||
};
|
||||
|
||||
to_state.send(concluded).await?;
|
||||
@@ -871,6 +951,11 @@ async fn handle_network_update(
|
||||
protocol_v1::AvailabilityRecoveryMessage::Chunk(request_id, chunk) => {
|
||||
match state.live_requests.remove(&request_id) {
|
||||
None => {
|
||||
tracing::debug!(
|
||||
target: LOG_TARGET,
|
||||
?peer,
|
||||
"Received unexpected chunk response",
|
||||
);
|
||||
// If there doesn't exist one, report the peer and return.
|
||||
report_peer(ctx, peer, COST_UNEXPECTED_CHUNK).await;
|
||||
}
|
||||
@@ -898,6 +983,11 @@ async fn handle_network_update(
|
||||
}
|
||||
}
|
||||
Some(a) => {
|
||||
tracing::debug!(
|
||||
target: LOG_TARGET,
|
||||
?peer,
|
||||
"Received unexpected chunk response",
|
||||
);
|
||||
// If the peer in the entry doesn't match the sending peer,
|
||||
// reinstate the entry, report the peer, and return
|
||||
state.live_requests.insert(request_id, a);
|
||||
@@ -940,6 +1030,11 @@ async fn handle_network_update(
|
||||
match state.live_requests.remove(&request_id) {
|
||||
None => {
|
||||
// If there doesn't exist one, report the peer and return.
|
||||
tracing::debug!(
|
||||
target: LOG_TARGET,
|
||||
?peer,
|
||||
"Received unexpected full data response",
|
||||
);
|
||||
report_peer(ctx, peer, COST_UNEXPECTED_CHUNK).await;
|
||||
}
|
||||
Some((peer_id, Awaited::FullData(awaited))) if peer_id == peer => {
|
||||
@@ -965,6 +1060,11 @@ async fn handle_network_update(
|
||||
Some(a) => {
|
||||
// If the peer in the entry doesn't match the sending peer,
|
||||
// reinstate the entry, report the peer, and return
|
||||
tracing::debug!(
|
||||
target: LOG_TARGET,
|
||||
?peer,
|
||||
"Received unexpected full data response",
|
||||
);
|
||||
state.live_requests.insert(request_id, a);
|
||||
report_peer(ctx, peer, COST_UNEXPECTED_CHUNK).await;
|
||||
}
|
||||
@@ -1049,6 +1149,12 @@ async fn handle_validator_connected(
|
||||
authority_id: AuthorityDiscoveryId,
|
||||
peer_id: PeerId,
|
||||
) -> error::Result<()> {
|
||||
tracing::trace!(
|
||||
target: LOG_TARGET,
|
||||
?peer_id,
|
||||
?authority_id,
|
||||
"Validator connected",
|
||||
);
|
||||
if let Some(discovering) = state.discovering_validators.remove(&authority_id) {
|
||||
for awaited in discovering {
|
||||
issue_request(state, ctx, peer_id.clone(), awaited).await?;
|
||||
|
||||
Reference in New Issue
Block a user