{"record":{"id":"15dd95f1b8b5c8e9","repo":"risingwavelabs/risingwave","slug":"fast-insert-failed","errorCode":null,"errorMessage":"Fast insert failed: {}","messagePattern":"Fast insert failed: (.+?)","errorType":"http","errorClass":null,"httpStatus":500,"severity":"error","filePath":"src/frontend/src/webhook/mod.rs","lineNumber":178,"sourceCode":"            }\n        };\n\n        let fast_insert_request = FastInsertRequest {\n            table_id,\n            table_version_id,\n            data_chunk: Some(data_chunk.to_protobuf()),\n            row_id_index,\n            request_id,\n            wait_for_persistence: webhook_source_info.wait_for_persistence,\n        };\n        // execute on the compute node\n        let res = execute(fast_insert_request, compute_client).await?;\n\n        if res.status == fast_insert_response::Status::Succeeded as i32 {\n            Ok(())\n        } else {\n            Err(err(\n                anyhow!(\"Fast insert failed: {}\", res.error_message),\n                StatusCode::INTERNAL_SERVER_ERROR,\n            ))\n        }\n    }\n\n    fn generate_data_chunk(is_batched: bool, body: &Bytes) -> Result<DataChunk> {\n        let mut builder = JsonbArrayBuilder::with_type(1, DataType::Jsonb);\n\n        if !is_batched {\n            // Use builder to obtain a single column & single row DataChunk\n            let json_value = Value::from_text(body).map_err(|e| {\n                err(\n                    anyhow!(e).context(\"failed to parse request body\"),\n                    StatusCode::UNPROCESSABLE_ENTITY,\n                )\n            })?;\n\n            let jsonb_val = JsonbVal::from(json_value);","sourceCodeStart":160,"sourceCodeEnd":196,"githubUrl":"https://github.com/risingwavelabs/risingwave/blob/6469eb736d691e8e9b8a419a57edd6429ca77417/src/frontend/src/webhook/mod.rs#L160-L196","documentation":"The webhook handler sent a fast-insert request to the compute node and the response status was not Succeeded. The compute node's error_message is embedded in the returned error with HTTP 500. It means the batched fast path for writing webhook payload rows into the table failed on the compute side.","triggerScenarios":"POSTing to a webhook endpoint /table where handle_post_request executes the fast insert and res.status != Succeeded: compute node unreachable/overloaded, schema mismatch between payload columns and table, or serialization failure inside the compute node.","commonSituations":"Webhook payloads whose extracted columns don't match the table schema; compute node crash/restart under load; MV built over the webhook source rejecting rows; network partition between frontend and compute.","solutions":["Inspect the embedded res.error_message in the error/response body for the root cause.","Verify the webhook payload matches the table's expected JSON schema (column names/types).","Check compute node health/logs (risingwave compute) and retry the POST.","Confirm the table's webhook source is healthy: SELECT * FROM rw_catalog.rw_webhook_source_info (or equivalent) and re-create the webhook source if corrupted."],"exampleFix":"// before\n// compute rejects rows: wrong column type\nPOST /webhook/table/orders {\"amount\": \"not-a-number\"}\n\n// after\nPOST /webhook/table/orders {\"amount\": 42}","handlingStrategy":"try-catch","validationCode":"// validate payload against the table schema before POST\nconst required = ['id', 'amount'];\nif (!required.every(k => k in payload) || typeof payload.amount !== 'number') {\n  throw new Error('payload does not match table schema');\n}","typeGuard":"function isValidWebhookPayload(p: unknown): p is Record<string, string|number|boolean|null> {\n  return typeof p === 'object' && p !== null && !Array.isArray(p);\n}","tryCatchPattern":"try {\n  await postWebhook('/table/orders', payload);\n} catch (e) {\n  if (e.status === 500 && /Fast insert failed/.test(e.message)) {\n    logComputeError(e.message); // includes res.error_message\n    await retryWithBackoff(() => postWebhook('/table/orders', payload));\n  } else { throw e; }\n}","preventionTips":["Match payload keys and types to the table schema exactly.","Monitor compute node health before high-volume webhook traffic.","Implement client-side retries with backoff for 500s.","Keep the embedded compute error_message in your logs for triage."],"tags":["webhook","http","insert","compute-node"],"backgroundTag":"http-error-response","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"}