[Bug] Memory Leak in ConcurrentGrouper due to missing ThreadLocal.remove() cleanup
Los mantenedores suelen responder en 2 días
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 1/5
- Tiempo estimado
- 1-3 horas
- Aptitud para principiantes
- 68/100
Línea de trabajo
Lee org.apache.druid.query.groupby.epinephelinae.ConcurrentGrouper.java, centrándote en el campo threadLocalGrouper y en la implementación de close(). Verifica que cerrar el grouper desacople el recurso local del hilo y preserve el comportamiento existente de limpieza de los groupers.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Affected Version
Current Master / Trunk (Identified in org.apache.druid.query.groupby.epinephelinae.ConcurrentGrouper.java)
Description
Problem Summary:
A potential memory leak exists in ConcurrentGrouper. The class uses a ThreadLocal to manage thread-specific aggregation buffers but fails to clean it up in the close() method.
Detailed Analysis:
Initialization: A ThreadLocal field named threadLocalGrouper is initialized in the constructor (Line 184) to bind SpillingGrouper instances to processing threads.
The Bug: The close() method (Line 479) iterates through the groupers list to close them, but misses calling threadLocalGrouper.remove().
Impact: In Druid's thread-pool environment (Historical/Broker nodes), the processing threads remain alive after the query finishes. Because .remove() is not called, the SpillingGrouper instances (and their underlying ByteBuffers) remain referenced by the threads' ThreadLocalMap, preventing Garbage Collection. This leads to a gradual Memory Leak.
Steps to reproduce the problem:
-
Inspect org.apache.druid.query.groupby.epinephelinae.ConcurrentGrouper.java.
-
Observe that threadLocalGrouper is created via ThreadLocal.withInitial(...).
-
Check the close() implementation; it lacks the necessary cleanup call.
Relevant Code Snippet:
// Location: org.apache.druid.query.groupby.epinephelinae.ConcurrentGrouper.java
@Override
public void close()
{
if (!closed) {
closed = true;
groupers.forEach(Grouper::close);
// MISSING: threadLocalGrouper.remove(); <--- LEAK SOURCE
}
}
Proposed Fix:
Add threadLocalGrouper.remove() inside the close() method to ensure resources are detached from the thread.
- Lenguaje dominante
- Java
- Estrellas
- 14.1k
- Forks
- 3.8k
- Merge medio
- 2 d 6 h
- PR fusionados (30 d)
- 234
Preparar el entorno
- Sin Dockerfile ni archivo de Docker Compose
- Tiene una plantilla de pull request
- Leer la 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 apache/druid
-
Area - Web Console Bug
Dificultad 2/5 Menos de una hora Aptitud para principiantes 80/100
apache/druid#20605 · 1 comentario ·
Los mantenedores suelen responder en 2 días
-
Flaky test: KinesisFaultToleranceTest.test_supervisorRecovers_afterSuspendResume_withEmptyShardsAbiertoContributions Welcome Flaky test
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
apache/druid#20433 · 2 comentarios ·
Los mantenedores suelen responder en 2 días
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 82/100
apache/druid#19634 · 1 comentario ·
Los mantenedores suelen responder en 2 días
-
Proposal
Dificultad 5/5 Más de una semana Aptitud para principiantes 35/100
Los mantenedores suelen responder en 2 días
-
Backport
Dificultad 1/5 Menos de una hora Aptitud para principiantes 25/100
Los mantenedores suelen responder en 2 días
Todos los issues de apache/druid
Issues similares
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
commons-app/apps-android-commons#7275 ·
Los mantenedores suelen responder en 1 día
-
documentation
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
liberation-data/drivine4j#682 ·
Los mantenedores suelen responder en 1 día
-
Document and enforce pull request review guidelinesPosiblemente ocupada @dashorst la tomó hoy. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
Los mantenedores suelen responder en 1 día
-
`Time.at(t, in: nil)` returns UTC instead of the local time (or the time zone of `t`), unlike CRubyAbierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
Los mantenedores suelen responder en 1 día
-
hermes-queue
Dificultad 1/5 Menos de una hora Aptitud para principiantes 72/100
chrisalunlloyd2-sudo/mindpalace#349 ·
Los mantenedores suelen responder en 1 día