summaryrefslogtreecommitdiff
path: root/src/include
diff options
context:
space:
mode:
authorKeith Bostic <keith.bostic@mongodb.com>2017-04-13 00:59:39 -0400
committerMichael Cahill <michael.cahill@mongodb.com>2017-04-13 14:59:39 +1000
commit787c625446989be6745e069d7b427f2370d2ddda (patch)
tree28a494fba54fda654b10eff0598ad44a3618f9f9 /src/include
parent45759b71aacc73b71cd8741fc5c46f34a5332f7e (diff)
downloadmongo-787c625446989be6745e069d7b427f2370d2ddda.tar.gz
WT-3261 add a checkpoint epoch to avoid draining the eviction queue (#3370)
Diffstat (limited to 'src/include')
-rw-r--r--src/include/btree.h27
-rw-r--r--src/include/btree.i20
-rw-r--r--src/include/extern.h2
-rw-r--r--src/include/session.h9
4 files changed, 30 insertions, 28 deletions
diff --git a/src/include/btree.h b/src/include/btree.h
index 19db27d84a2..8ce77b5ecd3 100644
--- a/src/include/btree.h
+++ b/src/include/btree.h
@@ -151,7 +151,7 @@ struct __wt_btree {
volatile uint32_t evict_busy; /* Count of threads in eviction */
int evict_start_type; /* Start position for eviction walk
(see WT_EVICT_WALK_START). */
- enum {
+ volatile enum {
WT_CKPT_OFF, WT_CKPT_PREPARE, WT_CKPT_RUNNING
} checkpointing; /* Checkpoint in progress */
@@ -163,19 +163,18 @@ struct __wt_btree {
WT_SPINLOCK flush_lock; /* Lock to flush the tree's pages */
/* Flags values up to 0xff are reserved for WT_DHANDLE_* */
-#define WT_BTREE_ALLOW_SPLITS 0x000100 /* Allow splits, even with no evict */
-#define WT_BTREE_BULK 0x000200 /* Bulk-load handle */
-#define WT_BTREE_CLOSED 0x000400 /* Handle closed */
-#define WT_BTREE_IGNORE_CACHE 0x000800 /* Cache-resident object */
-#define WT_BTREE_IN_MEMORY 0x001000 /* Cache-resident object */
-#define WT_BTREE_LOOKASIDE 0x002000 /* Look-aside table */
-#define WT_BTREE_NO_CHECKPOINT 0x004000 /* Disable checkpoints */
-#define WT_BTREE_NO_LOGGING 0x008000 /* Disable logging */
-#define WT_BTREE_REBALANCE 0x020000 /* Handle is for rebalance */
-#define WT_BTREE_SALVAGE 0x040000 /* Handle is for salvage */
-#define WT_BTREE_SKIP_CKPT 0x080000 /* Handle skipped checkpoint */
-#define WT_BTREE_UPGRADE 0x100000 /* Handle is for upgrade */
-#define WT_BTREE_VERIFY 0x200000 /* Handle is for verify */
+#define WT_BTREE_BULK 0x000100 /* Bulk-load handle */
+#define WT_BTREE_CLOSED 0x000200 /* Handle closed */
+#define WT_BTREE_IGNORE_CACHE 0x000400 /* Cache-resident object */
+#define WT_BTREE_IN_MEMORY 0x000800 /* Cache-resident object */
+#define WT_BTREE_LOOKASIDE 0x001000 /* Look-aside table */
+#define WT_BTREE_NO_CHECKPOINT 0x002000 /* Disable checkpoints */
+#define WT_BTREE_NO_LOGGING 0x004000 /* Disable logging */
+#define WT_BTREE_REBALANCE 0x008000 /* Handle is for rebalance */
+#define WT_BTREE_SALVAGE 0x010000 /* Handle is for salvage */
+#define WT_BTREE_SKIP_CKPT 0x020000 /* Handle skipped checkpoint */
+#define WT_BTREE_UPGRADE 0x040000 /* Handle is for upgrade */
+#define WT_BTREE_VERIFY 0x080000 /* Handle is for verify */
uint32_t flags;
};
diff --git a/src/include/btree.i b/src/include/btree.i
index 474b40bf805..d4db65b2033 100644
--- a/src/include/btree.i
+++ b/src/include/btree.i
@@ -1286,6 +1286,16 @@ __wt_page_can_evict(
return (true);
/*
+ * We can't split or evict multiblock row-store pages where the parent's
+ * key for the page is an overflow item, because the split into the
+ * parent frees the backing blocks for any no-longer-used overflow keys,
+ * which will corrupt the checkpoint's block management.
+ */
+ if (btree->checkpointing != WT_CKPT_OFF &&
+ F_ISSET_ATOMIC(ref->home, WT_PAGE_OVERFLOW_KEYS))
+ return (false);
+
+ /*
* Check for in-memory splits before other eviction tests. If the page
* should split in-memory, return success immediately and skip more
* detailed eviction tests. We don't need further tests since the page
@@ -1312,16 +1322,6 @@ __wt_page_can_evict(
}
/*
- * We can't evict clean, multiblock row-store pages where the parent's
- * key for the page is an overflow item, because the split into the
- * parent frees the backing blocks for any no-longer-used overflow keys,
- * which will corrupt the checkpoint's block management.
- */
- if (btree->checkpointing != WT_CKPT_OFF &&
- F_ISSET_ATOMIC(ref->home, WT_PAGE_OVERFLOW_KEYS))
- return (false);
-
- /*
* If a split created new internal pages, those newly created internal
* pages cannot be evicted until all threads are known to have exited
* the original parent page's index, because evicting an internal page
diff --git a/src/include/extern.h b/src/include/extern.h
index ff835bacc56..4f38b7ac433 100644
--- a/src/include/extern.h
+++ b/src/include/extern.h
@@ -649,6 +649,8 @@ extern int __wt_unexpected_object_type( WT_SESSION_IMPL *session, const char *ur
extern void __wt_gen_init(WT_SESSION_IMPL *session) WT_GCC_FUNC_DECL_ATTRIBUTE((visibility("hidden")));
extern uint64_t __wt_gen(WT_SESSION_IMPL *session, int which) WT_GCC_FUNC_DECL_ATTRIBUTE((visibility("hidden")));
extern uint64_t __wt_gen_next(WT_SESSION_IMPL *session, int which) WT_GCC_FUNC_DECL_ATTRIBUTE((visibility("hidden")));
+extern uint64_t __wt_gen_next_drain(WT_SESSION_IMPL *session, int which) WT_GCC_FUNC_DECL_ATTRIBUTE((visibility("hidden")));
+extern void __wt_gen_drain(WT_SESSION_IMPL *session, int which, uint64_t generation) WT_GCC_FUNC_DECL_ATTRIBUTE((visibility("hidden")));
extern uint64_t __wt_gen_oldest(WT_SESSION_IMPL *session, int which) WT_GCC_FUNC_DECL_ATTRIBUTE((visibility("hidden")));
extern uint64_t __wt_session_gen(WT_SESSION_IMPL *session, int which) WT_GCC_FUNC_DECL_ATTRIBUTE((visibility("hidden")));
extern void __wt_session_gen_enter(WT_SESSION_IMPL *session, int which) WT_GCC_FUNC_DECL_ATTRIBUTE((visibility("hidden")));
diff --git a/src/include/session.h b/src/include/session.h
index adef5e39068..de2c1463684 100644
--- a/src/include/session.h
+++ b/src/include/session.h
@@ -169,10 +169,11 @@ struct __wt_session_impl {
/* Generations manager */
#define WT_GEN_CHECKPOINT 0 /* Checkpoint generation */
-#define WT_GEN_HAZARD 1 /* Hazard pointer */
-#define WT_GEN_SCHEMA 2 /* Schema version */
-#define WT_GEN_SPLIT 3 /* Page splits */
-#define WT_GENERATIONS 4 /* Total generation manager entries */
+#define WT_GEN_EVICT 1 /* Eviction generation */
+#define WT_GEN_HAZARD 2 /* Hazard pointer */
+#define WT_GEN_SCHEMA 3 /* Schema version */
+#define WT_GEN_SPLIT 4 /* Page splits */
+#define WT_GENERATIONS 5 /* Total generation manager entries */
volatile uint64_t generations[WT_GENERATIONS];
/*