summaryrefslogtreecommitdiff
path: root/src/third_party/wiredtiger/test/suite/test_timestamp20.py
diff options
context:
space:
mode:
authorLuke Chen <luke.chen@mongodb.com>2020-10-20 16:38:49 +1100
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2020-10-20 06:35:06 +0000
commitd0c4d5770387b73d8074e24ac0134f6e70d34078 (patch)
treeb0a447e9280f9665cc7981bc64087a29130b55e9 /src/third_party/wiredtiger/test/suite/test_timestamp20.py
parent94da5dc43e80e969099dbd86a24c8d34e1c2d372 (diff)
downloadmongo-d0c4d5770387b73d8074e24ac0134f6e70d34078.tar.gz
Import wiredtiger: f827562f2b486e000665c97ea81674012d5a765b from branch mongodb-5.0
ref: 6614fa3dca..f827562f2b for: 4.9.0 WT-6798 Utilize Arm LSE atomics and the correct strength barriers WT-6808 Documentation: add top level architecture picture WT-6812 Fix "out-of-order fixup" potentially corrupting historical values
Diffstat (limited to 'src/third_party/wiredtiger/test/suite/test_timestamp20.py')
-rw-r--r--src/third_party/wiredtiger/test/suite/test_timestamp20.py79
1 files changed, 78 insertions, 1 deletions
diff --git a/src/third_party/wiredtiger/test/suite/test_timestamp20.py b/src/third_party/wiredtiger/test/suite/test_timestamp20.py
index 69aec301a47..63a2503d915 100644
--- a/src/third_party/wiredtiger/test/suite/test_timestamp20.py
+++ b/src/third_party/wiredtiger/test/suite/test_timestamp20.py
@@ -37,7 +37,7 @@ class test_timestamp20(wttest.WiredTigerTestCase):
conn_config = 'cache_size=50MB'
session_config = 'isolation=snapshot'
- def test_timestamp20(self):
+ def test_timestamp20_standard(self):
uri = 'table:test_timestamp20'
self.session.create(uri, 'key_format=S,value_format=S')
self.conn.set_timestamp('oldest_timestamp=' + timestamp_str(1))
@@ -86,3 +86,80 @@ class test_timestamp20(wttest.WiredTigerTestCase):
for i in range(1, 10000):
self.assertEqual(old_reader_cursor[str(i)], value3)
old_reader_session.rollback_transaction()
+
+ # In this test we're using modifies since they are more sensitive to corruptions.
+ #
+ # Corruptions to string types may go undetected since non-ASCII characters won't be included in
+ # the conversion to a Python string.
+ def test_timestamp20_modify(self):
+ uri = 'table:test_timestamp20'
+ self.session.create(uri, 'key_format=S,value_format=S')
+ self.conn.set_timestamp('oldest_timestamp=' + timestamp_str(1))
+ cursor = self.session.open_cursor(uri)
+
+ value1 = 'a' * 500
+ value2 = 'b' * 500
+ value3 = 'c' * 500
+
+ # Apply the base value.
+ for i in range(1, 10000):
+ self.session.begin_transaction()
+ cursor[str(i)] = value1
+ self.session.commit_transaction('commit_timestamp=' + timestamp_str(10))
+
+ # Now apply a series of modifies.
+ for i in range(1, 10000):
+ self.session.begin_transaction()
+ cursor.set_key(str(i))
+ self.assertEqual(cursor.modify([wiredtiger.Modify('B', 100, 1)]), 0)
+ self.session.commit_transaction('commit_timestamp=' + timestamp_str(20))
+
+ for i in range(1, 10000):
+ self.session.begin_transaction()
+ cursor.set_key(str(i))
+ self.assertEqual(cursor.modify([wiredtiger.Modify('C', 200, 1)]), 0)
+ self.session.commit_transaction('commit_timestamp=' + timestamp_str(30))
+
+ # Open an old reader at this point.
+ #
+ # I'm trying to read the middle modify because I specifically don't want to read one that
+ # has been squashed into a full update.
+ old_reader_session = self.conn.open_session()
+ old_reader_cursor = old_reader_session.open_cursor(uri)
+ old_reader_session.begin_transaction('read_timestamp=' + timestamp_str(30))
+
+ # Now apply the last modify.
+ # This will be the end of the chain of modifies.
+ for i in range(1, 10000):
+ self.session.begin_transaction()
+ cursor.set_key(str(i))
+ self.assertEqual(cursor.modify([wiredtiger.Modify('D', 300, 1)]), 0)
+ self.session.commit_transaction('commit_timestamp=' + timestamp_str(40))
+
+ # Now put two updates out of order. 5 will go to the history store and will trigger a
+ # correction to the existing contents.
+ for i in range(1, 10000):
+ self.session.begin_transaction()
+ cursor[str(i)] = value2
+ self.session.commit_transaction('commit_timestamp=' + timestamp_str(5))
+ self.session.begin_transaction()
+ cursor[str(i)] = value3
+ self.session.commit_transaction('commit_timestamp=' + timestamp_str(50))
+
+ # Open up a new transaction and read at 30.
+ # We shouldn't be able to see past 5 due to txnid visibility.
+ self.session.begin_transaction('read_timestamp=' + timestamp_str(30))
+ for i in range(1, 10000):
+ self.assertEqual(cursor[str(i)], value2)
+ self.session.rollback_transaction()
+
+ # Put together expected value.
+ expected = list(value1)
+ expected[100] = 'B'
+ expected[200] = 'C'
+ expected = str().join(expected)
+
+ # On the other hand, this older transaction SHOULD be able to read past the 5.
+ for i in range(1, 10000):
+ self.assertEqual(old_reader_cursor[str(i)], expected)
+ old_reader_session.rollback_transaction()