risingwavelabs/risingwave · error

Failed to choose a compute node for fast insert

Error message

Failed to choose a compute node for fast insert

What it means

The frontend could not select a healthy compute node to execute the webhook fast-insert path. `choose_fast_insert_client` consults the cluster catalog to find an available compute process for the table; if none can be chosen (no compute nodes registered, stale worker metadata, or client creation/connect failure), the request fails with HTTP 503 SERVICE_UNAVAILABLE. This indicates a cluster health/deployment problem, not a payload problem.

Source

Thrown at src/frontend/src/webhook/mod.rs:281

                        anyhow!("Table `{}` is not backed by a webhook source", table),
                        StatusCode::FORBIDDEN,
                    )
                })?
                .clone();
            (
                webhook_source_info,
                table_catalog.id(),
                table_catalog.version_id().expect("table must be versioned"),
                row_id_index,
                payload_schema,
            )
        };

        let compute_client = choose_fast_insert_client(table_id, frontend_env, request_id)
            .await
            .map_err(|e| {
                err(
                    anyhow!(e).context("Failed to choose a compute node for fast insert"),
                    StatusCode::SERVICE_UNAVAILABLE,
                )
            })?;

        Ok(WebhookTableInsertContext {
            webhook_source_info,
            table_id,
            table_version_id,
            row_id_index,
            compute_client,
            payload_schema,
        })
    }

    async fn execute(
        request: FastInsertRequest,
        client: ComputeClient,
    ) -> Result<FastInsertResponse> {

View on GitHub (pinned to 6469eb736d)

Solutions

  1. Check cluster health and confirm at least one compute node is Running (risectl meta list-nodes or the meta dashboard).
  2. Restart or reschedule the compute node(s): `./risedev d` locally or restart the compute Deployment in k8s.
  3. Retry the webhook request once compute is healthy — it is a transient 503 and safe to retry with backoff.
  4. Verify compute node advertise addresses/ports are reachable from the frontend node.
  5. Inspect meta/compute logs for worker registration errors.

Example fix

// before: fire-and-forget sender
post(webhookUrl, body);
// after: retry on 503
let res = await post(webhookUrl, body);
if (res.status === 503) {
  await sleep(backoff);
  res = await post(webhookUrl, body);
}
Defensive patterns

Strategy: retry

Validate before calling

// ensure a healthy compute node exists before relying on webhooks
const nodes = await risectl.listComputeNodes();
if (!nodes.some(n => n.state === 'RUNNING')) throw new Error('no compute node available');

Try / catch

const res = await fetch(url, { method: 'POST', body });
if (res.status === 503) {
  await sleep(backoff(attempt));
  return sendWithRetry(url, body, attempt + 1);
}

Prevention

When it happens

Trigger: POST to /webhook/{db}/{schema}/{table} when no compute node is reachable; all compute workers are failed/starting; the meta node's worker list is stale so the chosen node cannot be connected to; the ComputeClient gRPC handshake fails during construction.

Common situations: Sending webhook events during a rolling upgrade or compute restart; a compute node crashed and was not rescheduled; misconfigured compute listen/advertise addresses (e.g. risedev/k8s) so the frontend dials a wrong port; running with only meta+frontend while compute has not registered yet.

Related errors


AI-assisted analysis of risingwavelabs/risingwave@6469eb736d (2026-09-11). Data as JSON: /api/errors/59233abb8d9a451d. Report an issue: GitHub.