mirror of
https://github.com/PaperMC/Paper.git
synced 2024-09-12 06:58:11 +02:00
98 lines
4.4 KiB
Diff
98 lines
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
|
|
}
|