(Issue)- unbounded memory growth during actors cycling.
I maintainer di solito rispondono entro 1 giorno
Valutazione
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Idoneità per principianti
- 55/100
Direzione di ricerca
Inizia da rivetkit-typescript/packages/rivetkit-napi/src/actor_context.rs, leggendo ActorContextShared::reset_runtime_state() insieme alla sua implementazione di Drop. Traccia come viene rilasciato napi::Ref quando è disponibile un Node.js Env valido e come i cicli di risveglio dell’actor raggiungono questi percorsi. Il lavoro è completato quando cicli ripetuti di sospensione/risveglio rilasciano i riferimenti JS senza panic né crescita illimitata.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Summary:-
ActorContextShared::reset_runtime_state() in rivetkit-napi uses std::mem::forget to avoid a panic when dropping a napi::Ref on a Tokio worker thread (where no Node.js Env is available). This leaks one JS object reference slot per actor wake cycle. Over time in long-running processes with many actors cycling through sleep/wake, this is unbounded memory growth.
Problem:-
When an actor wakes from sleep, reset_runtime_state() is called to clear the previous JS state object. The napi::Ref type requires calling .unref(env) with a valid Node.js Env handle to properly release the reference. But reset_runtime_state() runs on a Tokio worker thread where no Env exists.
The current code uses std::mem::forget(old) to suppress the destructor. This avoids a debug_assert panic in napi-rs, but permanently leaks the underlying V8 reference slot.
The same pattern appears in the Drop impl for ActorContextShared.
File: rivetkit-typescript/packages/rivetkit-napi/src/actor_context.rs
if let Some(old) = self.runtime_state.lock().take() {
std::mem::forget(old);
}
Impact:-
- Rivet Actors are designed to sleep and wake frequently. An actor that wakes 100 times leaks 100 JS reference slots.
- The leak is per-actor, per-wake. A deployment with thousands of actors cycling through sleep/wake accumulates leaked references without bound.
- The only relief is process restart.
- Lingua principale
- Rust
- Stelle
- 6.5k
- Fork
- 291
- Merge medio
- 18h 45m
- PR unite (30g)
- 38
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Ha un modello di pull request
- Nessuna guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di rivet-dev/rivet
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 80/100
rivet-dev/rivet#5955 · 2 commenti ·
I maintainer di solito rispondono entro 1 giorno
-
rivetkit 3.0: HTTP 400 overloaded on node pool upsert is treated as fatal and exits the processAperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
rivet-dev/rivet#5933 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
effect: action on a missing actor instance fails as internal_error instead of actor.abortedForse già presa @kunalgoesbyken l’ha presa 9 giorni fa. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
rivet-dev/rivet#5891 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
Rust client drops connection-level errors when actionId is null (JSON/CBOR)Forse già presa @DibbayajyotiRoy l’ha presa 31 giorni fa. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
rivet-dev/rivet#5819 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
Queue docs say completable messages are removed on receive, but they stay stored until complete()Forse già presa @Saisharathchandranandnetha l’ha presa 42 giorni fa. Aperta
Difficoltà 1/5 1-3 ore Idoneità per principianti 91/100
rivet-dev/rivet#5762 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di rivet-dev/rivet
Issue simili
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 65/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 62/100
I maintainer di solito rispondono entro 2 giorni
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 65/100
GiganticMinecraft/seichi-portal-backend#1651 ·
I maintainer di solito rispondono entro 1 giorno
-
Android visitors are offered the Linux .deb on cap.so's homepage and download pageForse già presa @patrickballard l’ha presa oggi. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
CapSoftware/Cap#3677 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
I maintainer di solito rispondono entro 1 giorno