Closed
Description
I think I have found a potential memory leak using Spring Data + R2BC Posgres.
I have a model and repository like this (Kotlin code):
@Table
data class MyTable(
val data: Json
)
interface MyTableRepository : CoroutineCrudRepository<MyTable, Int> {
}
The SQL to create this table is:
create table my_table (
data json not null
);
If I do a query like this:
for (i in 0..1000) {
testRepo.findAll().toList()
}
... then I get a bunch of Netty memory leak errors (https://netty.io/wiki/reference-counted-objects.html). The culprit seems to be this one:
2020-09-09 13:26:51.761 ERROR 78212 --- [actor-tcp-nio-2] io.netty.util.ResourceLeakDetector : LEAK: ByteBuf.release() was not called before it's garbage-collected. See https://netty.io/wiki/reference-counted-objects.html for more information.
Recent access records:
Created at:
io.netty.buffer.SimpleLeakAwareByteBuf.unwrappedDerived(SimpleLeakAwareByteBuf.java:143)
io.netty.buffer.SimpleLeakAwareByteBuf.retainedSlice(SimpleLeakAwareByteBuf.java:52)
io.netty.buffer.AdvancedLeakAwareByteBuf.retainedSlice(AdvancedLeakAwareByteBuf.java:89)
io.r2dbc.postgresql.codec.JsonCodec.doDecode(JsonCodec.java:49)
io.r2dbc.postgresql.codec.JsonCodec.doDecode(JsonCodec.java:34)
io.r2dbc.postgresql.codec.AbstractCodec.decode(AbstractCodec.java:82)
io.r2dbc.postgresql.codec.DefaultCodecs.decode(DefaultCodecs.java:129)
io.r2dbc.postgresql.PostgresqlRow.decode(PostgresqlRow.java:90)
io.r2dbc.postgresql.PostgresqlRow.get(PostgresqlRow.java:77)
io.r2dbc.spi.Row.get(Row.java:78)
org.springframework.data.r2dbc.convert.MappingR2dbcConverter$RowParameterValueProvider.getParameterValue(MappingR2dbcConverter.java:656)
org.springframework.data.r2dbc.convert.MappingR2dbcConverter$$Lambda$1333/0000000000000000.apply(Unknown Source)
org.springframework.data.relational.core.conversion.BasicRelationalConverter$ConvertingParameterValueProvider.getParameterValue(BasicRelationalConverter.java:264)
org.springframework.data.mapping.model.ClassGeneratingEntityInstantiator$EntityInstantiatorAdapter.extractInvocationArguments(ClassGeneratingEntityInstantiator.java:262)
org.springframework.data.mapping.model.ClassGeneratingEntityInstantiator$EntityInstantiatorAdapter.createInstance(ClassGeneratingEntityInstantiator.java:235)
org.springframework.data.mapping.model.ClassGeneratingEntityInstantiator.createInstance(ClassGeneratingEntityInstantiator.java:87)
org.springframework.data.relational.core.conversion.BasicRelationalConverter.createInstance(BasicRelationalConverter.java:147)
org.springframework.data.r2dbc.convert.MappingR2dbcConverter.createInstance(MappingR2dbcConverter.java:300)
org.springframework.data.r2dbc.convert.MappingR2dbcConverter.read(MappingR2dbcConverter.java:121)
org.springframework.data.r2dbc.convert.MappingR2dbcConverter.read(MappingR2dbcConverter.java:116)
org.springframework.data.r2dbc.convert.EntityRowMapper.apply(EntityRowMapper.java:46)
...
Apologies if this is actually an issue in the core R2BC library. I'm happy to re-raise this there if that is the case.
Thanks!