Skip to content

Updating native lib to LMDB 1.0.1 line with new API support - #202

Merged
CoreyKaylor merged 1 commit into
mainfrom
lmdbv1
Aug 8, 2026
Merged

Updating native lib to LMDB 1.0.1 line with new API support#202
CoreyKaylor merged 1 commit into
mainfrom
lmdbv1

Conversation

@CoreyKaylor

Copy link
Copy Markdown
Owner

This updates the bundled native binaries to the LMDB 1.0 series and binds the new APIs. Opening this up for comments before shipping — it's published as 0.23.0-alpha for the reasons below.

⚠️ Breaking: the 1.0 on-disk format is incompatible with 0.9.x. Existing databases must be migrated once via mdb_dump (0.9 tools) → mdb_load (1.0 tools). DBI names are also stored NUL-terminated now.

What's new

  • Opt-in page encryption and checksums. LMDB ships no cipher; the library includes hardware-accelerated AES-256-GCM (AesGcmCipher) and SHA-256 (Sha256Checksum), with LightningCipher/LightningChecksum base classes for custom implementations.
  • Two-phase commit: tx.Prepare() + env.RollbackLastTransaction(txId).
  • Incremental backup: IncrementalCopyTo / IncrementalCopyToStream / LoadIncrementalFromStream.
  • EnvironmentConfiguration.PageSize, EnvironmentOpenFlags.PreviousSnapshot, per-transaction NoSync/NoMetaSync, and the new 1.0 error codes.

Why alpha

  • The LMDB_1.0.0 release tag doesn't compile for Windows and is missing ~20 post-release fixes to exactly the features bound here (ITS#10515, ITS#10518–10523). Binaries are built from a pinned mdb.master3 commit (7ed58053d0, self-reports 0.9.90) plus a small local mingw patch (lmdb/mingw-win32-fixes.patch). Will re-pin to the release tag and drop the patch when upstream cuts 1.0.1.
  • Upstream quirk found while testing: after mdb_env_rollback the environment can't be reopened unless a write commits first — documented on RollbackLastTransaction and covered by a test.

Feedback welcome, particularly on the encryption API shape before it stabilizes.

@github-actions

github-actionsBot commented Jul 5, 2026

Copy link
Copy Markdown

Benchmark Results

No significant performance regressions detected

⚠️ Minor performance degradation (20-40%)

1 benchmarks showed minor slowdown

All results (174 benchmarks)
BenchmarkBaselineCurrentChange
ComparerReadBenchmarks.Read(OpsPerTransaction: 100, ValueSize: 64, Comparer: Length)10585.04ns12894.20ns⚠️ +21.8%
CursorIterationBenchmarks.EnumerateBoxed(Entries: 1000, ValueSize: 256)9797.89ns11304.02ns✅ +15.4%
ComparerWriteBenchmarks.Write(OpsPerTransaction: 1000, ValueSize: 256, Comparer: ReverseGuid)27189.50ns31112.02ns✅ +14.4%
ComparerWriteBenchmarks.Write(OpsPerTransaction: 1000, ValueSize: 256, Comparer: ReverseBitwise)27086.41ns30967.33ns✅ +14.3%
ComparerWriteBenchmarks.Write(OpsPerTransaction: 1000, ValueSize: 256, Comparer: ReverseUtf8String)27041.69ns30603.31ns✅ +13.2%
ComparerWriteBenchmarks.Write(OpsPerTransaction: 1000, ValueSize: 256, Comparer: ReverseLength)28459.92ns31614.16ns✅ +11.1%
IntegerComparerBenchmarks.WriteIntegers(KeySize: 4, OpsPerTransaction: 10000, Comparer: ReverseSignedInt)1622648.92ns1796629.87ns✅ +10.7%
GuidComparerBenchmarks.WriteGuids(OpsPerTransaction: 1000, Comparer: Guid)508729.37ns557267.31ns✅ +9.5%
CursorIterationBenchmarks.EnumerateForeach(Entries: 1000, ValueSize: 8)8910.74ns9698.51ns✅ +8.8%
CursorIterationBenchmarks.EnumerateBoxed(Entries: 1000, ValueSize: 8)8934.68ns9643.71ns✅ +7.9%
ComparerWriteBenchmarks.Write(OpsPerTransaction: 1000, ValueSize: 256, Comparer: ReverseSignedInt)174691.04ns188010.50ns✅ +7.6%
IntegerComparerBenchmarks.WriteIntegers(KeySize: 4, OpsPerTransaction: 10000, Comparer: ReverseUnsignedInt)1699744.63ns1821963.95ns✅ +7.2%
ReadBenchmarks.Read(OpsPerTransaction: 100, ValueSize: 256, KeyOrder: Sequential)6897.78ns7362.05ns✅ +6.7%
IntegerComparerBenchmarks.WriteIntegers(KeySize: 4, OpsPerTransaction: 1000, Comparer: SignedInt)445724.50ns475017.02ns✅ +6.6%
ComparerReadBenchmarks.Read(OpsPerTransaction: 100, ValueSize: 256, Comparer: Default)6969.59ns7416.67ns✅ +6.4%
ComparerWriteBenchmarks.Write(OpsPerTransaction: 1000, ValueSize: 256, Comparer: LengthOnly)274901.94ns292187.15ns✅ +6.3%
ComparerReadBenchmarks.Read(OpsPerTransaction: 100, ValueSize: 64, Comparer: Default)6735.97ns7157.07ns✅ +6.3%
IntegerComparerBenchmarks.WriteIntegers(KeySize: 4, OpsPerTransaction: 1000, Comparer: UnsignedInt)453012.30ns480547.18ns✅ +6.1%
ReadBenchmarks.Read(OpsPerTransaction: 1, ValueSize: 8, KeyOrder: Sequential)196.35ns208.08ns✅ +6.0%
ComparerWriteBenchmarks.Write(OpsPerTransaction: 1000, ValueSize: 256, Comparer: ReverseUnsignedInt)168704.33ns178633.51ns✅ +5.9%
IntegerComparerBenchmarks.WriteIntegers(KeySize: 8, OpsPerTransaction: 10000, Comparer: ReverseSignedInt)1574193.64ns1662986.67ns✅ +5.6%
ComparerReadBenchmarks.Read(OpsPerTransaction: 100, ValueSize: 64, Comparer: Bitwise)10526.47ns11115.85ns✅ +5.6%
GuidComparerBenchmarks.WriteGuids(OpsPerTransaction: 10000, Comparer: ReverseGuid)2739640.90ns2888255.00ns✅ +5.4%
ComparerReadBenchmarks.Read(OpsPerTransaction: 100, ValueSize: 64, Comparer: UnsignedInt)10067.11ns10609.81ns✅ +5.4%
GuidComparerBenchmarks.WriteGuids(OpsPerTransaction: 10000, Comparer: Guid)2665917.24ns2806891.77ns✅ +5.3%
ComparerWriteBenchmarks.Write(OpsPerTransaction: 100, ValueSize: 256, Comparer: ReverseUtf8String)242819.38ns255361.94ns✅ +5.2%
ComparerReadBenchmarks.Read(OpsPerTransaction: 100, ValueSize: 256, Comparer: ReverseGuid)11038.94ns11597.26ns✅ +5.1%
ReadBenchmarks.Read(OpsPerTransaction: 100, ValueSize: 64, KeyOrder: Sequential)6780.85ns7117.39ns✅ +5.0%
IntegerComparerBenchmarks.WriteIntegers(KeySize: 8, OpsPerTransaction: 10000, Comparer: Default)2023578.47ns2121562.08ns✅ +4.8%
CursorIterationBenchmarks.TryGetAllocating(Entries: 1000, ValueSize: 256)176520.15ns184982.26ns✅ +4.8%
ReadBenchmarks.Read(OpsPerTransaction: 1000, ValueSize: 256, KeyOrder: Sequential)110750.22ns116023.53ns✅ +4.8%
ComparerReadBenchmarks.Read(OpsPerTransaction: 100, ValueSize: 256, Comparer: ReverseBitwise)10710.61ns11188.66ns✅ +4.5%
ReadBenchmarks.Read(OpsPerTransaction: 1, ValueSize: 64, KeyOrder: Sequential)191.74ns199.94ns✅ +4.3%
ComparerReadBenchmarks.Read(OpsPerTransaction: 1000, ValueSize: 64, Comparer: Default)109620.38ns114196.88ns✅ +4.2%
ComparerReadBenchmarks.Read(OpsPerTransaction: 1000, ValueSize: 64, Comparer: LengthOnly)35148.37ns36593.89ns✅ +4.1%
IntegerComparerBenchmarks.WriteIntegers(KeySize: 4, OpsPerTransaction: 10000, Comparer: UnsignedInt)678255.97ns706110.07ns✅ +4.1%
IntegerComparerBenchmarks.WriteIntegers(KeySize: 8, OpsPerTransaction: 10000, Comparer: UnsignedInt)510994.66ns531978.71ns✅ +4.1%
IntegerComparerBenchmarks.WriteIntegers(KeySize: 8, OpsPerTransaction: 10000, Comparer: ReverseUnsignedInt)1586802.34ns1651514.93ns✅ +4.1%
ComparerReadBenchmarks.Read(OpsPerTransaction: 100, ValueSize: 64, Comparer: ReverseSignedInt)10202.02ns10602.42ns✅ +3.9%
ComparerReadBenchmarks.Read(OpsPerTransaction: 1000, ValueSize: 256, Comparer: Default)109645.52ns113875.81ns✅ +3.9%
ReadBenchmarks.Read(OpsPerTransaction: 1000, ValueSize: 8, KeyOrder: Sequential)112096.12ns116087.54ns✅ +3.6%
ComparerReadBenchmarks.Read(OpsPerTransaction: 100, ValueSize: 256, Comparer: ReverseSignedInt)10576.59ns10932.68ns✅ +3.4%
ComparerReadBenchmarks.Read(OpsPerTransaction: 100, ValueSize: 64, Comparer: Utf8String)10426.83ns10774.93ns✅ +3.3%
ComparerReadBenchmarks.Read(OpsPerTransaction: 1000, ValueSize: 256, Comparer: LengthOnly)35406.21ns36564.89ns✅ +3.3%
ReadBenchmarks.Read(OpsPerTransaction: 1000, ValueSize: 64, KeyOrder: Sequential)109491.67ns112985.10ns✅ +3.2%
ComparerReadBenchmarks.Read(OpsPerTransaction: 100, ValueSize: 64, Comparer: ReverseGuid)10661.45ns10982.88ns✅ +3.0%
ComparerReadBenchmarks.Read(OpsPerTransaction: 100, ValueSize: 256, Comparer: Length)10935.22ns11228.49ns✅ +2.7%
ComparerReadBenchmarks.Read(OpsPerTransaction: 100, ValueSize: 256, Comparer: ReverseLength)11036.15ns11330.88ns✅ +2.7%
ComparerReadBenchmarks.Read(OpsPerTransaction: 100, ValueSize: 256, Comparer: ReverseUtf8String)10871.14ns11159.75ns✅ +2.7%
ComparerReadBenchmarks.Read(OpsPerTransaction: 100, ValueSize: 64, Comparer: ReverseUtf8String)10524.18ns10793.17ns✅ +2.6%
ComparerReadBenchmarks.Read(OpsPerTransaction: 100, ValueSize: 256, Comparer: UnsignedInt)10562.45ns10817.87ns✅ +2.4%
ReadBenchmarks.Read(OpsPerTransaction: 100, ValueSize: 8, KeyOrder: Sequential)5378.77ns5506.46ns✅ +2.4%
WriteBenchmarks.Write(OpsPerTransaction: 100, ValueSize: 8, KeyOrder: Sequential)183690.92ns187956.88ns✅ +2.3%
ComparerReadBenchmarks.Read(OpsPerTransaction: 100, ValueSize: 256, Comparer: LengthOnly)3794.22ns3879.93ns✅ +2.3%
ComparerWriteBenchmarks.Write(OpsPerTransaction: 100, ValueSize: 256, Comparer: LengthOnly)184548.38ns188471.93ns✅ +2.1%
ComparerReadBenchmarks.Read(OpsPerTransaction: 1000, ValueSize: 256, Comparer: ReverseGuid)173495.04ns177108.09ns✅ +2.1%
WriteBenchmarks.Write(OpsPerTransaction: 1, ValueSize: 256, KeyOrder: Sequential)174549.36ns178149.48ns✅ +2.1%
ComparerReadBenchmarks.Read(OpsPerTransaction: 100, ValueSize: 64, Comparer: LengthOnly)3767.12ns3843.17ns✅ +2.0%
GuidComparerBenchmarks.WriteGuids(OpsPerTransaction: 1000, Comparer: Default)466440.95ns475760.33ns✅ +2.0%
ComparerWriteBenchmarks.Write(OpsPerTransaction: 1000, ValueSize: 64, Comparer: ReverseUtf8String)493449.01ns502794.42ns✅ +1.9%
ComparerReadBenchmarks.Read(OpsPerTransaction: 100, ValueSize: 256, Comparer: HashCode)22419.03ns22822.61ns✅ +1.8%
ComparerReadBenchmarks.Read(OpsPerTransaction: 100, ValueSize: 256, Comparer: Bitwise)10898.20ns11082.58ns✅ +1.7%
ComparerReadBenchmarks.Read(OpsPerTransaction: 1000, ValueSize: 64, Comparer: Utf8String)169238.89ns171934.55ns✅ +1.6%
ComparerReadBenchmarks.Read(OpsPerTransaction: 100, ValueSize: 64, Comparer: ReverseLength)10879.77ns11052.16ns✅ +1.6%
ComparerReadBenchmarks.Read(OpsPerTransaction: 1000, ValueSize: 64, Comparer: Bitwise)169384.24ns172036.11ns✅ +1.6%
GuidComparerBenchmarks.WriteGuids(OpsPerTransaction: 1000, Comparer: Bitwise)518758.27ns526061.96ns✅ +1.4%
GuidComparerBenchmarks.WriteGuids(OpsPerTransaction: 10000, Comparer: Bitwise)2951723.12ns2993022.04ns✅ +1.4%
IntegerComparerBenchmarks.WriteIntegers(KeySize: 4, OpsPerTransaction: 10000, Comparer: SignedInt)721067.10ns731155.34ns✅ +1.4%
CursorIterationBenchmarks.TryGetSpanDestination(Entries: 1000, ValueSize: 256)129402.10ns130978.44ns✅ +1.2%
IntegerComparerBenchmarks.WriteIntegers(KeySize: 8, OpsPerTransaction: 10000, Comparer: SignedInt)523964.70ns530277.67ns✅ +1.2%
ComparerWriteBenchmarks.Write(OpsPerTransaction: 1000, ValueSize: 256, Comparer: Utf8String)748752.40ns757192.85ns✅ +1.1%
ComparerReadBenchmarks.Read(OpsPerTransaction: 1000, ValueSize: 256, Comparer: SignedInt)157034.27ns158763.84ns✅ +1.1%
ComparerWriteBenchmarks.Write(OpsPerTransaction: 1000, ValueSize: 64, Comparer: ReverseSignedInt)464151.18ns468659.80ns✅ +1.0%
ComparerReadBenchmarks.Read(OpsPerTransaction: 1000, ValueSize: 64, Comparer: ReverseUtf8String)168546.41ns170114.35ns✅ +0.9%
ComparerReadBenchmarks.Read(OpsPerTransaction: 1000, ValueSize: 64, Comparer: SignedInt)152561.29ns153964.68ns✅ +0.9%
ComparerReadBenchmarks.Read(OpsPerTransaction: 100, ValueSize: 256, Comparer: Utf8String)10968.82ns11069.18ns✅ +0.9%
ComparerReadBenchmarks.Read(OpsPerTransaction: 100, ValueSize: 64, Comparer: HashCode)21863.16ns22058.13ns✅ +0.9%
ComparerReadBenchmarks.Read(OpsPerTransaction: 100, ValueSize: 256, Comparer: ReverseUnsignedInt)10676.62ns10769.72ns✅ +0.9%
ComparerWriteBenchmarks.Write(OpsPerTransaction: 1000, ValueSize: 256, Comparer: Guid)748980.56ns755327.93ns✅ +0.8%
ComparerWriteBenchmarks.Write(OpsPerTransaction: 1000, ValueSize: 256, Comparer: Default)750936.00ns757146.45ns✅ +0.8%
ComparerReadBenchmarks.Read(OpsPerTransaction: 100, ValueSize: 64, Comparer: Guid)10704.31ns10780.10ns✅ +0.7%
ComparerReadBenchmarks.Read(OpsPerTransaction: 100, ValueSize: 64, Comparer: ReverseUnsignedInt)10249.75ns10301.26ns✅ +0.5%
WriteBenchmarks.Write(OpsPerTransaction: 1, ValueSize: 8, KeyOrder: Sequential)178141.34ns178915.57ns✅ +0.4%
WriteBenchmarks.Write(OpsPerTransaction: 1000, ValueSize: 256, KeyOrder: Sequential)750347.14ns753424.86ns✅ +0.4%
ComparerWriteBenchmarks.Write(OpsPerTransaction: 1000, ValueSize: 256, Comparer: Bitwise)755823.96ns758835.30ns✅ +0.4%
ComparerWriteBenchmarks.Write(OpsPerTransaction: 1000, ValueSize: 256, Comparer: Length)753525.73ns756485.96ns✅ +0.4%
ComparerWriteBenchmarks.Write(OpsPerTransaction: 100, ValueSize: 256, Comparer: HashCode)245548.36ns246421.51ns✅ +0.4%
ComparerReadBenchmarks.Read(OpsPerTransaction: 1000, ValueSize: 256, Comparer: ReverseLength)174537.20ns175100.68ns✅ +0.3%
WriteBenchmarks.Write(OpsPerTransaction: 100, ValueSize: 64, KeyOrder: Sequential)201398.17ns202011.96ns✅ +0.3%
ComparerReadBenchmarks.Read(OpsPerTransaction: 1000, ValueSize: 64, Comparer: ReverseUnsignedInt)156296.69ns156688.17ns✅ +0.3%
CursorIterationBenchmarks.TryGetSpanDestination(Entries: 1000, ValueSize: 8)123709.62ns123973.06ns✅ +0.2%
ComparerReadBenchmarks.Read(OpsPerTransaction: 1000, ValueSize: 256, Comparer: ReverseSignedInt)161998.10ns162249.31ns✅ +0.2%
ComparerReadBenchmarks.Read(OpsPerTransaction: 1000, ValueSize: 256, Comparer: ReverseUtf8String)172349.75ns172572.22ns✅ +0.1%
ComparerReadBenchmarks.Read(OpsPerTransaction: 1000, ValueSize: 64, Comparer: Length)172726.40ns172765.82ns✅ +0.0%
ComparerReadBenchmarks.Read(OpsPerTransaction: 100, ValueSize: 256, Comparer: Guid)11089.88ns11091.76ns✅ +0.0%
ComparerWriteBenchmarks.Write(OpsPerTransaction: 1000, ValueSize: 256, Comparer: SignedInt)743961.58ns743857.63ns✅ -0.0%
ComparerReadBenchmarks.Read(OpsPerTransaction: 1000, ValueSize: 256, Comparer: Length)171308.22ns171280.66ns✅ -0.0%
ComparerWriteBenchmarks.Write(OpsPerTransaction: 100, ValueSize: 256, Comparer: Utf8String)234999.47ns234807.17ns✅ -0.1%
CursorIterationBenchmarks.TryGetAllocating(Entries: 1000, ValueSize: 8)136074.80ns135867.11ns✅ -0.2%
IntegerComparerBenchmarks.WriteIntegers(KeySize: 8, OpsPerTransaction: 1000, Comparer: SignedInt)468440.37ns467714.77ns✅ -0.2%
ComparerReadBenchmarks.Read(OpsPerTransaction: 1000, ValueSize: 64, Comparer: ReverseLength)171742.06ns171414.00ns✅ -0.2%
ComparerReadBenchmarks.Read(OpsPerTransaction: 1000, ValueSize: 256, Comparer: ReverseBitwise)172056.05ns171715.96ns✅ -0.2%
ComparerWriteBenchmarks.Write(OpsPerTransaction: 1000, ValueSize: 256, Comparer: UnsignedInt)746972.43ns744427.82ns✅ -0.3%
IntegerComparerBenchmarks.WriteIntegers(KeySize: 4, OpsPerTransaction: 10000, Comparer: Default)2414122.96ns2405540.31ns✅ -0.4%
WriteBenchmarks.Write(OpsPerTransaction: 1000, ValueSize: 8, KeyOrder: Sequential)385937.84ns384382.38ns✅ -0.4%
ComparerWriteBenchmarks.Write(OpsPerTransaction: 100, ValueSize: 64, Comparer: HashCode)224124.11ns222981.43ns✅ -0.5%
ComparerWriteBenchmarks.Write(OpsPerTransaction: 100, ValueSize: 64, Comparer: ReverseGuid)212241.89ns211127.61ns✅ -0.5%
ComparerReadBenchmarks.Read(OpsPerTransaction: 1000, ValueSize: 256, Comparer: ReverseUnsignedInt)161230.58ns160167.06ns✅ -0.7%
ComparerReadBenchmarks.Read(OpsPerTransaction: 1000, ValueSize: 64, Comparer: Guid)171811.94ns170599.83ns✅ -0.7%
GuidComparerBenchmarks.WriteGuids(OpsPerTransaction: 10000, Comparer: Default)2524593.03ns2503635.24ns✅ -0.8%
ComparerReadBenchmarks.Read(OpsPerTransaction: 1000, ValueSize: 64, Comparer: ReverseBitwise)170464.39ns168966.21ns✅ -0.9%
IntegerComparerBenchmarks.WriteIntegers(KeySize: 4, OpsPerTransaction: 1000, Comparer: ReverseSignedInt)485689.59ns481295.42ns✅ -0.9%
ComparerReadBenchmarks.Read(OpsPerTransaction: 100, ValueSize: 256, Comparer: SignedInt)10654.84ns10546.44ns✅ -1.0%
ComparerWriteBenchmarks.Write(OpsPerTransaction: 100, ValueSize: 64, Comparer: UnsignedInt)211842.29ns209675.32ns✅ -1.0%
ComparerReadBenchmarks.Read(OpsPerTransaction: 1000, ValueSize: 256, Comparer: Bitwise)171144.20ns169349.58ns✅ -1.0%
ComparerWriteBenchmarks.Write(OpsPerTransaction: 1000, ValueSize: 64, Comparer: UnsignedInt)470112.79ns464901.35ns✅ -1.1%
ComparerReadBenchmarks.Read(OpsPerTransaction: 1000, ValueSize: 64, Comparer: UnsignedInt)155874.52ns154045.64ns✅ -1.2%
ComparerReadBenchmarks.Read(OpsPerTransaction: 100, ValueSize: 64, Comparer: SignedInt)10407.54ns10256.92ns✅ -1.4%
ComparerReadBenchmarks.Read(OpsPerTransaction: 1000, ValueSize: 256, Comparer: UnsignedInt)159715.61ns157377.55ns✅ -1.5%
ComparerReadBenchmarks.Read(OpsPerTransaction: 1000, ValueSize: 256, Comparer: HashCode)336761.04ns331277.46ns✅ -1.6%
WriteBenchmarks.Write(OpsPerTransaction: 100, ValueSize: 256, KeyOrder: Sequential)222733.14ns219015.26ns✅ -1.7%
ComparerWriteBenchmarks.Write(OpsPerTransaction: 100, ValueSize: 64, Comparer: LengthOnly)188982.02ns185534.31ns✅ -1.8%
GuidComparerBenchmarks.WriteGuids(OpsPerTransaction: 1000, Comparer: ReverseGuid)500487.61ns490958.91ns✅ -1.9%
IntegerComparerBenchmarks.WriteIntegers(KeySize: 8, OpsPerTransaction: 1000, Comparer: ReverseUnsignedInt)515295.77ns505267.95ns✅ -1.9%
ComparerReadBenchmarks.Read(OpsPerTransaction: 1000, ValueSize: 256, Comparer: Guid)172479.13ns169096.38ns✅ -2.0%
ComparerReadBenchmarks.Read(OpsPerTransaction: 1000, ValueSize: 64, Comparer: ReverseGuid)173460.30ns169914.43ns✅ -2.0%
ComparerWriteBenchmarks.Write(OpsPerTransaction: 100, ValueSize: 256, Comparer: Default)217577.70ns212934.38ns✅ -2.1%
IntegerComparerBenchmarks.WriteIntegers(KeySize: 4, OpsPerTransaction: 1000, Comparer: ReverseUnsignedInt)487542.39ns476383.65ns✅ -2.3%
ReadBenchmarks.Read(OpsPerTransaction: 1, ValueSize: 256, KeyOrder: Sequential)185.22ns180.73ns✅ -2.4%
ComparerWriteBenchmarks.Write(OpsPerTransaction: 100, ValueSize: 64, Comparer: Length)214014.20ns208620.07ns✅ -2.5%
ComparerWriteBenchmarks.Write(OpsPerTransaction: 1000, ValueSize: 64, Comparer: ReverseUnsignedInt)501971.40ns488719.10ns✅ -2.6%
ComparerWriteBenchmarks.Write(OpsPerTransaction: 100, ValueSize: 64, Comparer: ReverseUnsignedInt)220306.90ns214460.00ns✅ -2.7%
ComparerReadBenchmarks.Read(OpsPerTransaction: 1000, ValueSize: 256, Comparer: Utf8String)172675.88ns167581.09ns✅ -3.0%
ComparerReadBenchmarks.Read(OpsPerTransaction: 100, ValueSize: 64, Comparer: ReverseBitwise)11229.12ns10897.39ns✅ -3.0%
IntegerComparerBenchmarks.WriteIntegers(KeySize: 4, OpsPerTransaction: 1000, Comparer: Default)418950.61ns406374.00ns✅ -3.0%
ComparerReadBenchmarks.Read(OpsPerTransaction: 1000, ValueSize: 64, Comparer: ReverseSignedInt)159596.40ns154783.78ns✅ -3.0%
WriteBenchmarks.Write(OpsPerTransaction: 1000, ValueSize: 64, KeyOrder: Sequential)464114.05ns449954.82ns✅ -3.1%
ComparerWriteBenchmarks.Write(OpsPerTransaction: 100, ValueSize: 64, Comparer: ReverseSignedInt)217281.97ns210442.09ns✅ -3.1%
ComparerWriteBenchmarks.Write(OpsPerTransaction: 1000, ValueSize: 64, Comparer: ReverseGuid)492563.15ns477025.35ns✅ -3.2%
IntegerComparerBenchmarks.WriteIntegers(KeySize: 8, OpsPerTransaction: 1000, Comparer: UnsignedInt)471499.36ns455620.89ns✅ -3.4%
ComparerWriteBenchmarks.Write(OpsPerTransaction: 100, ValueSize: 256, Comparer: SignedInt)228831.32ns221083.71ns✅ -3.4%
ComparerWriteBenchmarks.Write(OpsPerTransaction: 100, ValueSize: 256, Comparer: ReverseUnsignedInt)243059.96ns234798.69ns✅ -3.4%
ComparerWriteBenchmarks.Write(OpsPerTransaction: 1000, ValueSize: 64, Comparer: ReverseLength)506542.41ns488723.57ns✅ -3.5%
IntegerComparerBenchmarks.WriteIntegers(KeySize: 8, OpsPerTransaction: 1000, Comparer: ReverseSignedInt)531575.93ns512810.35ns✅ -3.5%
ComparerReadBenchmarks.Read(OpsPerTransaction: 1000, ValueSize: 64, Comparer: HashCode)337457.85ns323954.23ns✅ -4.0%
ComparerWriteBenchmarks.Write(OpsPerTransaction: 1000, ValueSize: 64, Comparer: ReverseBitwise)512666.16ns491697.44ns✅ -4.1%
WriteBenchmarks.Write(OpsPerTransaction: 1, ValueSize: 64, KeyOrder: Sequential)180333.47ns172943.62ns✅ -4.1%
ComparerWriteBenchmarks.Write(OpsPerTransaction: 1000, ValueSize: 64, Comparer: LengthOnly)262257.45ns250508.60ns✅ -4.5%
ComparerWriteBenchmarks.Write(OpsPerTransaction: 100, ValueSize: 64, Comparer: Default)209928.81ns200485.81ns✅ -4.5%
ComparerWriteBenchmarks.Write(OpsPerTransaction: 1000, ValueSize: 64, Comparer: HashCode)661250.87ns631435.03ns✅ -4.5%
ComparerWriteBenchmarks.Write(OpsPerTransaction: 100, ValueSize: 256, Comparer: Bitwise)229913.87ns219349.52ns✅ -4.6%
ComparerWriteBenchmarks.Write(OpsPerTransaction: 100, ValueSize: 64, Comparer: Guid)213464.49ns202597.99ns✅ -5.1%
ComparerWriteBenchmarks.Write(OpsPerTransaction: 100, ValueSize: 64, Comparer: Utf8String)214330.89ns203418.82ns✅ -5.1%
CursorIterationBenchmarks.EnumerateForeach(Entries: 1000, ValueSize: 256)11910.98ns11295.50ns✅ -5.2%
ComparerWriteBenchmarks.Write(OpsPerTransaction: 1000, ValueSize: 64, Comparer: SignedInt)461856.29ns437819.22ns✅ -5.2%
ComparerWriteBenchmarks.Write(OpsPerTransaction: 1000, ValueSize: 64, Comparer: Bitwise)501142.62ns473187.19ns✅ -5.6%
ComparerWriteBenchmarks.Write(OpsPerTransaction: 100, ValueSize: 256, Comparer: Guid)231832.86ns218240.50ns✅ -5.9%
ComparerWriteBenchmarks.Write(OpsPerTransaction: 100, ValueSize: 64, Comparer: SignedInt)216875.14ns203891.77ns✅ -6.0%
ComparerWriteBenchmarks.Write(OpsPerTransaction: 100, ValueSize: 256, Comparer: Length)234152.11ns218524.89ns✅ -6.7%
ComparerWriteBenchmarks.Write(OpsPerTransaction: 100, ValueSize: 64, Comparer: ReverseBitwise)217167.17ns202134.18ns✅ -6.9%
ComparerWriteBenchmarks.Write(OpsPerTransaction: 100, ValueSize: 64, Comparer: ReverseLength)217911.16ns201884.49ns✅ -7.4%
ComparerWriteBenchmarks.Write(OpsPerTransaction: 1000, ValueSize: 64, Comparer: Default)447270.23ns413463.75ns✅ -7.6%
ComparerWriteBenchmarks.Write(OpsPerTransaction: 100, ValueSize: 256, Comparer: UnsignedInt)243162.28ns224493.66ns✅ -7.7%
IntegerComparerBenchmarks.WriteIntegers(KeySize: 8, OpsPerTransaction: 1000, Comparer: Default)462403.20ns422610.26ns✅ -8.6%
ComparerWriteBenchmarks.Write(OpsPerTransaction: 100, ValueSize: 64, Comparer: ReverseUtf8String)230304.23ns210202.50ns✅ -8.7%
ComparerWriteBenchmarks.Write(OpsPerTransaction: 100, ValueSize: 256, Comparer: ReverseBitwise)252500.81ns224762.29ns✅ -11.0%
ComparerWriteBenchmarks.Write(OpsPerTransaction: 1000, ValueSize: 64, Comparer: Length)516718.09ns458291.58ns✅ -11.3%
ComparerWriteBenchmarks.Write(OpsPerTransaction: 1000, ValueSize: 64, Comparer: Guid)521414.36ns457989.68ns✅ -12.2%
ComparerWriteBenchmarks.Write(OpsPerTransaction: 1000, ValueSize: 64, Comparer: Utf8String)555457.77ns487356.08ns✅ -12.3%
ComparerWriteBenchmarks.Write(OpsPerTransaction: 100, ValueSize: 256, Comparer: ReverseSignedInt)268321.35ns234930.39ns✅ -12.4%
ComparerWriteBenchmarks.Write(OpsPerTransaction: 100, ValueSize: 256, Comparer: ReverseGuid)266582.37ns230179.84ns✅ -13.7%
ComparerWriteBenchmarks.Write(OpsPerTransaction: 100, ValueSize: 256, Comparer: ReverseLength)270658.79ns231558.44ns✅ -14.4%
ComparerWriteBenchmarks.Write(OpsPerTransaction: 1000, ValueSize: 256, Comparer: HashCode)46777.72ns39986.63ns✅ -14.5%
ComparerWriteBenchmarks.Write(OpsPerTransaction: 100, ValueSize: 64, Comparer: Bitwise)244621.98ns203783.83ns✅ -16.7%

Pin the multi-platform compile script to the LMDB_1.0.1 release tag and
rebuild all runtime assets. Expose LMDB 1.0 encryption/checksum support
(AES-GCM cipher helpers, page callbacks, env config, result codes) with
tests and README notes. Upstream ITS#10553 removed the need for the local
mingw SIZE_T MAP() patch.
@CoreyKaylorCoreyKaylor changed the title Updating native lib to LMDB 1.0 line with new API supportUpdating native lib to LMDB 1.0.1 line with new API supportAug 8, 2026
@CoreyKaylor

Copy link
Copy Markdown
OwnerAuthor

Update (history rewritten)

This PR is now a single commit on top of main, force-pushed after rebasing native builds onto the official LMDB 1.0.1 release.

What changed since the earlier draft

  • Pinned lmdb/compile-lmdb-macos.sh to the LMDB_1.0.1 tag (was a pre-tag mdb.RE/1.0 SHA that still reported 1.0.0)
  • Rebuilt all multi-platform native runtimes against 1.0.1
  • Dropped mingw-map-len-type.patch — upstream ITS#10553 fixed the mingw SIZE_T / MAP() issue

Still in this PR

  • Managed API surface for LMDB 1.0 encryption / checksum (cipher helpers, page callbacks, env config, result codes)
  • Tests + README notes for the 1.0 line (including the on-disk format migration warning)

Local verification

  • dotnet test — 155 passed on net8.0 / net9.0 / net10.0

Stack note: dependent PRs (ios-unity#203wasm-support#204) base on this branch and will need a rebase onto the new tip.

@CoreyKaylor
CoreyKaylor merged commit f46102e into mainAug 8, 2026
4 checks passed
@CoreyKaylor
CoreyKaylor deleted the lmdbv1 branch August 8, 2026 01:17
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@CoreyKaylor