From d2ffe1fe0e7297479828d0e0554af675c5b0ffc5 Mon Sep 17 00:00:00 2001 From: OLEGSHA Date: Sun, 29 Aug 2021 12:04:02 +0300 Subject: [PATCH] Fixed the bug that opfromthestart found, reloading now works --- .../progressia/test/region/Region.java | 8 ++- .../test/region/TestWorldDiskIO.java | 60 ++++++++++--------- src/main/resources/log4j2.xml | 5 +- 3 files changed, 40 insertions(+), 33 deletions(-) diff --git a/src/main/java/ru/windcorp/progressia/test/region/Region.java b/src/main/java/ru/windcorp/progressia/test/region/Region.java index 7afd862..251f36e 100644 --- a/src/main/java/ru/windcorp/progressia/test/region/Region.java +++ b/src/main/java/ru/windcorp/progressia/test/region/Region.java @@ -50,8 +50,10 @@ public class Region { // 1 MiB private static final int MAX_CHUNK_SIZE = 1024 * 1024; private static final int SECTOR_SIZE = MAX_CHUNK_SIZE / 256; + + private static final int DEFINITION_SIZE = Integer.BYTES + 1; - private static final int HEADER_SIZE = Integer.BYTES * REGION_DIAMETER * REGION_DIAMETER * REGION_DIAMETER; + private static final int HEADER_SIZE = DEFINITION_SIZE * REGION_DIAMETER * REGION_DIAMETER * REGION_DIAMETER; private final RandomAccessFile file; @@ -151,7 +153,7 @@ public class Region { public void save(DefaultChunkData chunk, Server server) throws IOException { Vec3i pos = TestWorldDiskIO.getInRegionCoords(chunk.getPosition()); - int definitionOffset = Integer.BYTES * (pos.z + REGION_DIAMETER * (pos.y + REGION_DIAMETER * pos.x)); + int definitionOffset = DEFINITION_SIZE * (pos.z + REGION_DIAMETER * (pos.y + REGION_DIAMETER * pos.x)); if (!hasOffset(pos)) { allocateChunk(definitionOffset, pos); @@ -182,7 +184,7 @@ public class Region { file.seek(HEADER_SIZE + SECTOR_SIZE * dataOffset); file.write(buffer); - file.seek(definitionOffset + Integer.BYTES - 1); + file.seek(definitionOffset + Integer.BYTES); int sectors = buffer.length / SECTOR_SIZE + 1; file.write(sectors); diff --git a/src/main/java/ru/windcorp/progressia/test/region/TestWorldDiskIO.java b/src/main/java/ru/windcorp/progressia/test/region/TestWorldDiskIO.java index da0da50..f8b015f 100644 --- a/src/main/java/ru/windcorp/progressia/test/region/TestWorldDiskIO.java +++ b/src/main/java/ru/windcorp/progressia/test/region/TestWorldDiskIO.java @@ -55,7 +55,7 @@ public class TestWorldDiskIO implements WorldContainer { return Coordinates.convertGlobalToInCell(BITS_IN_CHUNK_COORDS, chunkCoords, null); } - static final Logger LOG = LogManager.getLogger(); + static final Logger LOG = LogManager.getLogger("TestWorldDiskIO"); private final Path path; private final ChunkMap regions = ChunkMaps.newHashMap(); @@ -74,6 +74,7 @@ public class TestWorldDiskIO implements WorldContainer { Region region = getRegion(chunkPos, false); if (region == null) { + debug("Could not load chunk {} {} {}: region did not load", chunkPos); return null; } @@ -81,12 +82,7 @@ public class TestWorldDiskIO implements WorldContainer { return result; } catch (IOException | DecodingException e) { - LOG.warn( - "Failed to load chunk {} {} {}", - chunkPos.x, - chunkPos.y, - chunkPos.z - ); + warn("Failed to load chunk {} {} {}", chunkPos); e.printStackTrace(); return null; } @@ -99,22 +95,11 @@ public class TestWorldDiskIO implements WorldContainer { } try { - LOG.debug( - "Saving {} {} {}", - chunk.getPosition().x, - chunk.getPosition().y, - chunk.getPosition().z - ); - + debug("Saving chunk {} {} {}", chunk.getPosition()); Region region = getRegion(chunk.getPosition(), true); region.save(chunk, server); } catch (IOException e) { - LOG.warn( - "Failed to save chunk {} {} {}", - chunk.getPosition().x, - chunk.getPosition().y, - chunk.getPosition().z - ); + warn("Failed to save chunk {} {} {}", chunk.getPosition()); e.printStackTrace(); } } @@ -128,21 +113,17 @@ public class TestWorldDiskIO implements WorldContainer { Region region = regions.get(regionCoords); if (region == null) { + debug("Region {} {} {} is not loaded, loading", regionCoords); - Path path = getPath().resolve( - String.format( - FILE_NAME_FORMAT, - regionCoords.x, - regionCoords.y, - regionCoords.z - ) - ); + Path path = getRegionPath(regionCoords); - if (!Files.exists(path) && !createIfMissing) { + if (!createIfMissing && !Files.exists(path)) { + debug("Region {} {} {} does not exist on disk, aborting load", regionCoords); return null; } region = openRegion(path, regionCoords); + debug("Region {} {} {} loaded", regionCoords); } return region; @@ -170,6 +151,17 @@ public class TestWorldDiskIO implements WorldContainer { public Path getPath() { return path; } + + private Path getRegionPath(Vec3i regionPos) { + return getPath().resolve( + String.format( + FILE_NAME_FORMAT, + regionPos.x, + regionPos.y, + regionPos.z + ) + ); + } @Override public void close() { @@ -181,5 +173,15 @@ public class TestWorldDiskIO implements WorldContainer { CrashReports.report(e, "Could not close region files"); } } + + private static void debug(String message, Vec3i vector) { + if (LOG.isDebugEnabled()) { + LOG.debug(message, vector.x, vector.y, vector.z); + } + } + + private static void warn(String message, Vec3i vector) { + LOG.warn(message, vector.x, vector.y, vector.z); + } } diff --git a/src/main/resources/log4j2.xml b/src/main/resources/log4j2.xml index b249e72..68d804f 100644 --- a/src/main/resources/log4j2.xml +++ b/src/main/resources/log4j2.xml @@ -26,7 +26,10 @@ --> - + +