From f17c3fa267b7c5f2a8223d42cdda6fd050732449 Mon Sep 17 00:00:00 2001 From: s809 <43530948+s809@users.noreply.github.com> Date: Fri, 23 Aug 2024 14:16:20 +0500 Subject: [PATCH] "Fix" buffer release errors in FullDataPayload --- .../core/level/DhServerLevel.java | 62 +++++++++---------- .../core/network/INetworkObject.java | 2 +- .../messages/fullData/FullDataPayload.java | 31 +++++----- 3 files changed, 46 insertions(+), 49 deletions(-) diff --git a/core/src/main/java/com/seibel/distanthorizons/core/level/DhServerLevel.java b/core/src/main/java/com/seibel/distanthorizons/core/level/DhServerLevel.java index bd1ef565e..e14272c28 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/level/DhServerLevel.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/level/DhServerLevel.java @@ -294,22 +294,20 @@ public class DhServerLevel extends AbstractDhLevel implements IDhServerLevel } CompletableFuture.runAsync(() -> { - try (FullDataPayload payload = new FullDataPayload(requestGroup.fullDataSource)) + FullDataPayload payload = new FullDataPayload(requestGroup.fullDataSource); + for (FullDataSourceRequestMessage msg : requestGroup.requestMessages.values()) { - for (FullDataSourceRequestMessage msg : requestGroup.requestMessages.values()) + this.requestGroupsByFutureId.remove(msg.futureId); + + ServerPlayerState serverPlayerState = this.remotePlayerConnectionHandler.getConnectedPlayer(msg.serverPlayer()); + if (serverPlayerState == null) { - this.requestGroupsByFutureId.remove(msg.futureId); - - ServerPlayerState serverPlayerState = this.remotePlayerConnectionHandler.getConnectedPlayer(msg.serverPlayer()); - if (serverPlayerState == null) - { - continue; - } - - serverPlayerState.getRateLimiterSet(this).fullDataRequestConcurrencyLimiter.release(); - payload.acceptInChunkMessages(FULL_DATA_CHUNK_SIZE, msg.getSession()::sendMessage); - msg.sendResponse(new FullDataSourceResponseMessage(payload.retain())); + continue; } + + serverPlayerState.getRateLimiterSet(this).fullDataRequestConcurrencyLimiter.release(); + payload.acceptInChunkMessages(FULL_DATA_CHUNK_SIZE, msg.getSession()::sendMessage); + msg.sendResponse(new FullDataSourceResponseMessage(payload)); } }, executor); } @@ -331,28 +329,26 @@ public class DhServerLevel extends AbstractDhLevel implements IDhServerLevel } CompletableFuture.runAsync(() -> { - try (FullDataPayload payload = new FullDataPayload(data)) + FullDataPayload payload = new FullDataPayload(data); + for (ServerPlayerState serverPlayerState : this.remotePlayerConnectionHandler.getConnectedPlayers()) { - for (ServerPlayerState serverPlayerState : this.remotePlayerConnectionHandler.getConnectedPlayers()) + if (serverPlayerState.serverPlayer().getLevel() != this.serverLevelWrapper) { - if (serverPlayerState.serverPlayer().getLevel() != this.serverLevelWrapper) - { - continue; - } - - if (!serverPlayerState.config.isRealTimeUpdatesEnabled()) - { - continue; - } - - Vec3d playerPosition = serverPlayerState.serverPlayer().getPosition(); - int distanceFromPlayer = DhSectionPos.getManhattanBlockDistance(data.getPos(), new DhBlockPos2D((int) playerPosition.x, (int) playerPosition.z)) / 16; - if (distanceFromPlayer >= serverPlayerState.serverPlayer().getViewDistance() && - distanceFromPlayer <= serverPlayerState.config.getRenderDistanceRadius()) - { - payload.acceptInChunkMessages(FULL_DATA_CHUNK_SIZE, serverPlayerState.session::sendMessage); - serverPlayerState.session.sendMessage(new FullDataPartialUpdateMessage(this.serverLevelWrapper, payload.retain())); - } + continue; + } + + if (!serverPlayerState.config.isRealTimeUpdatesEnabled()) + { + continue; + } + + Vec3d playerPosition = serverPlayerState.serverPlayer().getPosition(); + int distanceFromPlayer = DhSectionPos.getManhattanBlockDistance(data.getPos(), new DhBlockPos2D((int) playerPosition.x, (int) playerPosition.z)) / 16; + if (distanceFromPlayer >= serverPlayerState.serverPlayer().getViewDistance() && + distanceFromPlayer <= serverPlayerState.config.getRenderDistanceRadius()) + { + payload.acceptInChunkMessages(FULL_DATA_CHUNK_SIZE, serverPlayerState.session::sendMessage); + serverPlayerState.session.sendMessage(new FullDataPartialUpdateMessage(this.serverLevelWrapper, payload)); } } }, executor); diff --git a/core/src/main/java/com/seibel/distanthorizons/core/network/INetworkObject.java b/core/src/main/java/com/seibel/distanthorizons/core/network/INetworkObject.java index 4d81250e1..dccbb43b6 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/network/INetworkObject.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/network/INetworkObject.java @@ -75,7 +75,7 @@ public interface INetworkObject default String readString(ByteBuf inputByteBuf) { int length = inputByteBuf.readUnsignedShort(); - return inputByteBuf.readBytes(length).toString(StandardCharsets.UTF_8); + return inputByteBuf.readSlice(length).toString(StandardCharsets.UTF_8); } default void writeCollection(ByteBuf outputByteBuf, Collection collection) diff --git a/core/src/main/java/com/seibel/distanthorizons/core/network/messages/fullData/FullDataPayload.java b/core/src/main/java/com/seibel/distanthorizons/core/network/messages/fullData/FullDataPayload.java index fbc830b1a..32ccc0220 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/network/messages/fullData/FullDataPayload.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/network/messages/fullData/FullDataPayload.java @@ -6,21 +6,26 @@ import com.seibel.distanthorizons.core.config.Config; import com.seibel.distanthorizons.core.dataObjects.fullData.sources.FullDataSourceV2; import com.seibel.distanthorizons.core.network.INetworkObject; import com.seibel.distanthorizons.core.sql.dto.FullDataSourceV2DTO; +import com.seibel.distanthorizons.core.util.TimerUtil; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import org.jetbrains.annotations.NotNull; -import java.io.Closeable; import java.io.IOException; import java.util.Objects; +import java.util.Timer; +import java.util.TimerTask; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Consumer; -public class FullDataPayload implements INetworkObject, Closeable +public class FullDataPayload implements INetworkObject { private static final AtomicInteger lastBufferId = new AtomicInteger(); + // Reference counting is unreliable here for some reason so this is a "fix" + private static final Timer bufferCleanupTimer = TimerUtil.CreateTimer("FullDataBufferCleanupTimer"); + public int dtoBufferId; public ByteBuf dtoBuffer; @@ -39,6 +44,15 @@ public class FullDataPayload implements INetworkObject, Closeable this.dtoBuffer = ByteBufAllocator.DEFAULT.buffer(); dataSourceDto.encode(this.dtoBuffer); + + bufferCleanupTimer.schedule(new TimerTask() + { + @Override + public void run() + { + FullDataPayload.this.dtoBuffer.release(); + } + }, 5000L); } catch (IOException e) { @@ -64,24 +78,11 @@ public class FullDataPayload implements INetworkObject, Closeable } } - - public FullDataPayload retain() - { - this.dtoBuffer.retain(); - return this; - } - - @Override public void close() - { - this.dtoBuffer.release(); - } - @Override public void encode(ByteBuf out) { out.writeInt(this.dtoBufferId); - this.dtoBuffer.release(); } @Override