`DELETE /actors/{id}` leaves the destroyed actor's data (workflow step output, queue bodies, state) in engine KV under Depot `DELTA` keys
Los mantenedores suelen responder en 1 día
@eersnington ya está trabajando en esto.
Desde el 22/10/2026.
Evaluación
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Aptitud para principiantes
- 48/100
- Tipo de issue
- Error
- Claridad
- Bastante claro
- Estado de actividad
- Activo
- Stack tecnológico
- docker, node.js, postgresql, rust, typescript
- Área
- backend, databases, distributed-systems
Línea de trabajo
Start by reading the destroy path in actor2/mod.rs, especially ClearKv and clear_v2_storage_for_destroy, then trace how Depot DELTA keys are written and associated with an actor. Check existing destroy and purge tests, and add coverage for workflow output, queue bodies, and actor state. Done means destroying an actor removes its data from engine KV, or the intended retention and purge behavior is documented and covered.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Environment
rivetkit2.3.27,rivetdev/engine:2.3.27(self-hosted, Docker), Postgres backend (rivet_enginedatabase)
Expected
destroy.mdx: "The actor's state is permanently deleted." Engine actor2/mod.rs destroy runs
ClearKv + clear_v2_storage_for_destroy. After DELETE /actors/{id} we expect no row in the
engine kv table to contain values written by that actor.
Actual
Unique marker strings written by the actor as (a) a workflow step return value, (b) a queue message
body and (c) actor state are still present in the engine's kv table after destroy — 5 s, 35 s,
30 min and 13.2 h later (5 rows under Depot DELTA keys in the 13.2 h check).
Repro
// probe.ts — `tsx probe.ts` against a local engine whose Postgres is on 127.0.0.1:54329
import { randomUUID } from "node:crypto";
import pg from "pg";
import { actor, setup } from "rivetkit";
import { createClient } from "rivetkit/client";
import { workflow } from "rivetkit/workflow";
const ENDPOINT = "http://127.0.0.1:6420";
const TOKEN = "<admin-token>";
const step = `STEP-${randomUUID()}`, queued = `QUEUE-${randomUUID()}`, stateMark = `STATE-${randomUUID()}`;
const leaky = actor({
state: { note: "" },
run: workflow(async (ctx) => {
const msg = await ctx.queue.next("go");
await ctx.step("leak", async (s) => {
s.state.note = stateMark;
return { note: step, from: JSON.stringify(msg.body) };
});
await ctx.queue.next("never");
}),
actions: { go: async (c, body: string) => c.queue.send("go", { body }) },
});
const registry = setup({ use: { leaky }, endpoint: ENDPOINT, token: TOKEN, namespace: "default" });
await registry.startAndWait();
const client = createClient<typeof registry>({ endpoint: ENDPOINT, token: TOKEN, namespace: "default" });
const h = client.leaky.getOrCreate([`probe-${Date.now()}`]);
await h.go(queued);
const db = new pg.Pool({ connectionString: "postgres://rivet:[email protected]:54329/rivet_engine" });
const scan = async (label: string) => {
const { rows } = await db.query<{ key: Buffer; value: Buffer }>("SELECT key, value FROM kv");
const hay = Buffer.concat(rows.flatMap((r) => [r.key, r.value]));
console.log(label, { step: hay.includes(step), queue: hay.includes(queued), state: hay.includes(stateMark) });
};
await new Promise((r) => setTimeout(r, 3000));
await scan("before destroy");
const id = await h.resolve();
await fetch(`${ENDPOINT}/actors/${id}?namespace=default`, { method: "DELETE", headers: { authorization: `Bearer ${TOKEN}` } });
await new Promise((r) => setTimeout(r, 35000));
await scan("35 s after DELETE /actors");
Measured
- All three markers present after destroy at +5 s and +35 s; rows not reclaimed within 30 min.
- Long check: actor destroyed, markers still present 13.2 h later, 5 rows under Depot
DELTAkeys. - In our purge integration test (destroy every actor of a deleted tenant, then scan engine KV for
that tenant's identifiers): 79 / 83 / 92 matching rows across three runs, growing with the shared
engine database. The actors themselves are gone (no live entry), only the data stays. rivet_enginegrew to 27 MB / 60k KV rows over a small spike (2 tenants, ~10 workflows).
Question / suggested fix
Should destroy (or a later GC) delete the actor's Depot DELTA keys? If retention is intended,
please document how long and how to purge — we need it for data-deletion requests (GDPR erasure).
Today we can't rely on DELETE /actors for deletion and avoid touching engine tables directly.
- Lenguaje dominante
- Rust
- Estrellas
- 6.3k
- Forks
- 280
- Merge medio
- 1 d 9 h
- PR fusionados (30 d)
- 53
Preparar el entorno
- Sin Dockerfile ni archivo de Docker Compose
- Tiene una plantilla de pull request
- Sin guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de rivet-dev/rivet
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 82/100
rivet-dev/rivet#5891 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
Rust client drops connection-level errors when actionId is null (JSON/CBOR)Posiblemente ocupada @DibbayajyotiRoy la tomó hace 20 días. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
rivet-dev/rivet#5819 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
Queue docs say completable messages are removed on receive, but they stay stored until complete()Posiblemente ocupada @Saisharathchandranandnetha la tomó hace 31 días. Abierto
Dificultad 1/5 1-3 horas Aptitud para principiantes 91/100
rivet-dev/rivet#5762 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
Serverless listener forwards /start to the application when basePath is "/"Posiblemente ocupada @Saisharathchandranandnetha la tomó hace 34 días. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 90/100
rivet-dev/rivet#5755 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
Dificultad 5/5 Más de una semana Aptitud para principiantes 35/100
rivet-dev/rivet#5908 · 1 comentario ·
Los mantenedores suelen responder en 1 día
Todos los issues de rivet-dev/rivet
Issues similares
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 62/100
foxglove/mcap#1907 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
Dificultad 1/5 Menos de una hora Aptitud para principiantes 66/100
Los mantenedores suelen responder en 1 día
-
good first issue help wanted r-feature
Dificultad 2/5 1-3 horas Aptitud para principiantes 82/100
servo/rust-smallvec#792 ·
Los mantenedores suelen responder en 1 día
-
A-Unicode C-bug P-low
Dificultad 2/5 1-3 horas Aptitud para principiantes 70/100
rust-lang/rustfmt#7210 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
callTracer with withLog: true includes logs from a reverted top-level call (diverges from geth)Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 82/100
paradigmxyz/revm-inspectors#570 ·
Los mantenedores suelen responder en 1 día