fix(shared): ConnectionLimiter retains zero-count map entries on Release (memory leak)
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 2/5
- Tiempo estimado
- 1-3 horas
- Aptitud para principiantes
- 78/100
- Tipo de issue
- Error
- Claridad
- Bien especificado
- Estado de actividad
- Tranquilo
- Stack tecnológico
- go
- Área
- networking
Línea de trabajo
Empieza por packages/shared/pkg/connlimit/limiter.go, especialmente por Release y las operaciones concurrentes sobre el mapa, y después lee los casos relacionados en packages/shared/pkg/connlimit/limiter_test.go. Ejecuta las pruebas de connlimit y reproduce el escenario de 10,000 claves. Se considera terminado cuando las claves liberadas ya no permanecen en el mapa, mientras el comportamiento existente del límite y de la liberación concurrente sigue pasando.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Problem
ConnectionLimiter in packages/shared/pkg/connlimit tracks and enforces per-key concurrent connection limits. When connections are acquired and subsequently released back to zero, Release(key) decrements the counter to 0, but never removes the key entry from the underlying concurrent map (smap.Map[*atomic.Int64]).
For long-running proxy nodes (client-proxy and orchestrator/pkg/tcpfirewall) handling high request volume across ephemeral client IPs or sandboxes, inactive keys remain permanently allocated in memory with count 0, causing steady memory accumulation over time.
Root Cause
Release(key) decrements counter.Load() to 0 via CompareAndSwap(current, current-1) but lacks eviction logic when current - 1 == 0. Calls to Remove(key) are only manually issued upon sandbox deletion in orchestrator, leaving generic HTTP proxy and TCP firewall IP keys orphaned forever.
| Setting / Factor | Current Value / State | Intended / Expected |
|---|---|---|
| File / Component | packages/shared/pkg/connlimit/limiter.go:L48-L63 |
Automatic zero-count key eviction |
| Map Retention | Retains zero-count keys indefinitely ((N_{\text{total_unique_keys}})$) | Evicts zero-count keys on release ((N_{\text{active_concurrent_keys}})$) |
Reproduction Steps
- Acquire and release 10,000 unique keys using
TryAcquire(key, limit)followed byRelease(key). - Inspect
limiter.connections.Count(). - Observed result:
Count()returns10000(10,000 zero-count map entries retained). - Expected result:
Count()returns0.
limiter := connlimit.NewConnectionLimiter()
for i := 0; i < 10000; i++ {
key := fmt.Sprintf("key-%d", i)
limiter.TryAcquire(key, 5)
limiter.Release(key)
}
// limiter.connections.Count() remains 10000
Technical Context
- Files affected:
packages/shared/pkg/connlimit/limiter.go,packages/shared/pkg/connlimit/limiter_test.go - Subsystem: Shared / Client Proxy / Orchestrator TCP Firewall
- Impact: Medium (Memory accumulation on edge proxy nodes)
Proposed Changes
| # | Change | File(s) Affected | Complexity |
|---|---|---|---|
| 1 | Atomically evict zero-count keys in Release(key) using RemoveCb |
packages/shared/pkg/connlimit/limiter.go |
Low |
| 2 | Add unit tests verifying zero-count map key eviction | packages/shared/pkg/connlimit/limiter_test.go |
Low |
- Lenguaje dominante
- Go
- Estrellas
- 1.6k
- Forks
- 438
- Métricas de merge de PR
- Sin PR fusionados en 30 d
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 e2b-dev/runtime
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 88/100
-
sandbox cache: StartRemoving state transition not broadcast, all allocations see stale Running state Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 86/100
-
Dificultad 1/5 Menos de una hora Aptitud para principiantes 86/100
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 86/100
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 88/100
Todos los issues de e2b-dev/runtime
Issues similares
-
Dificultad 1/5 Menos de una hora Aptitud para principiantes 84/100
-
enhancement needs triage
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
-
kind/cleanup
Dificultad 2/5 1-3 horas Aptitud para principiantes 88/100
kubernetes-sigs/kueue#15947 ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
sympozium-ai/sympozium#627 ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 86/100