2021-12-19 18:15:22 +01:00
|
|
|
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
|
|
|
|
|
2022-02-05 20:47:11 +01:00
|
|
|
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
|
2024-04-24 18:15:59 +02:00
|
|
|
index 12b7d50f49a2184aaf220a4a50a137b217c57124..f1237f6fd6414900ffbad0caee31aa83310eeef4 100644
|
2022-02-05 20:47:11 +01:00
|
|
|
--- a/src/main/java/net/minecraft/world/level/chunk/storage/RegionFile.java
|
|
|
|
+++ b/src/main/java/net/minecraft/world/level/chunk/storage/RegionFile.java
|
2024-04-24 18:15:59 +02:00
|
|
|
@@ -442,6 +442,7 @@ public class RegionFile implements AutoCloseable {
|
2022-08-10 17:07:49 +02:00
|
|
|
|
|
|
|
}
|
2024-01-23 15:43:48 +01:00
|
|
|
|
2022-08-10 17:07:49 +02:00
|
|
|
+ public static final int MAX_CHUNK_SIZE = 500 * 1024 * 1024; // Paper - don't write garbage data to disk if writing serialization fails
|
|
|
|
private class ChunkBuffer extends ByteArrayOutputStream {
|
|
|
|
|
2024-01-23 15:43:48 +01:00
|
|
|
private final ChunkPos pos;
|
2024-04-24 18:15:59 +02:00
|
|
|
@@ -455,6 +456,23 @@ public class RegionFile implements AutoCloseable {
|
2024-01-23 15:43:48 +01:00
|
|
|
super.write(RegionFile.this.version.getId());
|
2022-02-05 20:47:11 +01:00
|
|
|
this.pos = chunkcoordintpair;
|
|
|
|
}
|
|
|
|
+ // Paper start - don't write garbage data to disk if writing serialization fails
|
|
|
|
+ @Override
|
|
|
|
+ public void write(final int b) {
|
2022-08-10 17:07:49 +02:00
|
|
|
+ if (this.count > MAX_CHUNK_SIZE) {
|
2022-02-05 20:47:11 +01:00
|
|
|
+ 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) {
|
2022-08-10 17:07:49 +02:00
|
|
|
+ if (this.count + len > MAX_CHUNK_SIZE) {
|
2022-02-05 20:47:11 +01:00
|
|
|
+ throw new RegionFileStorage.RegionFileSizeException("Region file too large: " + (this.count + len));
|
|
|
|
+ }
|
|
|
|
+ super.write(b, off, len);
|
|
|
|
+ }
|
2024-01-18 22:00:40 +01:00
|
|
|
+ // Paper end - don't write garbage data to disk if writing serialization fails
|
2024-01-23 15:43:48 +01:00
|
|
|
|
2022-02-05 20:47:11 +01:00
|
|
|
public void close() throws IOException {
|
|
|
|
ByteBuffer bytebuffer = ByteBuffer.wrap(this.buf, 0, this.count);
|
2021-12-19 18:15:22 +01:00
|
|
|
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
|
2024-04-24 18:15:59 +02:00
|
|
|
index 9748b798f55ee0cbfdce1a2b2c48700623ef17a5..c4eef3aade889c69cefd873bec2d031cc54103ea 100644
|
2021-12-19 18:15:22 +01:00
|
|
|
--- a/src/main/java/net/minecraft/world/level/chunk/storage/RegionFileStorage.java
|
|
|
|
+++ b/src/main/java/net/minecraft/world/level/chunk/storage/RegionFileStorage.java
|
2024-04-24 18:15:59 +02:00
|
|
|
@@ -147,10 +147,17 @@ public class RegionFileStorage implements AutoCloseable {
|
2024-01-23 15:43:48 +01:00
|
|
|
|
|
|
|
try {
|
2021-12-19 18:15:22 +01:00
|
|
|
NbtIo.write(nbt, (DataOutput) dataoutputstream);
|
2024-01-21 12:53:04 +01:00
|
|
|
+ // Paper start - don't write garbage data to disk if writing serialization fails
|
2024-01-23 15:43:48 +01:00
|
|
|
+ dataoutputstream.close(); // Only write if successful
|
|
|
|
+ } catch (final RegionFileSizeException e) {
|
2022-02-05 20:47:11 +01:00
|
|
|
+ attempts = 5; // Don't retry
|
|
|
|
+ regionfile.clear(pos);
|
|
|
|
+ throw e;
|
|
|
|
+ // Paper end - don't write garbage data to disk if writing serialization fails
|
2021-12-19 18:15:22 +01:00
|
|
|
} 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);
|
|
|
|
}
|
2024-04-24 18:15:59 +02:00
|
|
|
@@ -158,10 +165,7 @@ public class RegionFileStorage implements AutoCloseable {
|
2021-12-19 18:15:22 +01:00
|
|
|
|
|
|
|
throw throwable;
|
|
|
|
}
|
|
|
|
-
|
|
|
|
- if (dataoutputstream != null) {
|
|
|
|
- dataoutputstream.close();
|
|
|
|
- }
|
2024-01-18 22:00:40 +01:00
|
|
|
+ // Paper - don't write garbage data to disk if writing serialization fails; move into try block to only write if successfully serialized
|
2021-12-19 18:15:22 +01:00
|
|
|
}
|
2024-01-23 14:34:17 +01:00
|
|
|
// Paper start - Chunk save reattempt
|
2024-01-24 13:07:40 +01:00
|
|
|
return;
|
2024-04-24 18:15:59 +02:00
|
|
|
@@ -204,4 +208,13 @@ public class RegionFileStorage implements AutoCloseable {
|
2022-02-05 20:47:11 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
+
|
2024-01-18 22:00:40 +01:00
|
|
|
+ // Paper start - don't write garbage data to disk if writing serialization fails
|
2022-02-05 20:47:11 +01:00
|
|
|
+ public static final class RegionFileSizeException extends RuntimeException {
|
|
|
|
+
|
|
|
|
+ public RegionFileSizeException(String message) {
|
|
|
|
+ super(message);
|
|
|
|
+ }
|
|
|
|
+ }
|
2024-01-18 22:00:40 +01:00
|
|
|
+ // Paper end - don't write garbage data to disk if writing serialization fails
|
2022-02-05 20:47:11 +01:00
|
|
|
}
|