Microoptimize loose pages

This commit is contained in:
Hallvard Furuseth 2014-08-17 01:50:32 +02:00
parent 1e7eeed28d
commit cf4fe3b1fb

View File

@ -1634,10 +1634,11 @@ mdb_page_loose(MDB_cursor *mc, MDB_page *mp)
{
int loose = 0;
pgno_t pgno = mp->mp_pgno;
MDB_txn *txn = mc->mc_txn;
if ((mp->mp_flags & P_DIRTY) && mc->mc_dbi != FREE_DBI) {
if (mc->mc_txn->mt_parent) {
MDB_ID2 *dl = mc->mc_txn->mt_u.dirty_list;
if (txn->mt_parent) {
MDB_ID2 *dl = txn->mt_u.dirty_list;
/* If txn has a parent, make sure the page is in our
* dirty list.
*/
@ -1646,7 +1647,7 @@ mdb_page_loose(MDB_cursor *mc, MDB_page *mp)
if (x <= dl[0].mid && dl[x].mid == pgno) {
if (mp != dl[x].mptr) { /* bad cursor? */
mc->mc_flags &= ~(C_INITIALIZED|C_EOF);
mc->mc_txn->mt_flags |= MDB_TXN_ERROR;
txn->mt_flags |= MDB_TXN_ERROR;
return MDB_CORRUPTED;
}
/* ok, it's ours */
@ -1661,12 +1662,12 @@ mdb_page_loose(MDB_cursor *mc, MDB_page *mp)
if (loose) {
DPRINTF(("loosen db %d page %"Z"u", DDBI(mc),
mp->mp_pgno));
NEXT_LOOSE_PAGE(mp) = mc->mc_txn->mt_loose_pgs;
mc->mc_txn->mt_loose_pgs = mp;
mc->mc_txn->mt_loose_count++;
NEXT_LOOSE_PAGE(mp) = txn->mt_loose_pgs;
txn->mt_loose_pgs = mp;
txn->mt_loose_count++;
mp->mp_flags |= P_LOOSE;
} else {
int rc = mdb_midl_append(&mc->mc_txn->mt_free_pgs, pgno);
int rc = mdb_midl_append(&txn->mt_free_pgs, pgno);
if (rc)
return rc;
}
@ -2827,7 +2828,7 @@ mdb_freelist_save(MDB_txn *txn)
return rc;
}
if (!env->me_pghead) {
if (!env->me_pghead && txn->mt_loose_pgs) {
/* Put loose page numbers in mt_free_pgs, since
* we may be unable to return them to me_pghead.
*/