mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-06-14 05:11:09 +00:00
Refactor ValidationError (#2406)
This commit is contained in:
@@ -24,8 +24,8 @@
|
||||
#![warn(missing_docs)]
|
||||
|
||||
use polkadot_node_core_pvf::{
|
||||
InternalValidationError, InvalidCandidate as WasmInvalidCandidate, PrepareError,
|
||||
PrepareJobKind, PvfPrepData, ValidationError, ValidationHost,
|
||||
InternalValidationError, InvalidCandidate as WasmInvalidCandidate, PossiblyInvalidError,
|
||||
PrepareError, PrepareJobKind, PvfPrepData, ValidationError, ValidationHost,
|
||||
};
|
||||
use polkadot_node_primitives::{
|
||||
BlockData, InvalidCandidate, PoV, ValidationResult, POV_BOMB_LIMIT, VALIDATION_CODE_BOMB_LIMIT,
|
||||
@@ -642,7 +642,7 @@ async fn validate_candidate_exhaustive(
|
||||
}
|
||||
|
||||
match result {
|
||||
Err(ValidationError::InternalError(e)) => {
|
||||
Err(ValidationError::Internal(e)) => {
|
||||
gum::warn!(
|
||||
target: LOG_TARGET,
|
||||
?para_id,
|
||||
@@ -651,34 +651,29 @@ async fn validate_candidate_exhaustive(
|
||||
);
|
||||
Err(ValidationFailed(e.to_string()))
|
||||
},
|
||||
Err(ValidationError::InvalidCandidate(WasmInvalidCandidate::HardTimeout)) =>
|
||||
Err(ValidationError::Invalid(WasmInvalidCandidate::HardTimeout)) =>
|
||||
Ok(ValidationResult::Invalid(InvalidCandidate::Timeout)),
|
||||
Err(ValidationError::InvalidCandidate(WasmInvalidCandidate::WorkerReportedInvalid(e))) =>
|
||||
Err(ValidationError::Invalid(WasmInvalidCandidate::WorkerReportedInvalid(e))) =>
|
||||
Ok(ValidationResult::Invalid(InvalidCandidate::ExecutionError(e))),
|
||||
Err(ValidationError::InvalidCandidate(WasmInvalidCandidate::AmbiguousWorkerDeath)) =>
|
||||
Err(ValidationError::PossiblyInvalid(PossiblyInvalidError::AmbiguousWorkerDeath)) =>
|
||||
Ok(ValidationResult::Invalid(InvalidCandidate::ExecutionError(
|
||||
"ambiguous worker death".to_string(),
|
||||
))),
|
||||
Err(ValidationError::InvalidCandidate(WasmInvalidCandidate::JobError(err))) =>
|
||||
Err(ValidationError::PossiblyInvalid(PossiblyInvalidError::JobError(err))) =>
|
||||
Ok(ValidationResult::Invalid(InvalidCandidate::ExecutionError(err))),
|
||||
|
||||
Err(ValidationError::InvalidCandidate(WasmInvalidCandidate::AmbiguousJobDeath(err))) =>
|
||||
Err(ValidationError::PossiblyInvalid(PossiblyInvalidError::AmbiguousJobDeath(err))) =>
|
||||
Ok(ValidationResult::Invalid(InvalidCandidate::ExecutionError(format!(
|
||||
"ambiguous job death: {err}"
|
||||
)))),
|
||||
Err(ValidationError::InvalidCandidate(WasmInvalidCandidate::PrepareError(e))) => {
|
||||
// In principle if preparation of the `WASM` fails, the current candidate can not be the
|
||||
// reason for that. So we can't say whether it is invalid or not. In addition, with
|
||||
// pre-checking enabled only valid runtimes should ever get enacted, so we can be
|
||||
// reasonably sure that this is some local problem on the current node. However, as this
|
||||
// particular error *seems* to indicate a deterministic error, we raise a warning.
|
||||
Err(ValidationError::Preparation(e)) => {
|
||||
gum::warn!(
|
||||
target: LOG_TARGET,
|
||||
?para_id,
|
||||
?e,
|
||||
"Deterministic error occurred during preparation (should have been ruled out by pre-checking phase)",
|
||||
);
|
||||
Err(ValidationFailed(e))
|
||||
Err(ValidationFailed(e.to_string()))
|
||||
},
|
||||
Ok(res) =>
|
||||
if res.head_data.hash() != candidate_receipt.descriptor.para_head {
|
||||
@@ -762,16 +757,31 @@ trait ValidationBackend {
|
||||
}
|
||||
|
||||
match validation_result {
|
||||
Err(ValidationError::InvalidCandidate(
|
||||
WasmInvalidCandidate::AmbiguousWorkerDeath |
|
||||
WasmInvalidCandidate::AmbiguousJobDeath(_),
|
||||
)) if num_death_retries_left > 0 => num_death_retries_left -= 1,
|
||||
Err(ValidationError::InvalidCandidate(WasmInvalidCandidate::JobError(_)))
|
||||
if num_job_error_retries_left > 0 =>
|
||||
num_job_error_retries_left -= 1,
|
||||
Err(ValidationError::InternalError(_)) if num_internal_retries_left > 0 =>
|
||||
num_internal_retries_left -= 1,
|
||||
_ => break,
|
||||
Err(ValidationError::PossiblyInvalid(
|
||||
PossiblyInvalidError::AmbiguousWorkerDeath |
|
||||
PossiblyInvalidError::AmbiguousJobDeath(_),
|
||||
)) =>
|
||||
if num_death_retries_left > 0 {
|
||||
num_death_retries_left -= 1;
|
||||
} else {
|
||||
break;
|
||||
},
|
||||
|
||||
Err(ValidationError::PossiblyInvalid(PossiblyInvalidError::JobError(_))) =>
|
||||
if num_job_error_retries_left > 0 {
|
||||
num_job_error_retries_left -= 1;
|
||||
} else {
|
||||
break;
|
||||
},
|
||||
|
||||
Err(ValidationError::Internal(_)) =>
|
||||
if num_internal_retries_left > 0 {
|
||||
num_internal_retries_left -= 1;
|
||||
} else {
|
||||
break;
|
||||
},
|
||||
|
||||
Ok(_) | Err(ValidationError::Invalid(_) | ValidationError::Preparation(_)) => break,
|
||||
}
|
||||
|
||||
// If we got a possibly transient error, retry once after a brief delay, on the
|
||||
|
||||
@@ -480,9 +480,9 @@ fn candidate_validation_bad_return_is_invalid() {
|
||||
let candidate_receipt = CandidateReceipt { descriptor, commitments_hash: Hash::zero() };
|
||||
|
||||
let v = executor::block_on(validate_candidate_exhaustive(
|
||||
MockValidateCandidateBackend::with_hardcoded_result(Err(
|
||||
ValidationError::InvalidCandidate(WasmInvalidCandidate::HardTimeout),
|
||||
)),
|
||||
MockValidateCandidateBackend::with_hardcoded_result(Err(ValidationError::Invalid(
|
||||
WasmInvalidCandidate::HardTimeout,
|
||||
))),
|
||||
validation_data,
|
||||
validation_code,
|
||||
candidate_receipt,
|
||||
@@ -561,7 +561,7 @@ fn candidate_validation_one_ambiguous_error_is_valid() {
|
||||
|
||||
let v = executor::block_on(validate_candidate_exhaustive(
|
||||
MockValidateCandidateBackend::with_hardcoded_result_list(vec![
|
||||
Err(ValidationError::InvalidCandidate(WasmInvalidCandidate::AmbiguousWorkerDeath)),
|
||||
Err(ValidationError::PossiblyInvalid(PossiblyInvalidError::AmbiguousWorkerDeath)),
|
||||
Ok(validation_result),
|
||||
]),
|
||||
validation_data.clone(),
|
||||
@@ -602,8 +602,8 @@ fn candidate_validation_multiple_ambiguous_errors_is_invalid() {
|
||||
|
||||
let v = executor::block_on(validate_candidate_exhaustive(
|
||||
MockValidateCandidateBackend::with_hardcoded_result_list(vec![
|
||||
Err(ValidationError::InvalidCandidate(WasmInvalidCandidate::AmbiguousWorkerDeath)),
|
||||
Err(ValidationError::InvalidCandidate(WasmInvalidCandidate::AmbiguousWorkerDeath)),
|
||||
Err(ValidationError::PossiblyInvalid(PossiblyInvalidError::AmbiguousWorkerDeath)),
|
||||
Err(ValidationError::PossiblyInvalid(PossiblyInvalidError::AmbiguousWorkerDeath)),
|
||||
]),
|
||||
validation_data,
|
||||
validation_code,
|
||||
@@ -626,7 +626,7 @@ fn candidate_validation_retry_internal_errors() {
|
||||
vec![
|
||||
Err(InternalValidationError::HostCommunication("foo".into()).into()),
|
||||
// Throw an AJD error, we should still retry again.
|
||||
Err(ValidationError::InvalidCandidate(WasmInvalidCandidate::AmbiguousJobDeath(
|
||||
Err(ValidationError::PossiblyInvalid(PossiblyInvalidError::AmbiguousJobDeath(
|
||||
"baz".into(),
|
||||
))),
|
||||
// Throw another internal error.
|
||||
@@ -644,7 +644,7 @@ fn candidate_validation_dont_retry_internal_errors() {
|
||||
vec![
|
||||
Err(InternalValidationError::HostCommunication("foo".into()).into()),
|
||||
// Throw an AWD error, we should still retry again.
|
||||
Err(ValidationError::InvalidCandidate(WasmInvalidCandidate::AmbiguousWorkerDeath)),
|
||||
Err(ValidationError::PossiblyInvalid(PossiblyInvalidError::AmbiguousWorkerDeath)),
|
||||
// Throw another internal error.
|
||||
Err(InternalValidationError::HostCommunication("bar".into()).into()),
|
||||
],
|
||||
@@ -659,11 +659,11 @@ fn candidate_validation_retry_panic_errors() {
|
||||
let v = candidate_validation_retry_on_error_helper(
|
||||
PvfExecKind::Approval,
|
||||
vec![
|
||||
Err(ValidationError::InvalidCandidate(WasmInvalidCandidate::JobError("foo".into()))),
|
||||
Err(ValidationError::PossiblyInvalid(PossiblyInvalidError::JobError("foo".into()))),
|
||||
// Throw an AWD error, we should still retry again.
|
||||
Err(ValidationError::InvalidCandidate(WasmInvalidCandidate::AmbiguousWorkerDeath)),
|
||||
Err(ValidationError::PossiblyInvalid(PossiblyInvalidError::AmbiguousWorkerDeath)),
|
||||
// Throw another panic error.
|
||||
Err(ValidationError::InvalidCandidate(WasmInvalidCandidate::JobError("bar".into()))),
|
||||
Err(ValidationError::PossiblyInvalid(PossiblyInvalidError::JobError("bar".into()))),
|
||||
],
|
||||
);
|
||||
|
||||
@@ -676,11 +676,11 @@ fn candidate_validation_dont_retry_panic_errors() {
|
||||
let v = candidate_validation_retry_on_error_helper(
|
||||
PvfExecKind::Backing,
|
||||
vec![
|
||||
Err(ValidationError::InvalidCandidate(WasmInvalidCandidate::JobError("foo".into()))),
|
||||
Err(ValidationError::PossiblyInvalid(PossiblyInvalidError::JobError("foo".into()))),
|
||||
// Throw an AWD error, we should still retry again.
|
||||
Err(ValidationError::InvalidCandidate(WasmInvalidCandidate::AmbiguousWorkerDeath)),
|
||||
Err(ValidationError::PossiblyInvalid(PossiblyInvalidError::AmbiguousWorkerDeath)),
|
||||
// Throw another panic error.
|
||||
Err(ValidationError::InvalidCandidate(WasmInvalidCandidate::JobError("bar".into()))),
|
||||
Err(ValidationError::PossiblyInvalid(PossiblyInvalidError::JobError("bar".into()))),
|
||||
],
|
||||
);
|
||||
|
||||
@@ -758,9 +758,9 @@ fn candidate_validation_timeout_is_internal_error() {
|
||||
let candidate_receipt = CandidateReceipt { descriptor, commitments_hash: Hash::zero() };
|
||||
|
||||
let v = executor::block_on(validate_candidate_exhaustive(
|
||||
MockValidateCandidateBackend::with_hardcoded_result(Err(
|
||||
ValidationError::InvalidCandidate(WasmInvalidCandidate::HardTimeout),
|
||||
)),
|
||||
MockValidateCandidateBackend::with_hardcoded_result(Err(ValidationError::Invalid(
|
||||
WasmInvalidCandidate::HardTimeout,
|
||||
))),
|
||||
validation_data,
|
||||
validation_code,
|
||||
candidate_receipt,
|
||||
@@ -852,9 +852,9 @@ fn candidate_validation_code_mismatch_is_invalid() {
|
||||
let (_ctx, _ctx_handle) = test_helpers::make_subsystem_context::<AllMessages, _>(pool.clone());
|
||||
|
||||
let v = executor::block_on(validate_candidate_exhaustive(
|
||||
MockValidateCandidateBackend::with_hardcoded_result(Err(
|
||||
ValidationError::InvalidCandidate(WasmInvalidCandidate::HardTimeout),
|
||||
)),
|
||||
MockValidateCandidateBackend::with_hardcoded_result(Err(ValidationError::Invalid(
|
||||
WasmInvalidCandidate::HardTimeout,
|
||||
))),
|
||||
validation_data,
|
||||
validation_code,
|
||||
candidate_receipt,
|
||||
|
||||
Reference in New Issue
Block a user