]> git.sur5r.net Git - openldap/commitdiff
Additional debug, fixes
authorHoward Chu <hyc@symas.com>
Tue, 9 Aug 2011 00:15:02 +0000 (17:15 -0700)
committerHoward Chu <hyc@symas.com>
Thu, 1 Sep 2011 23:17:07 +0000 (16:17 -0700)
Fixed order of mdb_del0 operations
Drop in-memory free list from env on txn_abort

libraries/libmdb/mdb.c

index 2e914d8342703e6add595515c438ab6eecabc791..f01967fe07d2f5a8915c11619053b3d510f8b88b 100644 (file)
@@ -433,6 +433,16 @@ mdb_alloc_page(MDB_txn *txn, MDB_page *parent, unsigned int parent_idx, int num)
                        txn->mt_env->me_pghead = mop;
                        memcpy(mop->mo_pages, idl, MDB_IDL_SIZEOF(idl));
 
+#if DEBUG > 1
+                       {
+                               unsigned int i;
+                               DPRINTF("IDL read txn %lu root %lu num %lu",
+                                       mop->mo_txnid, txn->mt_dbs[FREE_DBI].md_root, idl[0]);
+                               for (i=0; i<idl[0]; i++) {
+                                       DPRINTF("IDL %lu", idl[i+1]);
+                               }
+                       }
+#endif
                        /* drop this IDL from the DB */
                        mpp.mp_parent = NULL;
                        mpp.mp_pi = 0;
@@ -640,6 +650,7 @@ mdb_txn_abort(MDB_txn *txn)
        if (F_ISSET(txn->mt_flags, MDB_TXN_RDONLY)) {
                txn->mt_u.reader->mr_txnid = 0;
        } else {
+               MDB_oldpages *mop;
                /* Discard all dirty pages. */
                while (!STAILQ_EMPTY(txn->mt_u.dirty_queue)) {
                        dp = STAILQ_FIRST(txn->mt_u.dirty_queue);
@@ -648,6 +659,12 @@ mdb_txn_abort(MDB_txn *txn)
                }
                free(txn->mt_free_pgs);
                free(txn->mt_u.dirty_queue);
+
+               while ((mop = txn->mt_env->me_pghead)) {
+                       txn->mt_env->me_pghead = mop->mo_next;
+                       free(mop);
+               }
+
                env->me_txn = NULL;
                env->me_txns->mt_txnid--;
                pthread_mutex_unlock(&env->me_txns->mt_wmutex);
@@ -723,6 +740,17 @@ mdb_txn_commit(MDB_txn *txn)
                mpp.mp_pi = 0;
                mdb_search_page(txn, FREE_DBI, &key, NULL, 1, &mpp);
 
+#if DEBUG > 1
+               {
+                       unsigned int i;
+                       ULONG *idl = txn->mt_free_pgs;
+                       DPRINTF("IDL write txn %lu root %lu num %lu",
+                               txn->mt_txnid, txn->mt_dbs[FREE_DBI].md_root, idl[0]);
+                       for (i=0; i<idl[0]; i++) {
+                               DPRINTF("IDL %lu", idl[i+1]);
+                       }
+               }
+#endif
                /* write to last page of freeDB */
                key.mv_size = sizeof(pgno_t);
                key.mv_data = (char *)&txn->mt_txnid;
@@ -2335,7 +2363,6 @@ mdb_del0(MDB_txn *txn, MDB_dbi dbi, unsigned int ki, MDB_pageparent *mpp, MDB_no
 {
        int rc;
 
-       mdb_del_node(mpp->mp_page, ki);
        /* add overflow pages to free list */
        if (F_ISSET(leaf->mn_flags, F_BIGDATA)) {
                int i, ovpages;
@@ -2344,10 +2371,12 @@ mdb_del0(MDB_txn *txn, MDB_dbi dbi, unsigned int ki, MDB_pageparent *mpp, MDB_no
                memcpy(&pg, NODEDATA(leaf), sizeof(pg));
                ovpages = OVPAGES(NODEDSZ(leaf), txn->mt_env->me_psize);
                for (i=0; i<ovpages; i++) {
+                       DPRINTF("freed ov page %lu", pg);
                        mdb_idl_insert(txn->mt_free_pgs, pg);
                        pg++;
                }
        }
+       mdb_del_node(mpp->mp_page, ki);
        txn->mt_dbs[dbi].md_entries--;
        rc = mdb_rebalance(txn, dbi, mpp);
        if (rc != MDB_SUCCESS)