From d1a7fa267bdb9e27777ba87db44034ce83a75084 Mon Sep 17 00:00:00 2001 From: Howard Chu Date: Thu, 26 Jul 2012 06:25:31 -0700 Subject: [PATCH] Update sub-DBs before updating free list --- libraries/libmdb/mdb.c | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/libraries/libmdb/mdb.c b/libraries/libmdb/mdb.c index 9ce45b3..b5952da 100644 --- a/libraries/libmdb/mdb.c +++ b/libraries/libmdb/mdb.c @@ -1877,6 +1877,23 @@ mdb_txn_commit(MDB_txn *txn) DPRINTF("committing txn %zu %p on mdbenv %p, root page %zu", txn->mt_txnid, (void *)txn, (void *)env, txn->mt_dbs[MAIN_DBI].md_root); + /* Update DB root pointers. Their pages have already been + * touched so this is all in-place and cannot fail. + */ + { + MDB_dbi i; + MDB_val data; + data.mv_size = sizeof(MDB_db); + + mdb_cursor_init(&mc, txn, MAIN_DBI, NULL); + for (i = 2; i < txn->mt_numdbs; i++) { + if (txn->mt_dbflags[i] & DB_DIRTY) { + data.mv_data = &txn->mt_dbs[i]; + mdb_cursor_put(&mc, &txn->mt_dbxs[i].md_name, &data, 0); + } + } + } + mdb_cursor_init(&mc, txn, FREE_DBI, NULL); /* should only be one record now */ @@ -1997,22 +2014,6 @@ again: env->me_free_pgs = txn->mt_free_pgs; } - /* Update DB root pointers. Their pages have already been - * touched so this is all in-place and cannot fail. - */ - { - MDB_dbi i; - MDB_val data; - data.mv_size = sizeof(MDB_db); - - mdb_cursor_init(&mc, txn, MAIN_DBI, NULL); - for (i = 2; i < txn->mt_numdbs; i++) { - if (txn->mt_dbflags[i] & DB_DIRTY) { - data.mv_data = &txn->mt_dbs[i]; - mdb_cursor_put(&mc, &txn->mt_dbxs[i].md_name, &data, 0); - } - } - } #if MDB_DEBUG > 2 mdb_audit(txn); #endif