Dataset Run Deletion#
Dataset run deletion is an async, two-phase process: the Postgres record is deleted synchronously, then ClickHouse run items (dataset_run_items_rmt) are cleaned up asynchronously via a BullMQ queue. This design was introduced in PR #8074 to handle ClickHouse writes correctly when deleting dataset-related entities.
Two deletion scopes are supported, differentiated by a deletionType discriminated union :
deletionType | Deletes |
|---|---|
"dataset" | All run items for an entire dataset (triggered by deleteDataset) |
"dataset-runs" | Run items for one or more specific run IDs (triggered by deleteDatasetRuns) |
API Layer#
Both deletion paths live in dataset-router.ts and require the datasets:CUD RBAC scope:
deleteDataset: Deletes the dataset row from Postgres, then callsaddToDeleteDatasetQueuewithdeletionType: "dataset".deleteDatasetRuns: Accepts an array ofdatasetRunIds, deletes theDatasetRunsrows from Postgres, then callsaddToDeleteDatasetQueuewithdeletionType: "dataset-runs"and the run IDs. ThedatasetIdinput is marked optional for backward-compat; if omitted, it falls back to the first run'sdatasetId.
Both mutations emit an auditLog entry for each deleted resource .
Queue Infrastructure#
Queue definition — DatasetDeleteQueue is a BullMQ singleton backed by a dedicated Redis connection . Job options: 2 attempts, 30 s exponential backoff, removeOnComplete: true, removeOnFail: 100_000.
Producer — addToDeleteDatasetQueue enqueues a QueueJobs.DatasetDelete job ("dataset-delete-job" on "dataset-delete-queue"). Payload schema is DatasetQueueEventSchema — a Zod discriminated union on deletionType .
Worker / processor — processClickhouseDatasetDelete switches on deletionType and calls the appropriate ClickHouse repository function:
deletionType: "dataset" → deleteDatasetRunItemsByDatasetId
deletionType: "dataset-runs" → deleteDatasetRunItemsByDatasetRunIds
ClickHouse Repository#
All three delete functions in dataset-run-items.ts issue DELETE FROM dataset_run_items_rmt parameterized queries with a configurable timeout (LANGFUSE_CLICKHOUSE_DELETION_TIMEOUT_MS):
deleteDatasetRunItemsByProjectId— project-wide deletion (used during project deletion, not dataset-run deletion).deleteDatasetRunItemsByDatasetId— filters onproject_id+dataset_id.deleteDatasetRunItemsByDatasetRunIds— filters onproject_id+dataset_id+dataset_run_id IN (...).
UI Components#
Single run — DeleteDatasetRunButton is a reusable component rendered in the row-actions dropdown of DatasetRunsTable. It checks datasets:CUD access via useHasProjectAccess : if the user lacks the scope, the button renders disabled but visible (never hidden). If the user has access, the button opens a confirmation dialog before calling api.datasets.deleteDatasetRuns.useMutation with a single-element datasetRunIds array . On success, it either navigates to a redirectUrl or invalidates the dataset query cache .
Bulk delete — DatasetRunTableMultiSelectAction in DatasetRunsTable.tsx surfaces a dropdown "Actions" button when rows are selected. It uses the same deleteDatasetRuns mutation with all selected IDs, shows a confirmation dialog with a count-aware message, and clears row selection on success.
Both UI flows share the single datasets.deleteDatasetRuns tRPC mutation — there is no separate mutation for bulk vs. single deletion.
Key Files#
| File | Purpose |
|---|---|
web/src/features/datasets/server/dataset-router.ts | tRPC mutations: deleteDataset, deleteDatasetRuns |
packages/shared/src/server/redis/datasetDelete.ts | DatasetDeleteQueue BullMQ singleton |
packages/shared/src/server/dataset-run-items/addToDeleteQueue.ts | Queue producer: addToDeleteDatasetQueue |
packages/shared/src/server/queues.ts | DatasetQueueEventSchema, QueueName.DatasetDelete |
packages/shared/src/server/repositories/dataset-run-items.ts | ClickHouse DELETE queries |
worker/src/features/datasets/processClickhouseDatasetDelete.ts | Worker processor |
web/src/features/datasets/components/DeleteDatasetRunButton.tsx | Single-run delete UI |
web/src/features/datasets/components/DatasetRunsTable.tsx | Bulk delete UI + table integration |