Skip to content

Commit 635de09

Browse files
committed
hotfix: prevent chunk data loss when a single block fails to save
1 parent a40e9c2 commit 635de09

File tree

2 files changed

+24
-22
lines changed

2 files changed

+24
-22
lines changed

rebar/src/main/kotlin/io/github/pylonmc/rebar/block/BlockStorage.kt

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -519,7 +519,7 @@ object BlockStorage : Listener {
519519
}
520520

521521
private fun save(chunk: Chunk, chunkBlocks: MutableList<RebarBlock>) {
522-
val serializedBlocks = chunkBlocks.map {
522+
val serializedBlocks = chunkBlocks.mapNotNull {
523523
RebarBlock.serialize(it, chunk.persistentDataContainer.adapterContext)
524524
}
525525

@@ -598,11 +598,9 @@ object BlockStorage : Listener {
598598
null
599599
} else if (block.schema.key.isFromAddon(addon)) {
600600
RebarBlockSchema.schemaCache[block.block.position] = PhantomBlock.schema
601-
PhantomBlock(
602-
RebarBlock.serialize(block, block.block.chunk.persistentDataContainer.adapterContext),
603-
block.schema.key,
604-
block.block
605-
)
601+
RebarBlock.serialize(block, block.block.chunk.persistentDataContainer.adapterContext)?.let { pdc ->
602+
PhantomBlock(pdc, block.schema.key, block.block)
603+
}
606604
} else {
607605
null
608606
}
@@ -632,17 +630,15 @@ object BlockStorage : Listener {
632630
internal fun makePhantom(block: RebarBlock) = lockBlockWrite {
633631
BlockCullingEngine.remove(block)
634632
RebarBlockSchema.schemaCache[block.block.position] = PhantomBlock.schema
635-
val phantomBlock = PhantomBlock(
636-
RebarBlock.serialize(block, block.block.chunk.persistentDataContainer.adapterContext),
637-
block.schema.key,
638-
block.block
639-
)
633+
val pdc = RebarBlock.serialize(block, block.block.chunk.persistentDataContainer.adapterContext) ?: return
634+
val phantomBlock = PhantomBlock(pdc, block.schema.key, block.block)
640635

641636
blocks.replace(block.block.position, block, phantomBlock)
642637
blocksByKey[block.key]!!.remove(block)
643638
blocksByKey.computeIfAbsent(phantomBlock.key) { mutableListOf() }.add(phantomBlock)
644639
blocksByChunk[block.block.chunk.position]!!.remove(block)
645640
blocksByChunk[phantomBlock.block.chunk.position]!!.add(phantomBlock)
641+
Unit
646642
}
647643

648644
@JvmSynthetic

rebar/src/main/kotlin/io/github/pylonmc/rebar/block/RebarBlock.kt

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -355,20 +355,26 @@ open class RebarBlock private constructor(val block: Block) : Keyed {
355355
internal fun serialize(
356356
block: RebarBlock,
357357
context: PersistentDataAdapterContext
358-
): PersistentDataContainer {
359-
// See PhantomBlock docs for why we do this
360-
if (block is PhantomBlock) {
361-
return block.pdc
362-
}
358+
): PersistentDataContainer? {
359+
return try {
360+
// See PhantomBlock docs for why we do this
361+
if (block is PhantomBlock) {
362+
return block.pdc
363+
}
363364

364-
val pdc = context.newPersistentDataContainer()
365-
pdc.set(rebarBlockKeyKey, RebarSerializers.NAMESPACED_KEY, block.schema.key)
366-
pdc.set(rebarBlockPositionKey, RebarSerializers.LONG, block.block.position.asLong)
365+
val pdc = context.newPersistentDataContainer()
366+
pdc.set(rebarBlockKeyKey, RebarSerializers.NAMESPACED_KEY, block.schema.key)
367+
pdc.set(rebarBlockPositionKey, RebarSerializers.LONG, block.block.position.asLong)
367368

368-
block.write(pdc)
369-
RebarBlockSerializeEvent(block.block, block, pdc, false).callEvent()
369+
block.write(pdc)
370+
RebarBlockSerializeEvent(block.block, block, pdc, false).callEvent()
370371

371-
return pdc
372+
pdc
373+
} catch (e: Exception) {
374+
Rebar.logger.severe { "Failed to save block at ${block.block.location} of type ${block.key}" }
375+
e.printStackTrace()
376+
null
377+
}
372378
}
373379

374380
@JvmSynthetic

0 commit comments

Comments
 (0)