summaryrefslogtreecommitdiff
path: root/src/third_party/wiredtiger/src/btree
diff options
context:
space:
mode:
authorMatt Kangas <matt.kangas@mongodb.com>2015-01-02 13:33:42 -0500
committerMatt Kangas <matt.kangas@mongodb.com>2015-01-02 14:38:44 -0500
commit68193a0bc55b4c08b20fdb8068fe6a27fda2edcf (patch)
tree1b473fe1de926eeafdbe237ea0cf5b96366e187a /src/third_party/wiredtiger/src/btree
parentbd22baf9adae1bda00e6b18c012c5db763aaee72 (diff)
downloadmongo-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.c4
-rw-r--r--src/third_party/wiredtiger/src/btree/bt_page.c32
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);
+ }
}
}