[Bug] Memory Leak in ConcurrentGrouper due to missing ThreadLocal.remove() cleanup

Abierto Apto para principiantes
#18,942 0 comentarios 0 reacciones 0 asignados Ver en GitHub

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
Tipo de issue
Error
Claridad
Bien especificado
Estado de actividad
Estancado
Stack tecnológico
java
Área
databases

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

Uncategorized problem report
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:

  1. Inspect org.apache.druid.query.groupby.epinephelinae.ConcurrentGrouper.java.

  2. Observe that threadLocalGrouper is created via ThreadLocal.withInitial(...).

  3. 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

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 apache/druid

Todos los issues de apache/druid

Issues similares

Más issues de Java

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.