mdbx: refine find_oldest() and oom_kick().

Change-Id: I758eba1a93550b687bbec6bf90e5b2d48090af25
This commit is contained in:
Leo Yuriev 2016-05-03 22:29:02 +03:00
parent 50f5475185
commit 2dd9638321

43
mdb.c
View File

@ -1971,11 +1971,11 @@ txnid_t mdb_find_oldest(MDB_env *env, int *laggard)
if (laggard) if (laggard)
*laggard = reader; *laggard = reader;
return oldest; return env->me_pgoldest = oldest;
} }
static int __cold static txnid_t __cold
mdb_oomkick(MDB_env *env, txnid_t oldest) mdbx_oomkick(MDB_env *env, txnid_t oldest)
{ {
int retry; int retry;
txnid_t snap; txnid_t snap;
@ -1988,7 +1988,7 @@ mdb_oomkick(MDB_env *env, txnid_t oldest)
snap = mdb_find_oldest(env, &reader); snap = mdb_find_oldest(env, &reader);
if (oldest < snap) if (oldest < snap)
return 1; return snap;
if (reader < 0) if (reader < 0)
return 0; return 0;
@ -2028,8 +2028,7 @@ mdb_oomkick(MDB_env *env, txnid_t oldest)
#endif /* MDBX_MODE_ENABLED */ #endif /* MDBX_MODE_ENABLED */
} }
snap = mdb_find_oldest(env, NULL); return mdb_find_oldest(env, NULL);
return oldest < snap;
} }
/** Add a page to the txn's dirty list */ /** Add a page to the txn's dirty list */
@ -2084,7 +2083,7 @@ mdb_page_alloc(MDB_cursor *mc, int num, MDB_page **mp, int flags)
txnid_t oldest = 0, last = 0; txnid_t oldest = 0, last = 0;
MDB_cursor_op op; MDB_cursor_op op;
MDB_cursor m2; MDB_cursor m2;
int found_old; 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);
@ -2115,7 +2114,6 @@ mdb_page_alloc(MDB_cursor *mc, int num, MDB_page **mp, int flags)
} }
for (;;) { /* oom-kick retry loop */ for (;;) { /* oom-kick retry loop */
found_old = 0;
for (op = MDB_FIRST;; op = (flags & MDBX_LIFORECLAIM) ? MDB_PREV : MDB_NEXT) { for (op = MDB_FIRST;; op = (flags & MDBX_LIFORECLAIM) ? MDB_PREV : MDB_NEXT) {
MDB_val key, data; MDB_val key, data;
MDB_node *leaf; MDB_node *leaf;
@ -2149,8 +2147,7 @@ mdb_page_alloc(MDB_cursor *mc, int num, MDB_page **mp, int flags)
op = MDB_SET_RANGE; op = MDB_SET_RANGE;
} else { } else {
oldest = mdb_find_oldest(env, NULL); oldest = mdb_find_oldest(env, NULL);
env->me_pgoldest = oldest; found_oldest = 1;
found_old = 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;
@ -2170,10 +2167,9 @@ mdb_page_alloc(MDB_cursor *mc, int num, MDB_page **mp, int flags)
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 != MDB_FIRST && ++last >= oldest) { if (op != MDB_FIRST && ++last >= oldest) {
if (!found_old) { if (!found_oldest) {
oldest = mdb_find_oldest(env, NULL); oldest = mdb_find_oldest(env, NULL);
env->me_pgoldest = oldest; found_oldest = 1;
found_old = 1;
} }
if (oldest <= last) if (oldest <= last)
break; break;
@ -2184,9 +2180,8 @@ mdb_page_alloc(MDB_cursor *mc, int num, MDB_page **mp, int flags)
if (rc == MDB_NOTFOUND && (flags & MDBX_LIFORECLAIM)) { if (rc == MDB_NOTFOUND && (flags & MDBX_LIFORECLAIM)) {
if (op == MDB_SET_RANGE) if (op == MDB_SET_RANGE)
continue; continue;
env->me_pgoldest = mdb_find_oldest(env, NULL); found_oldest = 1;
found_old = 1; if (oldest < mdb_find_oldest(env, NULL)) {
if (oldest < env->me_pgoldest) {
oldest = env->me_pgoldest; oldest = env->me_pgoldest;
last = oldest - 1; last = oldest - 1;
key.mv_data = &last; key.mv_data = &last;
@ -2203,10 +2198,9 @@ mdb_page_alloc(MDB_cursor *mc, int num, MDB_page **mp, int flags)
last = *(txnid_t*)key.mv_data; last = *(txnid_t*)key.mv_data;
if (oldest <= last) { if (oldest <= last) {
if (!found_old) { if (!found_oldest) {
oldest = mdb_find_oldest(env, NULL); oldest = mdb_find_oldest(env, NULL);
env->me_pgoldest = oldest; found_oldest = 1;
found_old = 1;
} }
if (oldest <= last) { if (oldest <= last) {
if (flags & MDBX_LIFORECLAIM) if (flags & MDBX_LIFORECLAIM)
@ -2334,13 +2328,18 @@ mdb_page_alloc(MDB_cursor *mc, int num, MDB_page **mp, int flags)
mdb_assert(env, env->me_sync_pending > 0); mdb_assert(env, env->me_sync_pending > 0);
if (mdb_env_sync0(env, flags, &meta) == MDB_SUCCESS) { if (mdb_env_sync0(env, flags, &meta) == MDB_SUCCESS) {
txnid_t snap = mdb_find_oldest(env, NULL); txnid_t snap = mdb_find_oldest(env, NULL);
if (snap > oldest) if (snap > oldest) {
continue; continue;
}
} }
} }
if (rc == MDB_MAP_FULL && mdb_oomkick(env, oldest)) if (rc == MDB_MAP_FULL) {
continue; txnid_t snap = mdbx_oomkick(env, oldest);
if (snap > oldest) {
continue;
}
}
} }
fail: fail: