summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChenhao Qu <chenhao.qu@mongodb.com>2021-12-22 18:32:22 +1100
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2021-12-22 07:57:32 +0000
commit3ba6bce7d62362b42de15eb2b4961362e0864e9c (patch)
tree30682709c42aa836a3fb8f23f223640edc76a41b
parentf812e1dadc7d7cf3c9a9227dd81949acaf9c4ad8 (diff)
downloadmongo-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
-rw-r--r--src/third_party/wiredtiger/import.data2
-rw-r--r--src/third_party/wiredtiger/src/txn/txn_recover.c2
-rw-r--r--src/third_party/wiredtiger/test/suite/test_bug027.py97
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)
+