diff options
author | Alex Gorrod <alexander.gorrod@mongodb.com> | 2017-08-31 16:44:19 +1000 |
---|---|---|
committer | Alex Gorrod <alexander.gorrod@mongodb.com> | 2017-08-31 16:46:48 +1000 |
commit | 2730bd049022954bc7cd43392be20e6d54cf330d (patch) | |
tree | cf451c093d9b999e4da33b78d9d912b816864a93 /src/third_party/wiredtiger/src/btree | |
parent | ac84a0d028eff2b8ca42817d998cb8b34563816c (diff) | |
download | mongo-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.c | 2 | ||||
-rw-r--r-- | src/third_party/wiredtiger/src/btree/bt_read.c | 20 | ||||
-rw-r--r-- | src/third_party/wiredtiger/src/btree/bt_rebalance.c | 4 | ||||
-rw-r--r-- | src/third_party/wiredtiger/src/btree/bt_ret.c | 18 | ||||
-rw-r--r-- | src/third_party/wiredtiger/src/btree/bt_slvg.c | 8 | ||||
-rw-r--r-- | src/third_party/wiredtiger/src/btree/bt_split.c | 4 |
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(×tamp, las_timestamp.data, las_timestamp.size); +#endif if (__wt_txn_visible_all( - session, las_txnid, las_timestamp.data)) + session, las_txnid, WT_TIMESTAMP_NULL(×tamp))) 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, ©_addr)); copy->addr = copy_addr; - WT_RET(__wt_strndup(session, addr, addr_len, ©_addr->addr)); + WT_RET(__wt_memdup(session, addr, addr_len, ©_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, ©->addr)); + WT_RET(__wt_memdup(session, addr, addr_len, ©->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; } |