Implement safe 26.3 Age unload, reseed, and retirement lifecycle #101

Open
opened 2026-10-27 00:05:41 -04:00 by dnorberg · 1 comment
Owner

Part of #96. Complete the first-party backend lifecycle needed by existing commands and books. The 26.3 target can use fresh saves but must preserve its own Age data across unload/reload and restart.

Acceptance criteria:

  • Refuse unsafe unload/retirement while players occupy an Age, and handle other entities safely.
  • Flush chunk writes and preserve Age data on unload/reload.
  • Reseed changes future chunks without rewriting existing chunks.
  • Retirement archives or removes only the exact targeted Age data and prevents its old books from recreating it.
  • Repeated load/unload cycles do not leak stale levels, tickets, or client registry entries.
Part of #96. Complete the first-party backend lifecycle needed by existing commands and books. The 26.3 target can use fresh saves but must preserve its own Age data across unload/reload and restart. Acceptance criteria: - Refuse unsafe unload/retirement while players occupy an Age, and handle other entities safely. - Flush chunk writes and preserve Age data on unload/reload. - Reseed changes future chunks without rewriting existing chunks. - Retirement archives or removes only the exact targeted Age data and prevents its old books from recreating it. - Repeated load/unload cycles do not leak stale levels, tickets, or client registry entries.
dnorberg added this to the Dual-version support milestone 2026-10-27 00:05:41 -04:00
Author
Owner

26.3 lifecycle progress (prototype, issue remains open): added operator-only unload/reload/reseed/retire. Unload refuses players, performs full chunk/entity save, deactivates tickets before close, and reactivates persisted/NeoForge forced tickets on load. Dedicated-server test: origin chunks retained fingerprint 2898472 after reseed 24680→13579; new chunks matched fresh 13579 control (2897795) rather than old-seed control (2863099). After restart the new seed and old origin chunks persisted. Forced chunk and armor-stand UUID persisted through repeated unload/reload and restart. An occupied Age could not unload. Retirement moved only the selected Age directory to world-retired-ages, tombstoned the ID before the move, and rejected recreation after restart. Ten successive cycles completed; open FDs remained 218 before/after (smoke check only). Both 1.21.1 and 26.3 builds pass. Remaining: normal book/definition integration, long-running leak and interruption/recovery validation. See docs/MINECRAFT_26_3_PORT.md. No release/JAR enabled.

26.3 lifecycle progress (prototype, issue remains open): added operator-only unload/reload/reseed/retire. Unload refuses players, performs full chunk/entity save, deactivates tickets before close, and reactivates persisted/NeoForge forced tickets on load. Dedicated-server test: origin chunks retained fingerprint 2898472 after reseed 24680→13579; new chunks matched fresh 13579 control (2897795) rather than old-seed control (2863099). After restart the new seed and old origin chunks persisted. Forced chunk and armor-stand UUID persisted through repeated unload/reload and restart. An occupied Age could not unload. Retirement moved only the selected Age directory to world-retired-ages, tombstoned the ID before the move, and rejected recreation after restart. Ten successive cycles completed; open FDs remained 218 before/after (smoke check only). Both 1.21.1 and 26.3 builds pass. Remaining: normal book/definition integration, long-running leak and interruption/recovery validation. See docs/MINECRAFT_26_3_PORT.md. No release/JAR enabled.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: dnorberg/rivencraft#101