nautechsystems/nautilus_trader · error · anyhow::Error
Execution payload storage is not ready
Error message
Execution payload storage is not ready
What it means
The execution_payload_state row exists but its operation field is not 'ready', so the storage subsystem refuses to proceed. Operations go through states (e.g. migrating/preparing) and only a 'ready' state permits normal payload operations.
Source
Thrown at crates/adapters/blockchain/src/cache/database.rs:5072
}
async fn validate_execution_payload_ready(&self, keys: &PayloadKeySet) -> anyhow::Result<()> {
let mut transaction = self
.pool
.begin()
.await
.context("failed to start execution payload validation")?;
let state_row = sqlx::query(
"SELECT deployment_id, protocol_version, operation, active_key_id \
FROM execution_payload_state WHERE component = 'signed_transactions' FOR SHARE",
)
.fetch_optional(&mut *transaction)
.await
.context("failed to lock execution payload state")?
.ok_or_else(|| anyhow::anyhow!("Execution payload state is missing"))?;
let state = execution_payload_state_from_row(&state_row)?;
validate_execution_payload_state(&state, keys)?;
anyhow::ensure!(
state.operation == "ready",
"Execution payload storage is not ready"
);
let (payload_fence, payload_constraint) =
sqlx::query_as::<_, (bool, bool)>(EXECUTION_PAYLOAD_INFRASTRUCTURE_QUERY)
.fetch_one(&mut *transaction)
.await
.context("failed to inspect execution payload protection infrastructure")?;
anyhow::ensure!(
payload_fence && payload_constraint,
"Execution payload storage is marked ready without its write fence or constraint"
);
validate_execution_payload_key_inventory(&mut transaction, keys).await?;
transaction
.commit()
.await
.context("failed to complete execution payload validation")?;
Ok(())View on GitHub (pinned to 18893faf8b)
Solutions
- Wait for the in-flight migration/initialization to finish and retry
- Re-run the migration to completion so operation becomes 'ready'
- Inspect execution_payload_state.operation and repair via the proper init path if stuck
- Avoid manual edits to the state table
Defensive patterns
Strategy: retry
Validate before calling
let op: (String,) = sqlx::query_as("SELECT operation FROM execution_payload_state WHERE component = 'signed_transactions'").fetch_one(&mut conn).await?;
if op.0 != "ready" { wait_until_ready_or_migrate(&mut conn).await?; } Try / catch
match storage.inspect(...).await {
Err(e) if e.to_string().contains("not ready") => {
backoff(|| async { poll_state_ready(&conn).await }).await?;
storage.inspect(...).await
}
other => other,
} Prevention
- Gate payload operations behind a readiness check at startup
- Let migrations finish before accepting traffic
- Never hand-edit the operation column
- Alert on state stuck non-ready beyond a threshold
When it happens
Trigger: Calling payload storage APIs while a migration or preparation is still in progress or was left incomplete; state row stuck in a non-ready operation value after a crashed migration.
Common situations: Concurrent access during a migration; a prior migration failed midway leaving operation unset; manually editing execution_payload_state.
Understand the failure class
Background: "Invalid state transition" errors: "status must be X, actually Y", "already rejected/charging/uninstalled", "cannot ... while running" — what they mean when a library rejects your call — this error's family across 31 libraries.
Related errors
- Verification migration was supplied for an initialized signe
- Execution payload storage is in {} maintenance
- Execution payload migration state is missing
- Execution payload rollback state is missing
- Execution intent {intent_id} has no current hash
AI-assisted analysis of nautechsystems/nautilus_trader@18893faf8b (2026-09-08).
Data as JSON: /api/errors/ada2d5a2289f4bb4.
Report an issue: GitHub.