geforkt von Mirrors/Paper
bffb08c2f9
The Paper method was chosen for deprecation because it was more restrictive in that it has an isGliding check.
98 Zeilen
4.4 KiB
Diff
98 Zeilen
4.4 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Spottedleaf <Spottedleaf@users.noreply.github.com>
|
|
Date: Sun, 19 Dec 2021 09:13:41 -0800
|
|
Subject: [PATCH] Only write chunk data to disk if it serializes without
|
|
throwing
|
|
|
|
This ensures at least a valid version of the chunk exists
|
|
on disk, even if outdated
|
|
|
|
diff --git a/src/main/java/net/minecraft/world/level/chunk/storage/RegionFile.java b/src/main/java/net/minecraft/world/level/chunk/storage/RegionFile.java
|
|
index 98c8b676fc5b2add44d6ddf5d32f85bc07ea22cb..84b2fd9db39e0cdf3e1cbe6444579f7ca839bc45 100644
|
|
--- a/src/main/java/net/minecraft/world/level/chunk/storage/RegionFile.java
|
|
+++ b/src/main/java/net/minecraft/world/level/chunk/storage/RegionFile.java
|
|
@@ -1003,6 +1003,9 @@ public class RegionFile implements AutoCloseable {
|
|
}
|
|
|
|
}
|
|
+
|
|
+ public static final int MAX_CHUNK_SIZE = 500 * 1024 * 1024; // Paper - don't write garbage data to disk if writing serialization fails
|
|
+
|
|
// Paper end
|
|
private class ChunkBuffer extends ByteArrayOutputStream {
|
|
|
|
@@ -1018,6 +1021,24 @@ public class RegionFile implements AutoCloseable {
|
|
this.pos = chunkcoordintpair;
|
|
}
|
|
|
|
+ // Paper start - don't write garbage data to disk if writing serialization fails
|
|
+ @Override
|
|
+ public void write(final int b) {
|
|
+ if (this.count > MAX_CHUNK_SIZE) {
|
|
+ throw new RegionFileStorage.RegionFileSizeException("Region file too large: " + this.count);
|
|
+ }
|
|
+ super.write(b);
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public void write(final byte[] b, final int off, final int len) {
|
|
+ if (this.count + len > MAX_CHUNK_SIZE) {
|
|
+ throw new RegionFileStorage.RegionFileSizeException("Region file too large: " + (this.count + len));
|
|
+ }
|
|
+ super.write(b, off, len);
|
|
+ }
|
|
+ // Paper end
|
|
+
|
|
public void close() throws IOException {
|
|
ByteBuffer bytebuffer = ByteBuffer.wrap(this.buf, 0, this.count);
|
|
|
|
diff --git a/src/main/java/net/minecraft/world/level/chunk/storage/RegionFileStorage.java b/src/main/java/net/minecraft/world/level/chunk/storage/RegionFileStorage.java
|
|
index 134a5cf10073c27dfbc19709e81ffa75bcc73743..db571f658f636cdda1dcdbaffa0c4da67fae11ad 100644
|
|
--- a/src/main/java/net/minecraft/world/level/chunk/storage/RegionFileStorage.java
|
|
+++ b/src/main/java/net/minecraft/world/level/chunk/storage/RegionFileStorage.java
|
|
@@ -342,10 +342,17 @@ public class RegionFileStorage implements AutoCloseable {
|
|
NbtIo.write(nbt, (DataOutput) dataoutputstream);
|
|
regionfile.setStatus(pos.x, pos.z, ChunkSerializer.getStatus(nbt)); // Paper - cache status on disk
|
|
regionfile.setOversized(pos.x, pos.z, false); // Paper - We don't do this anymore, mojang stores differently, but clear old meta flag if it exists to get rid of our own meta file once last oversized is gone
|
|
+ dataoutputstream.close(); // Paper - only write if successful
|
|
+ // Paper start - don't write garbage data to disk if writing serialization fails
|
|
+ } catch (RegionFileSizeException e) {
|
|
+ attempts = 5; // Don't retry
|
|
+ regionfile.clear(pos);
|
|
+ throw e;
|
|
+ // Paper end - don't write garbage data to disk if writing serialization fails
|
|
} catch (Throwable throwable) {
|
|
if (dataoutputstream != null) {
|
|
try {
|
|
- dataoutputstream.close();
|
|
+ //dataoutputstream.close(); // Paper - don't write garbage data to disk if writing serialization fails
|
|
} catch (Throwable throwable1) {
|
|
throwable.addSuppressed(throwable1);
|
|
}
|
|
@@ -353,10 +360,7 @@ public class RegionFileStorage implements AutoCloseable {
|
|
|
|
throw throwable;
|
|
}
|
|
-
|
|
- if (dataoutputstream != null) {
|
|
- dataoutputstream.close();
|
|
- }
|
|
+ // Paper - move into try block to only write if successfully serialized
|
|
}
|
|
// Paper start
|
|
return;
|
|
@@ -402,4 +406,13 @@ public class RegionFileStorage implements AutoCloseable {
|
|
}
|
|
|
|
}
|
|
+
|
|
+ // Paper start
|
|
+ public static final class RegionFileSizeException extends RuntimeException {
|
|
+
|
|
+ public RegionFileSizeException(String message) {
|
|
+ super(message);
|
|
+ }
|
|
+ }
|
|
+ // Paper end
|
|
}
|