diff options
author | Luke Chen <luke.chen@mongodb.com> | 2022-07-08 16:30:47 +1000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2022-07-08 06:57:12 +0000 |
commit | 670405fd859397cff33d398dbee6c736db45ffe2 (patch) | |
tree | bf8252de2f5e7fd4edd2aa2e84dc4444e72516cc | |
parent | aef40887716046f0ac3503d3142630a23ae8b1e5 (diff) | |
download | mongo-670405fd859397cff33d398dbee6c736db45ffe2.tar.gz |
Import wiredtiger: ccb6525c8d166c87fefa9ab87d6db9270ac1fc46 from branch mongodb-5.0
ref: 4aea16c7c5..ccb6525c8d
for: 5.0.10
WT-8425 Push updates with the same commit timestamps in the out_of_order_ts_updates vector in hs_rec.c.
-rw-r--r-- | src/third_party/wiredtiger/import.data | 2 | ||||
-rw-r--r-- | src/third_party/wiredtiger/src/history/hs_rec.c | 2 | ||||
-rw-r--r-- | src/third_party/wiredtiger/src/reconcile/rec_visibility.c | 14 | ||||
-rw-r--r-- | src/third_party/wiredtiger/test/suite/test_prepare17.py | 122 |
4 files changed, 2 insertions, 138 deletions
diff --git a/src/third_party/wiredtiger/import.data b/src/third_party/wiredtiger/import.data index 52bea0dda15..334d0e67426 100644 --- a/src/third_party/wiredtiger/import.data +++ b/src/third_party/wiredtiger/import.data @@ -2,5 +2,5 @@ "vendor": "wiredtiger", "github": "wiredtiger/wiredtiger.git", "branch": "mongodb-5.0", - "commit": "4aea16c7c5e270de8bb6ef2c1ca5d1a32d30638c" + "commit": "ccb6525c8d166c87fefa9ab87d6db9270ac1fc46" } diff --git a/src/third_party/wiredtiger/src/history/hs_rec.c b/src/third_party/wiredtiger/src/history/hs_rec.c index 9f12c3fbdb5..37739540282 100644 --- a/src/third_party/wiredtiger/src/history/hs_rec.c +++ b/src/third_party/wiredtiger/src/history/hs_rec.c @@ -463,7 +463,7 @@ __wt_hs_insert_updates(WT_SESSION_IMPL *session, WT_RECONCILE *r, WT_MULTI *mult WT_ERR(__wt_update_vector_push(&out_of_order_ts_updates, min_ts_upd)); out_of_order_ts_upd = min_ts_upd; } else if (upd->prepare_state != WT_PREPARE_INPROGRESS && - (min_ts_upd == NULL || upd->start_ts < min_ts_upd->start_ts)) + (min_ts_upd == NULL || upd->start_ts <= min_ts_upd->start_ts)) min_ts_upd = upd; WT_ERR(__wt_update_vector_push(&updates, upd)); diff --git a/src/third_party/wiredtiger/src/reconcile/rec_visibility.c b/src/third_party/wiredtiger/src/reconcile/rec_visibility.c index 64ff9d361ae..ba947c13ac4 100644 --- a/src/third_party/wiredtiger/src/reconcile/rec_visibility.c +++ b/src/third_party/wiredtiger/src/reconcile/rec_visibility.c @@ -255,20 +255,6 @@ __timestamp_out_of_order_fix(WT_SESSION_IMPL *session, WT_TIME_WINDOW *select_tw select_tw->start_ts = select_tw->stop_ts; return (true); } - - /* - * As per the time window validation the durable_start_ts must not be greater than the stop_ts. - * Hence, if the stop_ts is less than durable_start_ts and greater than start_ts, make - * durable_start_ts equal to stop_ts. - */ - if ((select_tw->start_ts != select_tw->stop_ts) && - (select_tw->stop_ts < select_tw->durable_start_ts)) { - __wt_verbose(session, WT_VERB_TIMESTAMP, - "Warning: fixing out-of-order timestamps remove earlier than value; time window %s", - __wt_time_window_to_string(select_tw, time_string)); - - select_tw->durable_start_ts = select_tw->stop_ts; - } return (false); } diff --git a/src/third_party/wiredtiger/test/suite/test_prepare17.py b/src/third_party/wiredtiger/test/suite/test_prepare17.py deleted file mode 100644 index ae514b3865f..00000000000 --- a/src/third_party/wiredtiger/test/suite/test_prepare17.py +++ /dev/null @@ -1,122 +0,0 @@ -#!/usr/bin/env python -# -# Public Domain 2014-present MongoDB, Inc. -# Public Domain 2008-2014 WiredTiger, Inc. -# -# This is free and unencumbered software released into the public domain. -# -# Anyone is free to copy, modify, publish, use, compile, sell, or -# distribute this software, either in source code form or as a compiled -# binary, for any purpose, commercial or non-commercial, and by any -# means. -# -# In jurisdictions that recognize copyright laws, the author or authors -# of this software dedicate any and all copyright interest in the -# software to the public domain. We make this dedication for the benefit -# of the public at large and to the detriment of our heirs and -# successors. We intend this dedication to be an overt act of -# relinquishment in perpetuity of all present and future rights to this -# software under copyright law. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -# IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR -# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -# OTHER DEALINGS IN THE SOFTWARE. - -import wiredtiger, wttest -from wtscenario import make_scenarios -from helper import simulate_crash_restart - -# test_prepare17.py -# The following test is to verify that if the out of order commit timestamp(for a transaction, say T2) lies between -# previous commit and durable timestamps(for a transaction, say T1), the durable timestamp of T1 changes to -# the commit timestamp of T2. -class test_prepare17(wttest.WiredTigerTestCase): - session_config = 'isolation=snapshot' - uri = 'table:test_prepare17' - nrows = 1000 - value1 = 'aaaaa' - value2 = 'bbbbb' - - key_format_values = [ - ('integer-row', dict(key_format='i')), - ('column', dict(key_format='r')), - ] - update = [ - ('prepare', dict(prepare=True)), - ('non-prepare', dict(prepare=False)), - ] - scenarios = make_scenarios(key_format_values, update) - - def test_prepare(self): - create_params = 'key_format={},value_format=S'.format(self.key_format) - self.session.create(self.uri, create_params) - cursor = self.session.open_cursor(self.uri) - - # Transaction one - self.session.begin_transaction() - for i in range(1, self.nrows + 1): - cursor[i] = self.value1 - self.session.prepare_transaction('prepare_timestamp=' + self.timestamp_str(2)) - self.session.commit_transaction('commit_timestamp=' + self.timestamp_str(3)+ ',durable_timestamp=' + self.timestamp_str(6)) - - # In the case below, the commit timestamp lies between the previous commit and durable timestamps. - # Internally, WiredTiger changes the durable timestamp of Transaction one, i.e. 6 to the commit timestamp - # of the transaction below, i.e, 4. - # As per the time window validation the commit timestamp cannot be in between any previous commit and - # durable timestamps. - # - # Note: The scenario where commit timestamp lies between the previous commit and durable timestamps - # is not expected from MongoDB, but WiredTiger API can allow it. - if self.prepare: - self.session.begin_transaction() - for i in range(1, self.nrows + 1): - cursor[i] = self.value2 - self.session.prepare_transaction('prepare_timestamp=' + self.timestamp_str(3)) - self.session.commit_transaction('commit_timestamp=' + self.timestamp_str(4) + ',durable_timestamp=' + self.timestamp_str(7)) - else: - self.session.begin_transaction() - for i in range(1, self.nrows + 1): - cursor[i] = self.value2 - self.session.commit_transaction('commit_timestamp=' + self.timestamp_str(4)) - - # Time window validation occurs as part of checkpoint. - self.session.checkpoint() - - def test_prepare_insert_remove(self): - if not self.prepare: - return - - create_params = 'key_format={},value_format=S'.format(self.key_format) - self.session.create(self.uri, create_params) - cursor = self.session.open_cursor(self.uri) - - self.session.begin_transaction() - for i in range(1, self.nrows + 1): - cursor[i] = self.value1 - self.session.commit_transaction('commit_timestamp=' + self.timestamp_str(2)) - - # Transaction 2 - self.session.begin_transaction() - for i in range(1, self.nrows + 1): - cursor[i] = self.value2 - cursor.set_key(i) - cursor.remove() - self.session.prepare_transaction('prepare_timestamp=' + self.timestamp_str(3)) - self.session.commit_transaction('commit_timestamp=' + self.timestamp_str(4) + ',durable_timestamp=' + self.timestamp_str(7)) - - self.conn.set_timestamp('stable_timestamp=' + self.timestamp_str(6)) - self.session.checkpoint() - simulate_crash_restart(self, ".", "RESTART") - - # Update in Transaction2 should be removed as the stable timestamp (6) is less than the durable timestamp (7). - cursor = self.session.open_cursor(self.uri) - self.session.begin_transaction() - for i in range(1, self.nrows + 1): - cursor.set_key(i) - cursor.search() - self.assertEqual(cursor.get_value(), self.value1) - self.session.rollback_transaction() |