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

  1. Wait for the in-flight migration/initialization to finish and retry
  2. Re-run the migration to completion so operation becomes 'ready'
  3. Inspect execution_payload_state.operation and repair via the proper init path if stuck
  4. 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

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


AI-assisted analysis of nautechsystems/nautilus_trader@18893faf8b (2026-09-08). Data as JSON: /api/errors/ada2d5a2289f4bb4. Report an issue: GitHub.