Skip to content

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

@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
    No fields configured for issues without a type.

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions