Tags
Creators
Details
2.2.2
Compatibility
Changes
MC Data Bridge - Release Notes (v2.2.2)
Overview
Version 2.2.2 is a major release introducing enterprise-grade concurrency, integrity, and performance protections derived from an architectural security audit. Features include monotonic distributed lock fencing tokens, normalized snapshot SHA-256 integrity validation, single-transaction atomic saves, event-driven lock release messaging to eliminate pre-login latency, standard HMAC-SHA256 identity hashing, and automated unit testing in CI.
Key Changes
🔒 Monotonic Distributed Lock Fencing Tokens (#41, AUDIT §2)
- Epoch Fencing Protection: Added
lock_version(BIGINT DEFAULT 0) toplayer_data. Every lock acquisition incrementslock_version, producing a monotonic fencing token. - Stale Write Prevention: Saves, heartbeats, and lock releases evaluate
WHERE uuid = ? AND locking_server = ? AND lock_version = ?. Delayed servers or un-fenced post-GC pause writes are automatically rejected, protecting database state from stale session overwrites.
🛡️ Normalized Data Integrity Checksums (#42, AUDIT §3)
- Normalized SHA-256 Checksum Verification: Added
snapshot_checksum(VARCHAR(64)) toplayer_data. - Snapshot Integrity Verification: Computes canonical SHA-256 hashes across health, food, XP, NBT blobs (inventory, armor, ender chest, PDC), and game mode salted with
security.seed. Protects against database tampering across normalized component tables.
⚡ Atomic Single-Transaction Persistence & Migration (#44, #45, AUDIT §5, §6)
- Single-Transaction Component Saves & Releases (#44):
saveAndReleaseLockComponentsnow executes all component writes (databridge_inventories,statistics,metadata,companions,maps) and lock releases within a single database connection and transaction (setAutoCommit(false)...commit()). - Transactional Legacy Migration (#45):
loadLegacyDataexecutes component migration and legacydata = NULLclearing inside a unified transaction with automatic rollback (rollback()) on failure to eliminate dual-source-of-truth conditions.
⚡ Event-Driven Lock Release Messaging — 🚀 Up to 10X Faster Server Switching (#46, AUDIT §9)
- ⚡ Up to 10X Faster Cross-Server Transfers: Dispatches an instant
LockReleasedplugin message upon source server save completion. Destination servers wake up waiting pre-login threads immediately, slashing server-switch lock wait latency from ~500ms down to a near-instant ~50ms! - Resilient Fallback: Retains 500ms database polling loops as a zero-downtime fallback mechanism if network messages are dropped.
🔐 Keyed HMAC-SHA256 Identity Verification (#47, AUDIT §12)
- Standard HMAC-SHA256: Upgraded identity hashing in
HashUtilsto use standardHmacSHA256key derivation withsecurity.seed. - Seamless Dual Verification: Automatically verifies existing records against both HMAC-SHA256 and legacy salted SHA-256 digests for 100% backward compatibility without table migrations.
🧪 Automated CI Unit Testing & Concurrency Suite (#43, AUDIT §16)
- CI Test Automation: Re-enabled automated unit testing in GitHub Actions (
.github/workflows/maven.yml) on pull requests and merges. - Concurrency & HMAC Unit Tests: Added
LockFencingTestandHashUtilsTestverifying lock token increments, stale write rejections, HMAC generation, legacy fallback, and null safety.
📚 Documentation & Onboarding Overhaul
- Streamlined Platform Descriptions: Overhauled
README.md,DESCRIPTION.md, and Spigot/Modrinth listings with cleaner layouts and fast-start guides to improve reader onboarding. - Dedicated Technical Guides: Separated complex architectural concepts and database setup instructions into dedicated ARCHITECTURE.md and DATABASE_SETUP.md files for cleaner readability.
For installation instructions and configuration details, please refer to README.md, ARCHITECTURE.md, and DATABASE_SETUP.md.
Projects on Modrinth are automatically available through a Maven repository for use with JVM build tools such as Gradle. To learn more about the Modrinth Maven API, click here.
Note: When available, you should use the creator's maven repo instead as it will have transitive dependency information that the Modrinth Maven API does not. You may also end up with duplicate dependencies if you use a mix of Modrinth and non-Modrinth Maven repositories for your dependencies, because the group identifier will be different when served through the Modrinth Maven API.
Maven coordinates:
Version ID:
build.gradle:
repositories {
exclusiveContent {
forRepository {
maven {
name = "Modrinth"
url = "https://api.modrinth.com/maven"
}
}
// forRepositories(fg.repository) // Uncomment when using ForgeGradle
filter {
includeGroup "maven.modrinth"
}
}
}
// Standard Gradle dependency
dependencies {
implementation "maven.modrinth:oYE8njDp:CEr5IQDH"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:oYE8njDp:CEr5IQDH"
}

