Tweak prev commit

If somehow "need" is larger than the list size, don't
try to fake out the dirty list.
vmware
Howard Chu 11 years ago
parent 7b1db13050
commit 45c4ed1805
  1. 45
      libraries/liblmdb/mdb.c

@ -1479,7 +1479,6 @@ mdb_page_spill(MDB_cursor *m0, MDB_val *key, MDB_val *data)
* better than 1/2, 1/4, or 1/10. * better than 1/2, 1/4, or 1/10.
*/ */
k = 0; k = 0;
need *= 100;
if (need < MDB_IDL_UM_MAX / 8) if (need < MDB_IDL_UM_MAX / 8)
need = MDB_IDL_UM_MAX / 8; need = MDB_IDL_UM_MAX / 8;
@ -1519,32 +1518,38 @@ mdb_page_spill(MDB_cursor *m0, MDB_val *key, MDB_val *data)
*/ */
{ {
MDB_ID2 old; MDB_ID2 old;
k = dl[0].mid - i + 1; if (i) {
old = dl[i-1]; k = dl[0].mid - i + 1;
dl[i-1].mid = k; old = dl[i-1];
txn->mt_u.dirty_list = &dl[i-1]; dl[i-1].mid = k;
txn->mt_u.dirty_list = &dl[i-1];
}
rc = mdb_page_flush(txn); rc = mdb_page_flush(txn);
/* reset back to the real list */ if (i) {
dl[0].mid -= k; /* reset back to the real list */
dl[0].mid += dl[i-1].mid; dl[0].mid -= k;
dl[i-1] = old; dl[0].mid += dl[i-1].mid;
txn->mt_u.dirty_list = dl; dl[i-1] = old;
txn->mt_u.dirty_list = dl;
}
} }
mdb_cursorpages_mark(m0, P_DIRTY|P_KEEP); mdb_cursorpages_mark(m0, P_DIRTY|P_KEEP);
/* Reset any dirty root pages we kept that page_flush didn't see */ if (i) {
for (i=0; i<txn->mt_numdbs; i++) { /* Reset any dirty root pages we kept that page_flush didn't see */
if (txn->mt_dbflags[i] & DB_DIRTY) { for (i=0; i<txn->mt_numdbs; i++) {
pgno_t pgno = txn->mt_dbs[i].md_root; if (txn->mt_dbflags[i] & DB_DIRTY) {
if (pgno == P_INVALID) pgno_t pgno = txn->mt_dbs[i].md_root;
continue; if (pgno == P_INVALID)
if ((rc = mdb_page_get(txn, pgno, &dp, &level)) != MDB_SUCCESS) continue;
goto done; if ((rc = mdb_page_get(txn, pgno, &dp, &level)) != MDB_SUCCESS)
if (dp->mp_flags & P_KEEP) goto done;
dp->mp_flags ^= P_KEEP; if (dp->mp_flags & P_KEEP)
dp->mp_flags ^= P_KEEP;
}
} }
} }

Loading…
Cancel
Save