diff options
author | Matt Kangas <matt.kangas@mongodb.com> | 2015-01-02 13:33:42 -0500 |
---|---|---|
committer | Matt Kangas <matt.kangas@mongodb.com> | 2015-01-02 14:38:44 -0500 |
commit | 68193a0bc55b4c08b20fdb8068fe6a27fda2edcf (patch) | |
tree | 1b473fe1de926eeafdbe237ea0cf5b96366e187a /src/third_party/wiredtiger/src/btree | |
parent | bd22baf9adae1bda00e6b18c012c5db763aaee72 (diff) | |
download | mongo-68193a0bc55b4c08b20fdb8068fe6a27fda2edcf.tar.gz |
Import wiredtiger-wiredtiger-2.5.0-25-gf1de8c2.tar.gz from wiredtiger branch mongodb-2.8
Diffstat (limited to 'src/third_party/wiredtiger/src/btree')
-rw-r--r-- | src/third_party/wiredtiger/src/btree/bt_debug.c | 4 | ||||
-rw-r--r-- | src/third_party/wiredtiger/src/btree/bt_page.c | 32 |
2 files changed, 30 insertions, 6 deletions
diff --git a/src/third_party/wiredtiger/src/btree/bt_debug.c b/src/third_party/wiredtiger/src/btree/bt_debug.c index 05407537a53..7ec6ef8bdee 100644 --- a/src/third_party/wiredtiger/src/btree/bt_debug.c +++ b/src/third_party/wiredtiger/src/btree/bt_debug.c @@ -315,6 +315,8 @@ __wt_debug_disk( __dmsg(ds, "%s page", __wt_page_type_string(dsk->type)); switch (dsk->type) { + case WT_PAGE_BLOCK_MANAGER: + break; case WT_PAGE_COL_FIX: case WT_PAGE_COL_INT: case WT_PAGE_COL_VAR: @@ -331,6 +333,8 @@ __wt_debug_disk( } switch (dsk->type) { + case WT_PAGE_BLOCK_MANAGER: + break; case WT_PAGE_COL_FIX: __debug_dsk_col_fix(ds, dsk); break; diff --git a/src/third_party/wiredtiger/src/btree/bt_page.c b/src/third_party/wiredtiger/src/btree/bt_page.c index 799f0cca3ee..db1ccdabc4f 100644 --- a/src/third_party/wiredtiger/src/btree/bt_page.c +++ b/src/third_party/wiredtiger/src/btree/bt_page.c @@ -67,9 +67,10 @@ __wt_page_in_func(WT_SESSION_IMPL *session, WT_REF *ref, uint32_t flags { WT_DECL_RET; WT_PAGE *page; + u_int sleep_cnt, wait_cnt; int busy, force_attempts, oldgen; - for (force_attempts = oldgen = 0;;) { + for (force_attempts = oldgen = 0, wait_cnt = 0;;) { switch (ref->state) { case WT_REF_DISK: case WT_REF_DELETED: @@ -88,11 +89,14 @@ __wt_page_in_func(WT_SESSION_IMPL *session, WT_REF *ref, uint32_t flags case WT_REF_READING: if (LF_ISSET(WT_READ_CACHE)) return (WT_NOTFOUND); - /* FALLTHROUGH */ + if (LF_ISSET(WT_READ_NO_WAIT)) + return (WT_NOTFOUND); + WT_STAT_FAST_CONN_INCR(session, page_read_blocked); + break; case WT_REF_LOCKED: if (LF_ISSET(WT_READ_NO_WAIT)) return (WT_NOTFOUND); - /* The page is busy -- wait. */ + WT_STAT_FAST_CONN_INCR(session, page_locked_blocked); break; case WT_REF_SPLIT: return (WT_RESTART); @@ -109,8 +113,11 @@ __wt_page_in_func(WT_SESSION_IMPL *session, WT_REF *ref, uint32_t flags #else WT_RET(__wt_hazard_set(session, ref, &busy)); #endif - if (busy) + if (busy) { + WT_STAT_FAST_CONN_INCR( + session, page_busy_blocked); break; + } page = ref->page; WT_ASSERT(session, page != NULL); @@ -121,6 +128,8 @@ __wt_page_in_func(WT_SESSION_IMPL *session, WT_REF *ref, uint32_t flags __evict_force_check(session, page)) { ++force_attempts; WT_RET(__wt_page_release(session, ref, flags)); + WT_STAT_FAST_CONN_INCR( + session, page_forcible_evict_blocked); break; } @@ -148,8 +157,19 @@ __wt_page_in_func(WT_SESSION_IMPL *session, WT_REF *ref, uint32_t flags WT_ILLEGAL_VALUE(session); } - /* We failed to get the page -- yield before retrying. */ - __wt_yield(); + /* + * We failed to get the page -- yield before retrying, and if + * we've yielded enough times, start sleeping so we don't burn + * CPU to no purpose. + */ + if (++wait_cnt < 1000) + __wt_yield(); + else { + sleep_cnt = WT_MIN(wait_cnt, 10000); + wait_cnt *= 2; + WT_STAT_FAST_CONN_INCRV(session, page_sleep, sleep_cnt); + __wt_sleep(0, sleep_cnt); + } } } |