summaryrefslogtreecommitdiff
path: root/src/third_party/wiredtiger/src/btree
diff options
context:
space:
mode:
authorAlex Gorrod <alexander.gorrod@mongodb.com>2017-08-31 16:44:19 +1000
committerAlex Gorrod <alexander.gorrod@mongodb.com>2017-08-31 16:46:48 +1000
commit2730bd049022954bc7cd43392be20e6d54cf330d (patch)
treecf451c093d9b999e4da33b78d9d912b816864a93 /src/third_party/wiredtiger/src/btree
parentac84a0d028eff2b8ca42817d998cb8b34563816c (diff)
downloadmongo-2730bd049022954bc7cd43392be20e6d54cf330d.tar.gz
Import wiredtiger: bacc9ada53a46128642343c162a993d15bc80b57 from branch mongodb-3.6
ref: b055251678..bacc9ada53 for: 3.5.13 WT-3386 Fix test/checkpoint with timestamps WT-3454 Enhance Python test_timestamp03 to test with logged and non-logged tables WT-3476 Make tables first class data handles WT-3495 Don't allow log truncation if log cursors are open WT-3516 Some potential cursor open performance improvements WT-3522 Coverity 1379736, full build Friday lint WT-3523 Fix incorrect use of configure API in test format WT-3525 test_timestamp07 failing automated testing on develop WT-3527 Use power of two hash table size WT-3528 Don't allow setting a commit timestamp on a non-running transaction WT-3529 Add undocumented debug API WT-3535 Fix ASAN build on Jenkins WT-3536 Enable more strict compiler options for clang WT-3538 Misaligned reads when using the lookaside table and timestamps WT-3539 Enhance documentation around APIs that need exclusive handle access WT-3540 Test failure running recovery test case WT-3541 Python test_reconfig02 timeout on the PPC WT-3542 Python test_stats_log_on_json_with_tables timeout on the PPC WT-3544 WT rollback_to_stable hits "memory stomping bug" WT-3545 Avoid array-bounds warnings with gcc 7 WT-3546 Coverity 1380021 dereference before NULL check, lint WT-3547 Hang in test/fops on LSM table read lock WT-3549 Deadlock in test_schema03 WT-3550 Minor output changes to debug_info
Diffstat (limited to 'src/third_party/wiredtiger/src/btree')
-rw-r--r--src/third_party/wiredtiger/src/btree/bt_ovfl.c2
-rw-r--r--src/third_party/wiredtiger/src/btree/bt_read.c20
-rw-r--r--src/third_party/wiredtiger/src/btree/bt_rebalance.c4
-rw-r--r--src/third_party/wiredtiger/src/btree/bt_ret.c18
-rw-r--r--src/third_party/wiredtiger/src/btree/bt_slvg.c8
-rw-r--r--src/third_party/wiredtiger/src/btree/bt_split.c4
6 files changed, 34 insertions, 22 deletions
diff --git a/src/third_party/wiredtiger/src/btree/bt_ovfl.c b/src/third_party/wiredtiger/src/btree/bt_ovfl.c
index fab38f3cc8d..ebd0eb0cb71 100644
--- a/src/third_party/wiredtiger/src/btree/bt_ovfl.c
+++ b/src/third_party/wiredtiger/src/btree/bt_ovfl.c
@@ -132,7 +132,7 @@ __ovfl_cache(WT_SESSION_IMPL *session, WT_PAGE *page, WT_CELL_UNPACK *unpack)
WT_ERR(__wt_realloc_def(session,
&track->remove_allocated, track->remove_next + 1, &track->remove));
track->remove[track->remove_next].cell = unpack->cell;
- WT_ERR(__wt_strndup(session,
+ WT_ERR(__wt_memdup(session,
tmp->data, tmp->size, &track->remove[track->remove_next].data));
track->remove[track->remove_next].size = tmp->size;
++track->remove_next;
diff --git a/src/third_party/wiredtiger/src/btree/bt_read.c b/src/third_party/wiredtiger/src/btree/bt_read.c
index 0c3cb026421..26ddde8d6ad 100644
--- a/src/third_party/wiredtiger/src/btree/bt_read.c
+++ b/src/third_party/wiredtiger/src/btree/bt_read.c
@@ -136,8 +136,9 @@ __las_page_instantiate(WT_SESSION_IMPL *session,
WT_CURSOR *cursor;
WT_CURSOR_BTREE cbt;
WT_DECL_ITEM(current_key);
- WT_ITEM las_addr, las_key, las_timestamp, las_value;
WT_DECL_RET;
+ WT_DECL_TIMESTAMP(timestamp)
+ WT_ITEM las_addr, las_key, las_timestamp, las_value;
WT_PAGE *page;
WT_UPDATE *first_upd, *last_upd, *upd;
size_t incr, total_incr;
@@ -154,7 +155,6 @@ __las_page_instantiate(WT_SESSION_IMPL *session,
current_recno = recno = WT_RECNO_OOB;
session_flags = 0; /* [-Werror=maybe-uninitialized] */
WT_CLEAR(las_key);
- WT_CLEAR(las_timestamp);
__wt_btcur_init(session, &cbt);
__wt_btcur_open(&cbt);
@@ -176,6 +176,7 @@ __las_page_instantiate(WT_SESSION_IMPL *session,
*/
las_addr.data = addr;
las_addr.size = addr_size;
+ las_timestamp.size = 0;
cursor->set_key(cursor, read_id, &las_addr,
(uint64_t)0, (uint32_t)0, &las_timestamp, &las_key);
if ((ret = cursor->search_near(cursor, &exact)) == 0 && exact < 0)
@@ -195,13 +196,16 @@ __las_page_instantiate(WT_SESSION_IMPL *session,
/*
* If the on-page value has become globally visible, this record
- * is no longer needed. We clear the las_timestamp structure
- * above to avoid reading uninitialized memory here when
- * timestamps are disabled (even though it is unused in that
- * case).
+ * is no longer needed.
+ *
+ * Copy the timestamp from the cursor to avoid unaligned reads.
*/
+#ifdef HAVE_TIMESTAMPS
+ WT_ASSERT(session, las_timestamp.size == WT_TIMESTAMP_SIZE);
+ memcpy(&timestamp, las_timestamp.data, las_timestamp.size);
+#endif
if (__wt_txn_visible_all(
- session, las_txnid, las_timestamp.data))
+ session, las_txnid, WT_TIMESTAMP_NULL(&timestamp)))
continue;
/* Allocate the WT_UPDATE structure. */
@@ -213,7 +217,7 @@ __las_page_instantiate(WT_SESSION_IMPL *session,
upd->txnid = upd_txnid;
#ifdef HAVE_TIMESTAMPS
WT_ASSERT(session, las_timestamp.size == WT_TIMESTAMP_SIZE);
- __wt_timestamp_set(&upd->timestamp, las_timestamp.data);
+ memcpy(&upd->timestamp, las_timestamp.data, las_timestamp.size);
#endif
switch (page->type) {
diff --git a/src/third_party/wiredtiger/src/btree/bt_rebalance.c b/src/third_party/wiredtiger/src/btree/bt_rebalance.c
index 47c7888af35..a616ab7fc42 100644
--- a/src/third_party/wiredtiger/src/btree/bt_rebalance.c
+++ b/src/third_party/wiredtiger/src/btree/bt_rebalance.c
@@ -83,7 +83,7 @@ __rebalance_leaf_append(WT_SESSION_IMPL *session,
WT_RET(__wt_calloc_one(session, &copy_addr));
copy->addr = copy_addr;
- WT_RET(__wt_strndup(session, addr, addr_len, &copy_addr->addr));
+ WT_RET(__wt_memdup(session, addr, addr_len, &copy_addr->addr));
copy_addr->size = (uint8_t)addr_len;
copy_addr->type = (uint8_t)addr_type;
@@ -110,7 +110,7 @@ __rebalance_fl_append(WT_SESSION_IMPL *session,
session, &rs->fl_allocated, rs->fl_next + 1, &rs->fl));
copy = &rs->fl[rs->fl_next++];
- WT_RET(__wt_strndup(session, addr, addr_len, &copy->addr));
+ WT_RET(__wt_memdup(session, addr, addr_len, &copy->addr));
copy->size = (uint8_t)addr_len;
copy->type = 0;
diff --git a/src/third_party/wiredtiger/src/btree/bt_ret.c b/src/third_party/wiredtiger/src/btree/bt_ret.c
index 120daed3935..49a2481062e 100644
--- a/src/third_party/wiredtiger/src/btree/bt_ret.c
+++ b/src/third_party/wiredtiger/src/btree/bt_ret.c
@@ -129,9 +129,17 @@ __value_return(WT_SESSION_IMPL *session, WT_CURSOR_BTREE *cbt)
}
/*
+ * When threads race modifying a record, we can end up with more than the usual
+ * maximum number of modifications in an update list. We'd prefer not to
+ * allocate memory in a return path, so add a few additional slots to the array
+ * we use to build up a list of modify records to apply.
+ */
+#define WT_MODIFY_ARRAY_SIZE (WT_MAX_MODIFY_UPDATE + 10)
+
+/*
* __value_return_upd --
* Change the cursor to reference an internal update structure return
- * value.
+ * value.
*/
static inline int
__value_return_upd(
@@ -139,7 +147,7 @@ __value_return_upd(
{
WT_CURSOR *cursor;
WT_DECL_RET;
- WT_UPDATE **listp, *list[WT_MAX_MODIFY_UPDATE];
+ WT_UPDATE **listp, *list[WT_MODIFY_ARRAY_SIZE];
u_int i;
size_t allocated_bytes;
@@ -178,12 +186,12 @@ __value_return_upd(
* avoid memory allocation in normal cases, but we have
* to handle the edge cases too.
*/
- if (i >= WT_MAX_MODIFY_UPDATE) {
- if (i == WT_MAX_MODIFY_UPDATE)
+ if (i >= WT_MODIFY_ARRAY_SIZE) {
+ if (i == WT_MODIFY_ARRAY_SIZE)
listp = NULL;
WT_ERR(__wt_realloc_def(
session, &allocated_bytes, i + 1, &listp));
- if (i == WT_MAX_MODIFY_UPDATE)
+ if (i == WT_MODIFY_ARRAY_SIZE)
memcpy(listp, list, sizeof(list));
}
listp[i++] = upd;
diff --git a/src/third_party/wiredtiger/src/btree/bt_slvg.c b/src/third_party/wiredtiger/src/btree/bt_slvg.c
index 1f686d904ec..2b5fb8b2db0 100644
--- a/src/third_party/wiredtiger/src/btree/bt_slvg.c
+++ b/src/third_party/wiredtiger/src/btree/bt_slvg.c
@@ -496,7 +496,7 @@ __slvg_trk_init(WT_SESSION_IMPL *session,
trk->shared->ref = 1;
trk->ss = ss;
- WT_ERR(__wt_strndup(session, addr, addr_size, &trk->trk_addr));
+ WT_ERR(__wt_memdup(session, addr, addr_size, &trk->trk_addr));
trk->trk_addr_size = (uint8_t)addr_size;
trk->trk_size = size;
trk->trk_gen = gen;
@@ -683,7 +683,7 @@ __slvg_trk_leaf_ovfl(
WT_CELL_FOREACH(btree, dsk, cell, unpack, i) {
__wt_cell_unpack(cell, unpack);
if (unpack->ovfl) {
- WT_RET(__wt_strndup(session, unpack->data,
+ WT_RET(__wt_memdup(session, unpack->data,
unpack->size, &trk->trk_ovfl_addr[ovfl_cnt].addr));
trk->trk_ovfl_addr[ovfl_cnt].size =
(uint8_t)unpack->size;
@@ -1171,7 +1171,7 @@ __slvg_col_build_internal(
ref->page = NULL;
WT_ERR(__wt_calloc_one(session, &addr));
- WT_ERR(__wt_strndup(
+ WT_ERR(__wt_memdup(
session, trk->trk_addr, trk->trk_addr_size, &addr->addr));
addr->size = trk->trk_addr_size;
addr->type =
@@ -1824,7 +1824,7 @@ __slvg_row_build_internal(
ref->page = NULL;
WT_ERR(__wt_calloc_one(session, &addr));
- WT_ERR(__wt_strndup(
+ WT_ERR(__wt_memdup(
session, trk->trk_addr, trk->trk_addr_size, &addr->addr));
addr->size = trk->trk_addr_size;
addr->type =
diff --git a/src/third_party/wiredtiger/src/btree/bt_split.c b/src/third_party/wiredtiger/src/btree/bt_split.c
index ac90d6693d3..42fd1bd1bd2 100644
--- a/src/third_party/wiredtiger/src/btree/bt_split.c
+++ b/src/third_party/wiredtiger/src/btree/bt_split.c
@@ -290,7 +290,7 @@ __split_ref_move(WT_SESSION_IMPL *session, WT_PAGE *from_home,
if (ref_addr != NULL && !__wt_off_page(from_home, ref_addr)) {
__wt_cell_unpack((WT_CELL *)ref_addr, &unpack);
WT_RET(__wt_calloc_one(session, &addr));
- if ((ret = __wt_strndup(
+ if ((ret = __wt_memdup(
session, unpack.data, unpack.size, &addr->addr)) != 0) {
__wt_free(session, addr);
return (ret);
@@ -1612,7 +1612,7 @@ __wt_multi_to_ref(WT_SESSION_IMPL *session,
ref->addr = addr;
addr->size = multi->addr.size;
addr->type = multi->addr.type;
- WT_RET(__wt_strndup(session,
+ WT_RET(__wt_memdup(session,
multi->addr.addr, addr->size, &addr->addr));
ref->state = WT_REF_DISK;
}