apache / apache/arrow-java

[Java] DictionaryProvider leaks memory while adding dictionaries with duplicate encoding

Abierto
#313 7 comentarios 0 reacciones 0 asignados Ver en GitHub
Type: bug
Lenguaje dominante
Java
Estrellas
94
Forks
152
Merge medio
3 d 16 h
PR fusionados (30 d)
11

Descripción

DictionaryProvider leaks memory while adding dictionaries with duplicate encoding. Is this expected? Should the provider release the memory of the existing dictionary vector if it accepts another one with same encoding id ?

Sample code:
```java

"dictionaryProvider" should " not leak memory while adding dictionaries with duplicate encoding" in {

val allocator: RootAllocator = new RootAllocator()

val vector: ListVector = ListVector.empty("vector", allocator)
val dictionaryVector1: ListVector = ListVector.empty("dict1", allocator)
val dictionaryVector2: ListVector = ListVector.empty("dict2", allocator)

val writer1: UnionListWriter = vector.getWriter
writer1.allocate
writer1.setValueCount(1)

val dictWriter1: UnionListWriter = dictionaryVector1.getWriter
dictWriter1.allocate
dictWriter1.setValueCount(1)

val dictWriter2: UnionListWriter = dictionaryVector2.getWriter
dictWriter2.allocate
dictWriter2.setValueCount(1)

val dictionary1: Dictionary = new Dictionary(dictionaryVector1, new DictionaryEncoding(1L, false, None.orNull))
val dictionary2: Dictionary = new Dictionary(dictionaryVector2, new DictionaryEncoding(1L, false, None.orNull))

val provider = new DictionaryProvider.MapDictionaryProvider
provider.put(dictionary1)
provider.put(dictionary2)

vector.clear()
provider.getDictionaryIds.asScala.map(id => provider.lookup(id).getVector.clear())

allocator.getAllocatedMemory shouldBe 0
}
```

**Reporter**: [Vimal Varghese](https://issues.apache.org/jira/browse/ARROW-16920)

**Note**: *This issue was originally created as [ARROW-16920](https://issues.apache.org/jira/browse/ARROW-16920). Please see the [migration documentation](https://github.com/apache/arrow/issues/14542) for further details.*

Guía de contribución

Abrir la guía de contribución

Línea de trabajo

Comience en DictionaryProvider.MapDictionaryProvider y ejecute la reproducción proporcionada, que añade dos diccionarios con el encoding ID 1, limpia el vector y comprueba la memoria del allocator. Rastree qué ocurre con el primer diccionario cuando se inserta el segundo; el trabajo está terminado cuando el caso de encoding duplicado libera toda la memoria asignada y la comprobación final de asignación llega a cero.

Escrito por el modelo de indexación a partir del texto del issue.

Evaluación

Stack tecnológico
java
Área
data
Tipo de issue
Error
Dificultad
3/5
Tiempo estimado
1-2 días
Estado de actividad
Estancado
Claridad
Bastante claro
Aptitud para principiantes
35/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.