fix(shared): ConnectionLimiter retains zero-count map entries on Release (memory leak)

Abierto Apto para principiantes
#3,448 0 comentarios 0 reacciones 0 asignados Ver en GitHub

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

  1. Acquire and release 10,000 unique keys using TryAcquire(key, limit) followed by Release(key).
  2. Inspect limiter.connections.Count().
  3. Observed result: Count() returns 10000 (10,000 zero-count map entries retained).
  4. Expected result: Count() returns 0.
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

Abrir la guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de e2b-dev/runtime

Todos los issues de e2b-dev/runtime

Issues similares

Más issues de Go

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.