Geyser icon indicating copy to clipboard operation
Geyser copied to clipboard

LEAK: ByteBuf.release() was not called before it's garbage-collected

Open gre3x opened this issue 1 year ago • 19 comments

Describe the bug

My players are getting kicked when they join. I can see the player skin in the spigot server on my java account, but the bedrock client just gets a "Disconnected" message

It does not happen immediately. Only after a few hours or so and about 100 players, does this issue occur. This did not happen before 1.20 release. Restarting the Geyser Standalone fixes the problem temporarily

Full error from server:

[19:43:54.162 epollEventLoopGroup-5-6/INFO] Joe123 has disconnected from remote Java server on address ***.***.***.123 because of java.lang.OutOfMemoryError: Cannot reserve 4194304 bytes of direct buffer memory (allocated: 133392804, limit: 134217728) [19:43:55.338 epollEventLoopGroup-3-4/ERROR] Error encoding packet LevelChunkPacket(chunkX=27, chunkZ=19, subChunksLength=17, cachingEnabled=false, requestSubChunks=false, subChunkLimit=0, blobIds=[]) java.lang.OutOfMemoryError: Cannot reserve 4194304 bytes of direct buffer memory (allocated: 133392804, limit: 134217728) at java.nio.Bits.reserveMemory(Bits.java:178) ~[?:?] at java.nio.DirectByteBuffer.<init>(DirectByteBuffer.java:121) ~[?:?] at java.nio.ByteBuffer.allocateDirect(ByteBuffer.java:332) ~[?:?] at io.netty.buffer.PoolArena$DirectArena.allocateDirect(PoolArena.java:701) ~[Geyser.jar:?] at io.netty.buffer.PoolArena$DirectArena.newChunk(PoolArena.java:676) ~[Geyser.jar:?] at io.netty.buffer.PoolArena.allocateNormal(PoolArena.java:215) ~[Geyser.jar:?] at io.netty.buffer.PoolArena.tcacheAllocateNormal(PoolArena.java:197) ~[Geyser.jar:?] at io.netty.buffer.PoolArena.allocate(PoolArena.java:139) ~[Geyser.jar:?] at io.netty.buffer.PoolArena.reallocate(PoolArena.java:302) ~[Geyser.jar:?] at io.netty.buffer.PooledByteBuf.capacity(PooledByteBuf.java:122) ~[Geyser.jar:?] at io.netty.buffer.AbstractByteBuf.ensureWritable0(AbstractByteBuf.java:305) ~[Geyser.jar:?] at io.netty.buffer.AbstractByteBuf.ensureWritable(AbstractByteBuf.java:280) ~[Geyser.jar:?] at io.netty.buffer.AbstractByteBuf.writeBytes(AbstractByteBuf.java:1103) ~[Geyser.jar:?] at org.cloudburstmc.protocol.bedrock.codec.BaseBedrockCodecHelper.writeByteBuf(BaseBedrockCodecHelper.java:96) ~[Geyser.jar:?] at org.cloudburstmc.protocol.bedrock.codec.v486.serializer.LevelChunkSerializer_v486.serialize(LevelChunkSerializer_v486.java:40) ~[Geyser.jar:?] at org.cloudburstmc.protocol.bedrock.codec.v486.serializer.LevelChunkSerializer_v486.serialize(LevelChunkSerializer_v486.java:12) ~[Geyser.jar:?] at org.cloudburstmc.protocol.bedrock.codec.BedrockCodec.tryEncode(BedrockCodec.java:78) ~[Geyser.jar:?] at org.cloudburstmc.protocol.bedrock.netty.codec.packet.BedrockPacketCodec.encode(BedrockPacketCodec.java:39) ~[Geyser.jar:?] at org.cloudburstmc.protocol.bedrock.netty.codec.packet.BedrockPacketCodec.encode(BedrockPacketCodec.java:19) ~[Geyser.jar:?] at io.netty.handler.codec.MessageToMessageCodec$1.encode(MessageToMessageCodec.java:67) ~[Geyser.jar:?] at io.netty.handler.codec.MessageToMessageEncoder.write(MessageToMessageEncoder.java:90) ~[Geyser.jar:?] at io.netty.handler.codec.MessageToMessageCodec.write(MessageToMessageCodec.java:116) ~[Geyser.jar:?] at io.netty.channel.AbstractChannelHandlerContext.invokeWrite0(AbstractChannelHandlerContext.java:879) ~[Geyser.jar:?] at io.netty.channel.AbstractChannelHandlerContext.invokeWrite(AbstractChannelHandlerContext.java:863) ~[Geyser.jar:?] at io.netty.channel.AbstractChannelHandlerContext.write(AbstractChannelHandlerContext.java:968) ~[Geyser.jar:?] at io.netty.channel.AbstractChannelHandlerContext.write(AbstractChannelHandlerContext.java:856) ~[Geyser.jar:?] at io.netty.channel.AbstractChannelHandlerContext.write(AbstractChannelHandlerContext.java:851) ~[Geyser.jar:?] at io.netty.channel.DefaultChannelPipeline.write(DefaultChannelPipeline.java:1010) ~[Geyser.jar:?] at io.netty.channel.AbstractChannel.write(AbstractChannel.java:296) ~[Geyser.jar:?] at org.cloudburstmc.protocol.bedrock.BedrockPeer.onTick(BedrockPeer.java:87) ~[Geyser.jar:?] at io.netty.util.concurrent.PromiseTask.runTask(PromiseTask.java:98) [Geyser.jar:?] at io.netty.util.concurrent.ScheduledFutureTask.run(ScheduledFutureTask.java:159) [Geyser.jar:?] at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:174) [Geyser.jar:?] at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:167) [Geyser.jar:?] at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:470) [Geyser.jar:?] at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:406) [Geyser.jar:?] at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997) [Geyser.jar:?] at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) [Geyser.jar:?] at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) [Geyser.jar:?] at java.lang.Thread.run(Thread.java:831) [?:?]

To Reproduce

  1. Install latest Geyser Standalone
  2. Have around 100 players join over an hour or so
  3. Notice errors in logs

Expected behaviour

No exceptions and allow players to join

Screenshots / Videos

What players see if they try joining when it is having the issues:

image

Server Version and Plugins

  • Geyser version 2.1.1-SNAPSHOT (git-master-53d0026) (Java: 1.20, Bedrock: 1.19.80/1.19.81 - 1.20.0)
  • Flamecord is proxy with Floodgate for Bungee installed
  • Hub server that they are first connecting to is Paper 1.12.2 with latest Floodgate for spigot and ViaVersion installed. They never make it past the hub server

Geyser Dump

https://dump.geysermc.org/jJI9eq3YGQnpf4D2hqiQ9HBuc8MJED2F

Geyser Version

2.1.1-SNAPSHOT (git-master-53d0026)

Minecraft: Bedrock Edition Device/Version

1.20.0

Additional Context

It does not happen immediately. Only after a few hours or so and about 100 players, does this issue occur. This did not happen before 1.20 release. Restarting the Geyser Standalone fixes the problem temporarily

gre3x avatar Jun 09 '23 21:06 gre3x