diff options
author | Chenhao Qu <chenhao.qu@mongodb.com> | 2021-12-22 18:32:22 +1100 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2021-12-22 07:57:32 +0000 |
commit | 3ba6bce7d62362b42de15eb2b4961362e0864e9c (patch) | |
tree | 30682709c42aa836a3fb8f23f223640edc76a41b /src/third_party | |
parent | f812e1dadc7d7cf3c9a9227dd81949acaf9c4ad8 (diff) | |
download | mongo-3ba6bce7d62362b42de15eb2b4961362e0864e9c.tar.gz |
Import wiredtiger: 267bc7dbff53702921e0c1b7a14ba0a50b4caafb from branch mongodb-master
ref: 741977b480..267bc7dbff
for: 5.3.0
WT-8595 Fix assertion during recovery if snapshot has > 255 txns
Diffstat (limited to 'src/third_party')
-rw-r--r-- | src/third_party/wiredtiger/import.data | 2 | ||||
-rw-r--r-- | src/third_party/wiredtiger/src/txn/txn_recover.c | 2 | ||||
-rw-r--r-- | src/third_party/wiredtiger/test/suite/test_bug027.py | 97 |
3 files changed, 99 insertions, 2 deletions
diff --git a/src/third_party/wiredtiger/import.data b/src/third_party/wiredtiger/import.data index 2cab7a28646..b730866f116 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-master", - "commit": "741977b48041935e4333e4c0c036fb710c96c41a" + "commit": "267bc7dbff53702921e0c1b7a14ba0a50b4caafb" } diff --git a/src/third_party/wiredtiger/src/txn/txn_recover.c b/src/third_party/wiredtiger/src/txn/txn_recover.c index a80a39397a4..7195cbc9c10 100644 --- a/src/third_party/wiredtiger/src/txn/txn_recover.c +++ b/src/third_party/wiredtiger/src/txn/txn_recover.c @@ -475,7 +475,7 @@ __recovery_set_checkpoint_snapshot(WT_SESSION_IMPL *session) WT_CONFIG_ITEM k; WT_CONNECTION_IMPL *conn; WT_DECL_RET; - uint8_t counter; + uint32_t counter; char *sys_config; sys_config = NULL; diff --git a/src/third_party/wiredtiger/test/suite/test_bug027.py b/src/third_party/wiredtiger/test/suite/test_bug027.py new file mode 100644 index 00000000000..7863fa052b1 --- /dev/null +++ b/src/third_party/wiredtiger/test/suite/test_bug027.py @@ -0,0 +1,97 @@ +#!/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 wttest +from helper import simulate_crash_restart +from wtdataset import SimpleDataSet +from wtscenario import make_scenarios + +# test_bug027.py +# Attempt to create a snapshot with more than 256 transactions in it. +class test_bug(wttest.WiredTigerTestCase): + conn_config = 'session_max=512' + session_config = 'isolation=snapshot' + + key_format='i' + value_format='S' + + def check(self, ds, nrows, value, lastvalue): + cursor = self.session.open_cursor(ds.uri) + self.session.begin_transaction() + for k, v in cursor: + if k == ds.key(nrows): + self.assertEqual(v, lastvalue) + else: + self.assertEqual(v, value) + self.session.rollback_transaction() + cursor.close() + + def test_bug(self): + uri = "table:bug026" + nrows = 1000 + ntxns = 500 + + ds = SimpleDataSet( + self, uri, 0, key_format=self.key_format, value_format=self.value_format, + config='log=(enabled=false)') + ds.populate() + + value_a = "aaaaa" * 100 + value_b = "bbbbb" * 100 + value_c = "ccccc" * 100 + + # Write some data. + cursor = self.session.open_cursor(uri) + self.session.begin_transaction() + for i in range(1, nrows + 1): + cursor[ds.key(i)] = value_a + self.session.commit_transaction() + self.session.checkpoint() + + # Create a bunch of transactions and leave all but one hanging. + sessions = {} + cursors = {} + for i in range(1, ntxns + 1): + sessions[i] = self.conn.open_session() + cursors[i] = sessions[i].open_cursor(uri) + sessions[i].begin_transaction() + cursors[i][ds.key(i)] = value_b + self.session.begin_transaction() + cursor[ds.key(nrows)] = value_c + self.session.commit_transaction() + self.session.checkpoint() + + # Should not see value_b. + self.check(ds, nrows, value_a, value_c) + + # Now crash. + simulate_crash_restart(self, ".", "RESTART") + + # Should still not see value_b. + self.check(ds, nrows, value_a, value_c) + |