sandbox cache: StartRemoving state transition not broadcast, all allocations see stale Running state
I maintainer di solito rispondono entro 3 giorni
Valutazione
- Difficoltà
- 2/5
- Tempo stimato
- 1-3 ore
- Idoneità per principianti
- 86/100
Direzione di ricerca
Inizia in packages/api/internal/sandbox/storage/redis/state_change.go, in StartRemoving, quindi confronta la gestione delle transizioni con il pattern di pubblicazione di Update() in operations.go. Segui il dispatch di subscription_manager.go per verificare che la cache riceva l’evento di aggiornamento del sandbox; il lavoro è completato quando la cache riflette il nuovo stato della transizione dopo StartRemoving senza modificare il comportamento esistente del callback.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Summary
When StartRemoving atomically writes a state transition to Redis (e.g. Running → Killing), it never calls publishSandboxEvent. The per-allocation in-process sandbox cache (introduced in #3593) therefore never learns about the new state, and every allocation continues to serve the old Running state from memory until the sandbox is eventually deleted and a remove event arrives.
Code Path
Step 1 — Lua script writes new state to Redis, but no event is published
// state_change.go
updated := sbx
updated.State = newState // e.g. Killing
written, err := startTransitionScript.Run(ctx, s.redisClient,
[]string{key, transitionKey, resultKey},
newData, transitionID, ...) // Redis now has State=Killing
// StartRemoving returns here — no publishSandboxEvent call
return updated, false, s.createCallback(...), nil
Step 2 — createCallback publishes only a routing key, not a sandboxEvent
// state_change.go — createCallback
s.publisher.Publish(cbCtx, getTransitionRoutingKey(teamID.String(), sandboxID, transitionID))
// payload: "lock:sandbox:storage:...:transition:<uuid>"
Step 3 — dispatch routes the payload to waiters, never to cache.apply
// subscription_manager.go
func (m *subscriptionManager) dispatch(payload string) {
if isSandboxEvent(payload) { // strings.HasPrefix(payload, "{") → false for routing keys
m.cache.apply(evt) // never reached
return
}
// falls through to waiter fan-out
}
Impact
Between startTransitionScript.Run() and the final Remove() call (which does publish a remove event), every allocation returns State = Running from TeamItems for a sandbox that Redis already has as Killing or Pausing. For transient transitions, restoreToRunning calls Update() which publishes correctly, but the first half of the round-trip remains invisible to the cache.
Concretely:
TeamItems(states: [Running])returns sandboxes that are mid-removal — callers may act on them incorrectly.- Metrics and user-facing sandbox list show inflated
Runningcounts during high-eviction periods.
Fix
In StartRemoving, after startTransitionScript.Run() succeeds, broadcast the updated sandbox:
s.publisher.publishSandboxEvent(ctx, sandboxEvent{
Op: sandboxEventOpUpdate,
Sandbox: &updated,
})
This mirrors exactly what Update() does in operations.go. dispatch() will call cache.apply({update, updated}), replacing the cached entry with the correct state.
The createCallback path does not need a separate publish because:
- For permanent removals (
TransitionExpires), the subsequentRemove()call already publishes aremoveevent. - For transient transitions,
restoreToRunningcallsUpdate()which already publishes anupdateevent.
Related
- #3593 — introduces the per-allocation cache that this change affects
packages/api/internal/sandbox/storage/redis/state_change.gopackages/api/internal/sandbox/storage/redis/operations.go(reference: correct publish pattern inUpdate())
- Lingua principale
- Go
- Stelle
- 1.7k
- Fork
- 458
- Metriche di merge delle PR
- Nessuna PR unita negli ultimi 30g
Preparare l'ambiente
Avvia il container di sviluppo del progetto nel browser, con il tuo account GitHub.
- Nessun Dockerfile né file Docker Compose
- Nessun modello di pull request
- Leggi la 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 e2b-dev/runtime
-
[Bug]: flock() on a mounted volume hangs forever (mount is missing `nolock`)Forse già presa @AdaAibaby l’ha presa 27 giorni fa. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 88/100
I maintainer di solito rispondono entro 3 giorni
-
kernel: ipv6.disable=0 with no IPv6 routing causes Happy Eyeballs latency on all outbound sandbox connectionsForse già presa @AdaAibaby l’ha presa 47 giorni fa. Aperta
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 86/100
I maintainer di solito rispondono entro 3 giorni
-
fix(envd): malformed error message %!w(<nil>) when watch path is not a directoryForse già presa @chill-czar l’ha presa 47 giorni fa. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 86/100
I maintainer di solito rispondono entro 3 giorni
-
fix(api): POST /sandboxes/{id}/connect accepts non-positive timeout values causing immediate terminationForse già presa @chill-czar l’ha presa 47 giorni fa. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 88/100
I maintainer di solito rispondono entro 3 giorni
-
fix(api): isRetryableError in volume_util.go does not recognize gRPC codes.Unavailable and codes.DeadlineExceededForse già presa @chill-czar l’ha presa 47 giorni fa. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
I maintainer di solito rispondono entro 3 giorni
Tutte le issue di e2b-dev/runtime
Issue simili
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
prime-radiant-inc/evener#3726 ·
I maintainer di solito rispondono entro 1 giorno
-
[BUG] Async engine endpoint-label relationship counts include pending relationships of every typeAperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 86/100
modelcontextprotocol/go-sdk#1340 ·
I maintainer di solito rispondono entro 1 giorno
-
🪲 bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
binwiederhier/ntfy#1992 ·
I maintainer di solito rispondono entro 2 giorni
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 84/100
MHSanaei/3x-ui#6731 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno