{"record":{"id":"e0be7a8a0cf5eb78","repo":"t8y2/dbx","slug":"duckdb-worker-exited","errorCode":"duckdb_worker_exited","errorMessage":"DuckDB worker process exited","messagePattern":"DuckDB worker process exited","errorType":"error_code","errorClass":"DuckDbWorkerError","httpStatus":null,"severity":"critical","filePath":"crates/dbx-core/src/db/duckdb_worker_process.rs","lineNumber":789,"sourceCode":"                Ok(None) => break,\n                Err(err) => {\n                    log::warn!(\"[duckdb-worker:stdout-error] error={err}\");\n                    break;\n                }\n            }\n        }\n\n        let pending = {\n            let mut pending = pending.lock().await;\n            let ids = pending\n                .iter()\n                .filter(|&(_id, request)| request.generation == generation)\n                .map(|(id, _request)| id.clone())\n                .collect::<Vec<_>>();\n            ids.into_iter().filter_map(|id| pending.remove(&id).map(|request| (id, request.sender))).collect::<Vec<_>>()\n        };\n        for (id, sender) in pending {\n            let _ = sender.send(DuckDbWorkerResponse::err(\n                id,\n                DuckDbWorkerError::new(\"duckdb_worker_exited\", \"DuckDB worker process exited\"),\n            ));\n        }\n    });\n}\n","sourceCodeStart":771,"sourceCodeEnd":796,"githubUrl":"https://github.com/t8y2/dbx/blob/c0390bff16418b651f4728520d99adf8ce48829a/crates/dbx-core/src/db/duckdb_worker_process.rs#L771-L796","documentation":"When the DuckDB worker process dies unexpectedly, spawn_stdout_reader (triggered from ensure_started_locked) fails over by resolving every pending request of the dead generation with a duckdb_worker_exited error, so callers' promises reject instead of hanging. The error indicates the worker subprocess terminated (crash, OOM kill, signal) before responding.","triggerScenarios":"A request sent through duckdb_worker_process (crates/dbx-core/src/db/duckdb_worker_process.rs:789) whose worker process exited while the request was pending — child crash (panic/segfault), SIGKILL from the OOM killer on a huge query, or explicit kill on shutdown/generation change.","commonSituations":"Out-of-memory on large DuckDB aggregations; worker panic on malformed input; system shutdown or supervisor restart killing the child; generation bump from a previous restart invalidating in-flight requests.","solutions":["Retry the failed request: implement restart-on-demand by re-calling the ensure/start path, which respawns a fresh worker and re-runs the query.","Check why the child died: inspect worker stderr/core logs for panics, and cap query memory (memory_limit pragma) to avoid OOM kills.","Handle the duckdb_worker_exited rejection in callers with a bounded retry + backoff and surface a user-facing reconnect message if retries exhaust."],"exampleFix":"// before\nconst res = await worker.request(q); // rejects with duckdb_worker_exited and gives up\n// after\ntry {\n  const res = await worker.request(q);\n} catch (e) {\n  if (e.code === \"duckdb_worker_exited\") {\n    await worker.restart();\n    return worker.request(q);\n  }\n  throw e;\n}","handlingStrategy":"retry","validationCode":"// TS: health-check the worker before dispatching\nasync function ensureAlive(worker: DuckDbWorkerProcess) {\n  if (!(await worker.ping())) await worker.ensureStarted();\n}","typeGuard":"function isExitedError(e: unknown): e is { code: \"duckdb_worker_exited\" } {\n  return typeof e === \"object\" && e !== null && (e as any).code === \"duckdb_worker_exited\";\n}","tryCatchPattern":"try {\n  return await worker.request(req);\n} catch (e) {\n  if (isExitedError(e)) {\n    await worker.restart();\n    return worker.request(req);\n  }\n  throw e;\n}","preventionTips":["Set a DuckDB memory_limit to avoid OOM kills of the worker process.","Monitor worker stderr and restart-on-crash automatically.","Treat duckdb_worker_exited as retryable once after a fresh spawn; alert if it recurs."],"tags":["rust","duckdb","process-crash","ipc","oom"],"backgroundTag":"worker-process-exited","analyzedSha":"c0390bff16418b651f4728520d99adf8ce48829a","analyzedAt":"2026-09-05T23:05:10.900Z","contentChangedAt":"2026-09-05T23:05:10.900Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}