{"record":{"id":"ec24584590bfebd9","repo":"risingwavelabs/risingwave","slug":"failed-to-execute-on-the-compute-node","errorCode":null,"errorMessage":"failed to execute on the compute node","messagePattern":"failed to execute on the compute node","errorType":"http","errorClass":null,"httpStatus":500,"severity":"critical","filePath":"src/frontend/src/webhook/mod.rs","lineNumber":302,"sourceCode":"            })?;\n\n        Ok(WebhookTableInsertContext {\n            webhook_source_info,\n            table_id,\n            table_version_id,\n            row_id_index,\n            compute_client,\n            payload_schema,\n        })\n    }\n\n    async fn execute(\n        request: FastInsertRequest,\n        client: ComputeClient,\n    ) -> Result<FastInsertResponse> {\n        let response = client.fast_insert(request).await.map_err(|e| {\n            err(\n                anyhow!(e).context(\"failed to execute on the compute node\"),\n                StatusCode::INTERNAL_SERVER_ERROR,\n            )\n        })?;\n        Ok(response)\n    }\n}\n\npub(crate) use handlers::acquire_table_info;\n\nimpl WebhookService {\n    pub fn new(webhook_addr: SocketAddr, tls_config: Option<TlsConfig>) -> Self {\n        Self {\n            webhook_addr,\n            tls_config,\n            counter: AtomicU32::new(0),\n        }\n    }\n","sourceCodeStart":284,"sourceCodeEnd":320,"githubUrl":"https://github.com/risingwavelabs/risingwave/blob/6469eb736d691e8e9b8a419a57edd6429ca77417/src/frontend/src/webhook/mod.rs#L284-L320","documentation":"The frontend successfully chose a compute node, but the `fast_insert` gRPC call to it failed. This wraps tonic/RPC errors (transport failure, node died mid-call, or a compute-side execution error) and is surfaced as HTTP 500 INTERNAL_SERVER_ERROR. The insert did not complete on the compute node.","triggerScenarios":"POST to a webhook endpoint when the compute node dies or restarts between client selection and RPC execution; network partition between frontend and compute; compute returns a status error while applying the FastInsertRequest (e.g. table dropped concurrently, write error).","commonSituations":"Compute crash mid-request; table dropped or migrated while webhooks still target it; network timeouts under load; connection pool exhaustion to the compute node.","solutions":["Retry the webhook request — a transient node restart will be healed on resend.","Check compute node logs at the request timestamp for the underlying fast_insert error.","Verify the target table still exists and is backed by a webhook source (SHOW SOURCES).","Check network connectivity/latency between frontend and compute nodes.","If persistent, restart the compute node and confirm the table's stream job is running."],"exampleFix":"// before\nawait fetch(url, {method:'POST', body});\n// after: treat 5xx as retryable\nconst res = await fetch(url, {method:'POST', body});\nif (res.status >= 500) await sendWithRetry(url, body, attempt + 1);","handlingStrategy":"retry","validationCode":"// verify the table's webhook source is intact before sending\nconst src = await query(`SHOW SOURCES WHERE name LIKE '${table}'`);\nif (src.length === 0) throw new Error('table is not webhook-backed');","typeGuard":null,"tryCatchPattern":"try {\n  const res = await fetch(url, { method: 'POST', body });\n  if (!res.ok) throw new Error(await res.text());\n} catch (e) {\n  if (isRetryable(e)) return sendWithRetry(url, body, attempt + 1);\n  throw e;\n}","preventionTips":["Make webhook senders idempotent so RPC failures can be safely retried","Watch compute node health/metrics for restarts","Avoid dropping tables while webhook producers are active","Monitor frontend-compute network latency and error rates"],"tags":["grpc","rpc-failure","compute-node","webhook"],"backgroundTag":"database-write-failed","analyzedSha":"6469eb736d691e8e9b8a419a57edd6429ca77417","analyzedAt":"2026-09-11T21:06:21.487Z","contentChangedAt":"2026-09-11T21:06:21.487Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}