summaryrefslogtreecommitdiff
path: root/src/third_party
diff options
context:
space:
mode:
authorMichael Cahill <michael.cahill@mongodb.com>2017-03-17 11:27:45 +1100
committerMichael Cahill <michael.cahill@mongodb.com>2017-03-17 11:27:45 +1100
commit702d1f14e5ed3774279c02464723fdea6d77d31c (patch)
tree8feb2f50150204df550a4e4516ad24176a617616 /src/third_party
parenta237bb9697baa1b168c790b1d22fe1bb05c2538d (diff)
downloadmongo-702d1f14e5ed3774279c02464723fdea6d77d31c.tar.gz
Import wiredtiger: cc2f15f595b16479affd73791c207da334453bcc from branch mongodb-3.4
ref: d6659de8d7..cc2f15f595 for: 3.4.3 WT-3206 bug: core dump on NULL page index WT-3218 unexpected checkpoint ordering failures
Diffstat (limited to 'src/third_party')
-rw-r--r--src/third_party/wiredtiger/bench/wtperf/runners/many-table-stress.wtperf19
-rw-r--r--src/third_party/wiredtiger/import.data2
-rw-r--r--src/third_party/wiredtiger/src/btree/bt_split.c71
-rw-r--r--src/third_party/wiredtiger/src/conn/conn_dhandle.c8
4 files changed, 76 insertions, 24 deletions
diff --git a/src/third_party/wiredtiger/bench/wtperf/runners/many-table-stress.wtperf b/src/third_party/wiredtiger/bench/wtperf/runners/many-table-stress.wtperf
new file mode 100644
index 00000000000..51d0bb0dd9d
--- /dev/null
+++ b/src/third_party/wiredtiger/bench/wtperf/runners/many-table-stress.wtperf
@@ -0,0 +1,19 @@
+# Create a set of tables with uneven distribution of data
+conn_config="cache_size=1G,eviction=(threads_max=8),file_manager=(close_idle_time=100000),checkpoint=(wait=20,log_size=2GB),statistics=(fast),statistics_log=(wait=5,json),session_max=1000"
+table_config="type=file"
+table_count=5000
+icount=0
+random_range=1000000000
+pareto=10
+range_partition=true
+report_interval=5
+
+run_ops=1000000
+populate_threads=0
+icount=0
+threads=((count=60,inserts=1))
+
+# Warn if a latency over 1 second is seen
+max_latency=1000
+sample_interval=5
+sample_rate=1
diff --git a/src/third_party/wiredtiger/import.data b/src/third_party/wiredtiger/import.data
index fe6ec8bb905..a4f6891fd33 100644
--- a/src/third_party/wiredtiger/import.data
+++ b/src/third_party/wiredtiger/import.data
@@ -1,5 +1,5 @@
{
- "commit": "d6659de8d742b9562d08c1ba5138be881f8e24fa",
+ "commit": "cc2f15f595b16479affd73791c207da334453bcc",
"github": "wiredtiger/wiredtiger.git",
"branch": "mongodb-3.4"
}
diff --git a/src/third_party/wiredtiger/src/btree/bt_split.c b/src/third_party/wiredtiger/src/btree/bt_split.c
index 45550ff627f..6b2100ec7e3 100644
--- a/src/third_party/wiredtiger/src/btree/bt_split.c
+++ b/src/third_party/wiredtiger/src/btree/bt_split.c
@@ -187,7 +187,7 @@ __split_safe_free(WT_SESSION_IMPL *session,
exclusive = true;
if (exclusive) {
- __wt_free(session, p);
+ __wt_overwrite_and_free_len(session, p, s);
return (0);
}
@@ -640,12 +640,12 @@ __split_root(WT_SESSION_IMPL *session, WT_PAGE *root)
/* Start making real changes to the tree, errors are fatal. */
complete = WT_ERR_PANIC;
- /* Get a generation for this split, mark the root page. */
- split_gen = __wt_atomic_addv64(&S2C(session)->split_gen, 1);
- root->pg_intl_split_gen = split_gen;
-
- /* Prepare the WT_REFs for the move. */
- __split_ref_prepare(session, alloc_index, split_gen, false);
+ /*
+ * Prepare the WT_REFs for the move: this requires a stable split
+ * generation to block splits in newly created pages, so get one.
+ */
+ WT_ENTER_PAGE_INDEX(session);
+ __split_ref_prepare(session, alloc_index, session->split_gen, false);
/*
* Confirm the root page's index hasn't moved, then update it, which
@@ -655,6 +655,16 @@ __split_root(WT_SESSION_IMPL *session, WT_PAGE *root)
WT_INTL_INDEX_SET(root, alloc_index);
alloc_index = NULL;
+ WT_LEAVE_PAGE_INDEX(session);
+
+ /*
+ * Get a generation for this split, mark the root page. This must be
+ * after the new index is swapped into place in order to know that no
+ * readers are looking at the old index.
+ */
+ split_gen = __wt_atomic_addv64(&S2C(session)->split_gen, 1);
+ root->pg_intl_split_gen = split_gen;
+
#ifdef HAVE_DIAGNOSTIC
WT_WITH_PAGE_INDEX(session,
ret = __split_verify_root(session, root));
@@ -825,10 +835,6 @@ __split_parent(WT_SESSION_IMPL *session, WT_REF *ref, WT_REF **ref_new,
/* Start making real changes to the tree, errors are fatal. */
complete = WT_ERR_PANIC;
- /* Get a generation for this split, mark the parent page. */
- split_gen = __wt_atomic_addv64(&S2C(session)->split_gen, 1);
- parent->pg_intl_split_gen = split_gen;
-
/*
* Confirm the parent page's index hasn't moved then update it, which
* makes the split visible to threads descending the tree.
@@ -838,6 +844,14 @@ __split_parent(WT_SESSION_IMPL *session, WT_REF *ref, WT_REF **ref_new,
alloc_index = NULL;
/*
+ * Get a generation for this split, mark the page. This must be after
+ * the new index is swapped into place in order to know that no readers
+ * are looking at the old index.
+ */
+ split_gen = __wt_atomic_addv64(&S2C(session)->split_gen, 1);
+ parent->pg_intl_split_gen = split_gen;
+
+ /*
* If discarding the page's original WT_REF field, reset it to split.
* Threads cursoring through the tree were blocked because that WT_REF
* state was set to locked. Changing the locked state to split unblocks
@@ -1154,23 +1168,34 @@ __split_internal(WT_SESSION_IMPL *session, WT_PAGE *parent, WT_PAGE *page)
/* Start making real changes to the tree, errors are fatal. */
complete = WT_ERR_PANIC;
- /* Get a generation for this split, mark the page. */
- split_gen = __wt_atomic_addv64(&S2C(session)->split_gen, 1);
- page->pg_intl_split_gen = split_gen;
-
- /* Prepare the WT_REFs for the move. */
- __split_ref_prepare(session, alloc_index, split_gen, true);
+ /*
+ * Prepare the WT_REFs for the move: this requires a stable split
+ * generation to block splits in newly created pages, so get one.
+ */
+ WT_ENTER_PAGE_INDEX(session);
+ __split_ref_prepare(session, alloc_index, session->split_gen, true);
/* Split into the parent. */
- WT_ERR(__split_parent(session, page_ref, alloc_index->index,
- alloc_index->entries, parent_incr, false, false));
+ if ((ret = __split_parent(session, page_ref, alloc_index->index,
+ alloc_index->entries, parent_incr, false, false)) == 0) {
+ /*
+ * Confirm the page's index hasn't moved, then update it, which
+ * makes the split visible to threads descending the tree.
+ */
+ WT_ASSERT(session, WT_INTL_INDEX_GET_SAFE(page) == pindex);
+ WT_INTL_INDEX_SET(page, replace_index);
+ }
+
+ WT_LEAVE_PAGE_INDEX(session);
+ WT_ERR(ret);
/*
- * Confirm the page's index hasn't moved, then update it, which makes
- * the split visible to threads descending the tree.
+ * Get a generation for this split, mark the parent page. This must be
+ * after the new index is swapped into place in order to know that no
+ * readers are looking at the old index.
*/
- WT_ASSERT(session, WT_INTL_INDEX_GET_SAFE(page) == pindex);
- WT_INTL_INDEX_SET(page, replace_index);
+ split_gen = __wt_atomic_addv64(&S2C(session)->split_gen, 1);
+ page->pg_intl_split_gen = split_gen;
#ifdef HAVE_DIAGNOSTIC
WT_WITH_PAGE_INDEX(session,
diff --git a/src/third_party/wiredtiger/src/conn/conn_dhandle.c b/src/third_party/wiredtiger/src/conn/conn_dhandle.c
index 866b8633f71..99213c5b557 100644
--- a/src/third_party/wiredtiger/src/conn/conn_dhandle.c
+++ b/src/third_party/wiredtiger/src/conn/conn_dhandle.c
@@ -38,6 +38,14 @@ __wt_conn_dhandle_alloc(
WT_DECL_RET;
uint64_t bucket;
+ /*
+ * Ensure no one beat us to creating the handle now that we hold the
+ * write lock.
+ */
+ if ((ret =
+ __wt_conn_dhandle_find(session, uri, checkpoint)) != WT_NOTFOUND)
+ return (ret);
+
WT_RET(__wt_calloc_one(session, &dhandle));
__wt_rwlock_init(session, &dhandle->rwlock);