730882fca9
Chunk system patch was refactored to take advantage of newer ConcurrentUtil's concurrent long hash table (which fixes hash collisions caused by chaining fastutil's long hash and CHM's hash) plus some other minor improvements. The chunk system was also merged with Starlight, which mostly provides a small improvement to ThreadedLevelLightEngine#checkBlock as the scheduling was rewritten.
95 Zeilen
4.5 KiB
Diff
95 Zeilen
4.5 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 12b7d50f49a2184aaf220a4a50a137b217c57124..f1237f6fd6414900ffbad0caee31aa83310eeef4 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
|
|
@@ -442,6 +442,7 @@ 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
|
|
private class ChunkBuffer extends ByteArrayOutputStream {
|
|
|
|
private final ChunkPos pos;
|
|
@@ -455,6 +456,23 @@ public class RegionFile implements AutoCloseable {
|
|
super.write(RegionFile.this.version.getId());
|
|
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 - don't write garbage data to disk if writing serialization fails
|
|
|
|
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 491035aaefff4ee96435ec5d3f9417e28eae0796..4c1212c6ef48594e766fa9e35a6e15916602d587 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
|
|
@@ -147,10 +147,17 @@ public final class RegionFileStorage implements AutoCloseable {
|
|
|
|
try {
|
|
NbtIo.write(nbt, (DataOutput) dataoutputstream);
|
|
+ // Paper start - don't write garbage data to disk if writing serialization fails
|
|
+ dataoutputstream.close(); // Only write if successful
|
|
+ } catch (final 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);
|
|
}
|
|
@@ -158,10 +165,7 @@ public final class RegionFileStorage implements AutoCloseable {
|
|
|
|
throw throwable;
|
|
}
|
|
-
|
|
- if (dataoutputstream != null) {
|
|
- dataoutputstream.close();
|
|
- }
|
|
+ // Paper - don't write garbage data to disk if writing serialization fails; move into try block to only write if successfully serialized
|
|
}
|
|
// Paper start - Chunk save reattempt
|
|
return;
|
|
@@ -208,4 +212,13 @@ public final class RegionFileStorage implements AutoCloseable {
|
|
public RegionStorageInfo info() {
|
|
return this.info;
|
|
}
|
|
+
|
|
+ // Paper start - don't write garbage data to disk if writing serialization fails
|
|
+ public static final class RegionFileSizeException extends RuntimeException {
|
|
+
|
|
+ public RegionFileSizeException(String message) {
|
|
+ super(message);
|
|
+ }
|
|
+ }
|
|
+ // Paper end - don't write garbage data to disk if writing serialization fails
|
|
}
|