From b048b7eb4ba07a255ddd8040d63c56608dfaa645 Mon Sep 17 00:00:00 2001 From: Howard Chu Date: Mon, 27 Apr 2026 17:28:19 +0100 Subject: [PATCH] ITS#9388 LMDB: fix mdb_stat page counts for dupsort DBs --- libraries/liblmdb/mdb.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/libraries/liblmdb/mdb.c b/libraries/liblmdb/mdb.c index 98e39602e3..8077e460c4 100644 --- a/libraries/liblmdb/mdb.c +++ b/libraries/liblmdb/mdb.c @@ -7666,6 +7666,18 @@ mdb_cursor_touch(MDB_cursor *mc) return rc; } +static void +mdb_subdb_adjust(MDB_cursor *mc, MDB_db *old, MDB_db *new) +{ + int delta; + + delta = new->md_branch_pages - old->md_branch_pages; + mc->mc_db->md_branch_pages += delta; + + delta = new->md_leaf_pages - old->md_leaf_pages; + mc->mc_db->md_leaf_pages += delta; +} + /** Do not spill pages to disk if txn is getting full, may fail instead */ #define MDB_NOSPILL 0x8000 @@ -7963,6 +7975,7 @@ prep_subDB: flags |= F_DUPDATA|F_SUBDATA; dummy.md_root = mp->mp_pgno; sub_root = mp; + mc->mc_db->md_leaf_pages++; } if (mp != fp) { MP_FLAGS(mp) = fp_flags | P_DIRTY; @@ -8169,6 +8182,7 @@ put_sub: rc = _mdb_cursor_put(&mc->mc_xcursor->mx_cursor, data, &xdata, xflags); if (flags & F_SUBDATA) { void *db = NODEDATA(leaf); + mdb_subdb_adjust(mc, db, &mc->mc_xcursor->mx_db); memcpy(db, &mc->mc_xcursor->mx_db, sizeof(MDB_db)); } insert_data = mc->mc_xcursor->mx_db.md_entries - ecount; @@ -8266,6 +8280,7 @@ _mdb_cursor_del(MDB_cursor *mc, unsigned int flags) if (leaf->mn_flags & F_SUBDATA) { /* update subDB info */ void *db = NODEDATA(leaf); + mdb_subdb_adjust(mc, db, &mc->mc_xcursor->mx_db); memcpy(db, &mc->mc_xcursor->mx_db, sizeof(MDB_db)); } else { MDB_cursor *m2;