Kind of un-race-conditioned chunk saving

This commit is contained in:
DBotThePony 2024-04-26 01:20:13 +07:00
parent 2e5214ef12
commit 6ffa54fb27
Signed by: DBot
GPG Key ID: DCC23B5715498507
4 changed files with 55 additions and 39 deletions

View File

@ -111,7 +111,14 @@ sealed class LegacyWorldStorage() : WorldStorage() {
}, Starbound.EXECUTOR)
}
override fun saveEntities(pos: ChunkPos, data: Collection<AbstractEntity>): Boolean {
override fun saveEntities(pos: ChunkPos, data: Collection<AbstractEntity>, now: Boolean): Boolean {
if (now) {
val chunkX = pos.x
val chunkY = pos.y
val key = ByteKey(2, (chunkX shr 8).toByte(), chunkX.toByte(), (chunkY shr 8).toByte(), chunkY.toByte())
write(key, writeEntities(data))
} else {
Starbound.EXECUTOR.execute {
val chunkX = pos.x
val chunkY = pos.y
@ -119,12 +126,12 @@ sealed class LegacyWorldStorage() : WorldStorage() {
write(key, writeEntities(data))
}
}
return true
}
override fun saveCells(pos: ChunkPos, data: Object2DArray<out AbstractCell>, state: ChunkState): Boolean {
Starbound.EXECUTOR.execute {
private fun saveCells0(pos: ChunkPos, data: Object2DArray<out AbstractCell>, state: ChunkState) {
val buff = FastByteArrayOutputStream()
val stream = DataOutputStream(BufferedOutputStream(DeflaterOutputStream(buff)))
@ -154,6 +161,15 @@ sealed class LegacyWorldStorage() : WorldStorage() {
write(key, buff.array.copyOf(buff.length))
}
override fun saveCells(pos: ChunkPos, data: Object2DArray<out AbstractCell>, state: ChunkState, now: Boolean): Boolean {
if (now) {
saveCells0(pos, data, state)
} else {
Starbound.EXECUTOR.execute {
saveCells0(pos, data, state)
}
}
return true
}

View File

@ -23,12 +23,12 @@ class NativeWorldStorage() : WorldStorage() {
TODO("Not yet implemented")
}
override fun saveEntities(pos: ChunkPos, data: Collection<AbstractEntity>): Boolean {
return super.saveEntities(pos, data)
override fun saveEntities(pos: ChunkPos, data: Collection<AbstractEntity>, now: Boolean): Boolean {
return super.saveEntities(pos, data, now)
}
override fun saveCells(pos: ChunkPos, data: Object2DArray<out AbstractCell>, state: ChunkState): Boolean {
return super.saveCells(pos, data, state)
override fun saveCells(pos: ChunkPos, data: Object2DArray<out AbstractCell>, state: ChunkState, now: Boolean): Boolean {
return super.saveCells(pos, data, state, now)
}
override fun saveMetadata(data: Metadata): Boolean {

View File

@ -546,7 +546,7 @@ class ServerChunk(world: ServerWorld, pos: ChunkPos) : Chunk<ServerWorld, Server
}
}
private fun writeToStorage(): Collection<AbstractEntity> {
private fun writeToStorage(now: Boolean = false): Collection<AbstractEntity> {
if (!cells.isInitialized() || state <= ChunkState.EMPTY)
return emptyList()
@ -555,8 +555,8 @@ class ServerChunk(world: ServerWorld, pos: ChunkPos) : Chunk<ServerWorld, Server
aabbd,
filter = Predicate { it.isPersistent && !it.isRemote && aabbd.isInside(it.position) })
world.storage.saveCells(pos, copyCells(), state)
world.storage.saveEntities(pos, unloadable)
world.storage.saveCells(pos, copyCells(), state, now)
world.storage.saveEntities(pos, unloadable, now)
return unloadable
}
@ -580,7 +580,7 @@ class ServerChunk(world: ServerWorld, pos: ChunkPos) : Chunk<ServerWorld, Server
world.chunkMap.remove(pos)
flushTask.cancel(false)
writeToStorage().forEach {
writeToStorage(true).forEach {
it.remove(AbstractEntity.RemovalReason.UNLOADED)
}
}

View File

@ -79,11 +79,11 @@ abstract class WorldStorage : Closeable {
return buff.array.copyOf(buff.length)
}
open fun saveEntities(pos: ChunkPos, data: Collection<AbstractEntity>): Boolean {
open fun saveEntities(pos: ChunkPos, data: Collection<AbstractEntity>, now: Boolean = false): Boolean {
return false
}
open fun saveCells(pos: ChunkPos, data: Object2DArray<out AbstractCell>, state: ChunkState): Boolean {
open fun saveCells(pos: ChunkPos, data: Object2DArray<out AbstractCell>, state: ChunkState, now: Boolean = false): Boolean {
return false
}
@ -148,12 +148,12 @@ abstract class WorldStorage : Closeable {
return chainOptionalFutures(children) { it.loadMetadata() }
}
override fun saveEntities(pos: ChunkPos, data: Collection<AbstractEntity>): Boolean {
return children.any { it.saveEntities(pos, data) }
override fun saveEntities(pos: ChunkPos, data: Collection<AbstractEntity>, now: Boolean): Boolean {
return children.any { it.saveEntities(pos, data, now) }
}
override fun saveCells(pos: ChunkPos, data: Object2DArray<out AbstractCell>, state: ChunkState): Boolean {
return children.any { it.saveCells(pos, data, state) }
override fun saveCells(pos: ChunkPos, data: Object2DArray<out AbstractCell>, state: ChunkState, now: Boolean): Boolean {
return children.any { it.saveCells(pos, data, state, now) }
}
override fun saveMetadata(data: Metadata): Boolean {