Skip to content

Introduce converters to consume Postgres Json and convert these to String/byte[] #453

Closed
@jdmwood

Description

@jdmwood

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!

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions