Skip to content

Commit

Permalink
Fixed concurrect issues when saving dirty chunks
Browse files Browse the repository at this point in the history
  • Loading branch information
OmerBenGera committed Feb 25, 2022
1 parent 8d505cb commit 02fec2d
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 4 deletions.
Expand Up @@ -16,6 +16,7 @@
import com.bgsoftware.superiorskyblock.api.upgrades.Upgrade;
import com.bgsoftware.superiorskyblock.api.wrappers.SuperiorPlayer;
import com.bgsoftware.superiorskyblock.utils.LocationUtils;
import com.bgsoftware.superiorskyblock.world.chunks.ChunkPosition;
import com.bgsoftware.superiorskyblock.world.chunks.ChunksTracker;
import com.bgsoftware.superiorskyblock.database.serialization.IslandsSerializer;
import com.bgsoftware.superiorskyblock.utils.items.ItemUtils;
Expand Down Expand Up @@ -450,6 +451,12 @@ public static void saveDirtyChunks(Island island) {
new Pair<>("dirty_chunks", ChunksTracker.serialize(island)));
}

public static void saveDirtyChunks(Island island, Set<ChunkPosition> dirtyChunks) {
island.getDatabaseBridge().updateObject("islands",
createFilter("uuid", island),
new Pair<>("dirty_chunks", IslandsSerializer.serializeDirtyChunks(dirtyChunks)));
}

public static void saveBlockCounts(Island island) {
island.getDatabaseBridge().updateObject("islands",
createFilter("uuid", island),
Expand Down
Expand Up @@ -153,16 +153,20 @@ public static void markEmpty(Island island, ChunkPosition chunkPosition, boolean
if (island == null)
island = getIsland(plugin.getGrid(), chunkPosition);

if (dirtyChunks.containsKey(island) && dirtyChunks.get(island).remove(chunkPosition) && save)
IslandsDatabaseBridge.saveDirtyChunks(island);
Set<ChunkPosition> dirtyChunks = ChunksTracker.dirtyChunks.get(island);

if (dirtyChunks != null && dirtyChunks.remove(chunkPosition) && save)
IslandsDatabaseBridge.saveDirtyChunks(island, dirtyChunks);
}

public static void markDirty(Island island, ChunkPosition chunkPosition, boolean save) {
if (island == null)
island = getIsland(plugin.getGrid(), chunkPosition);

if (dirtyChunks.computeIfAbsent(island, s -> new HashSet<>()).add(chunkPosition) && save && !island.isSpawn())
IslandsDatabaseBridge.saveDirtyChunks(island);
Set<ChunkPosition> dirtyChunks = ChunksTracker.dirtyChunks.computeIfAbsent(island, s -> new HashSet<>());

if (dirtyChunks.add(chunkPosition) && save && !island.isSpawn())
IslandsDatabaseBridge.saveDirtyChunks(island, dirtyChunks);
}

}

0 comments on commit 02fec2d

Please sign in to comment.