Partial revert of 13c663f666ac28d7a72cbe644d393fc8d2dd9881
authorHoward Chu <hyc@symas.com>
Thu, 5 Jul 2012 23:40:46 +0000 (16:40 -0700)
committerHoward Chu <hyc@symas.com>
Thu, 5 Jul 2012 23:52:13 +0000 (16:52 -0700)
Don't re-use free pages so soon; that leaves us vulnerable to
DB corruption if data syncs successfully but meta doesn't.

libraries/libmdb/mdb.c

index 3b0b66f..fe89a7a 100644 (file)
@@ -1220,7 +1220,11 @@ mdb_page_alloc(MDB_cursor *mc, int num)
        pgno_t pgno = P_INVALID;
        MDB_ID2 mid;
 
-       if (txn->mt_txnid > 2) {
+       /* The free list won't have any content at all until txn 2 has
+        * committed. The pages from txn 1 will be free after txn 3 has
+        * committed. It will be safe to re-use them during txn 4.
+        */
+       if (txn->mt_txnid > 3) {
 
                if (!txn->mt_env->me_pghead &&
                        txn->mt_dbs[FREE_DBI].md_root != P_INVALID) {
@@ -1253,7 +1257,7 @@ again:
 
                        {
                                unsigned int i;
-                               oldest = txn->mt_txnid - 1;
+                               oldest = txn->mt_txnid - 2;
                                for (i=0; i<txn->mt_env->me_txns->mti_numreaders; i++) {
                                        txnid_t mr = txn->mt_env->me_txns->mti_readers[i].mr_txnid;
                                        if (mr && mr < oldest)