mdbx: simplify find-oldest inside mdbx_page_alloc().

Change-Id: I88dfc8ee268eba2452bffd3c4e6cfd066bcd8b04
This commit is contained in:
Leo Yuriev 2017-06-14 23:33:44 +03:00
parent 760f7d1331
commit ae71c2aa36

View File

@ -1558,7 +1558,6 @@ static int mdbx_page_alloc(MDBX_cursor *mc, unsigned num, MDBX_page **mp,
txnid_t oldest = 0, last = 0; txnid_t oldest = 0, last = 0;
MDBX_cursor_op op; MDBX_cursor_op op;
MDBX_cursor m2; MDBX_cursor m2;
int found_oldest = 0;
if (likely(flags & MDBX_ALLOC_GC)) { if (likely(flags & MDBX_ALLOC_GC)) {
flags |= env->me_flags & (MDBX_COALESCE | MDBX_LIFORECLAIM); flags |= env->me_flags & (MDBX_COALESCE | MDBX_LIFORECLAIM);
@ -1614,13 +1613,10 @@ static int mdbx_page_alloc(MDBX_cursor *mc, unsigned num, MDBX_page **mp,
if (unlikely(!(flags & MDBX_ALLOC_GC))) if (unlikely(!(flags & MDBX_ALLOC_GC)))
break; break;
oldest = env->me_pgoldest; oldest = (flags & MDBX_LIFORECLAIM) ? mdbx_find_oldest(txn, NULL)
: env->me_pgoldest;
mdbx_cursor_init(&m2, txn, FREE_DBI, NULL); mdbx_cursor_init(&m2, txn, FREE_DBI, NULL);
if (flags & MDBX_LIFORECLAIM) { if (flags & MDBX_LIFORECLAIM) {
if (!found_oldest) {
oldest = mdbx_find_oldest(txn, NULL);
found_oldest = 1;
}
/* Begin from oldest reader if any */ /* Begin from oldest reader if any */
if (oldest > 2) { if (oldest > 2) {
last = oldest - 1; last = oldest - 1;
@ -1639,10 +1635,6 @@ static int mdbx_page_alloc(MDBX_cursor *mc, unsigned num, MDBX_page **mp,
if (!(flags & MDBX_LIFORECLAIM)) { if (!(flags & MDBX_LIFORECLAIM)) {
/* Do not fetch more if the record will be too recent */ /* Do not fetch more if the record will be too recent */
if (op != MDBX_FIRST && ++last >= oldest) { if (op != MDBX_FIRST && ++last >= oldest) {
if (!found_oldest) {
oldest = mdbx_find_oldest(txn, NULL);
found_oldest = 1;
}
if (oldest <= last) if (oldest <= last)
break; break;
} }
@ -1652,7 +1644,6 @@ static int mdbx_page_alloc(MDBX_cursor *mc, unsigned num, MDBX_page **mp,
if (rc == MDBX_NOTFOUND && (flags & MDBX_LIFORECLAIM)) { if (rc == MDBX_NOTFOUND && (flags & MDBX_LIFORECLAIM)) {
if (op == MDBX_SET_RANGE) if (op == MDBX_SET_RANGE)
continue; continue;
found_oldest = 1;
if (oldest < mdbx_find_oldest(txn, NULL)) { if (oldest < mdbx_find_oldest(txn, NULL)) {
oldest = env->me_pgoldest; oldest = env->me_pgoldest;
last = oldest - 1; last = oldest - 1;
@ -1670,10 +1661,7 @@ static int mdbx_page_alloc(MDBX_cursor *mc, unsigned num, MDBX_page **mp,
last = *(txnid_t *)key.iov_base; last = *(txnid_t *)key.iov_base;
if (oldest <= last) { if (oldest <= last) {
if (!found_oldest) { oldest = mdbx_find_oldest(txn, NULL);
oldest = mdbx_find_oldest(txn, NULL);
found_oldest = 1;
}
if (oldest <= last) { if (oldest <= last) {
if (flags & MDBX_LIFORECLAIM) if (flags & MDBX_LIFORECLAIM)
continue; continue;
@ -1804,18 +1792,15 @@ static int mdbx_page_alloc(MDBX_cursor *mc, unsigned num, MDBX_page **mp,
MDBX_meta meta = *head; MDBX_meta meta = *head;
if (mdbx_sync_locked(env, me_flags, &meta) == MDBX_SUCCESS) { if (mdbx_sync_locked(env, me_flags, &meta) == MDBX_SUCCESS) {
txnid_t snap = mdbx_find_oldest(txn, NULL); txnid_t snap = mdbx_find_oldest(txn, NULL);
if (snap > oldest) { if (snap > oldest)
continue; continue;
}
} }
} }
if (rc == MDBX_MAP_FULL) { if (rc == MDBX_MAP_FULL) {
txnid_t snap = mdbx_oomkick(env, oldest); txnid_t snap = mdbx_oomkick(env, oldest);
if (snap > oldest) { if (snap > oldest)
oldest = snap;
continue; continue;
}
} }
} }