While thinking about the issues discussed in WT-9115 I noticed that a behaviour is currently legal within the API, if a transaction calls timestamp_transaction(commit_timestamp=X) and then performs an update and then the stable is moved in the system to say X+5, then the transaction commits with a commit timestamp of X+10 the transaction will succeed despite having used invalid timestamps on its updates.
Reproducer:
import wiredtiger, wttest
from wtscenario import make_scenarios
class test_hs12(wttest.WiredTigerTestCase):
def test_hang(self):
uri = "table:hang"
create_params = 'value_format=S,key_format=i'
value1 = 'abcedfghijklmnopqrstuvwxyz' * 5
value2 = 'b' * 100
self.session.create(uri, create_params)
cursor = self.session.open_cursor(uri)
session2 = self.setUpSessionOpen(self.conn)
session2.create(uri, create_params)
cursor2 = session2.open_cursor(uri)
self.conn.set_timestamp("stable_timestamp=" + self.timestamp_str(1))
# Insert a full value.
self.session.begin_transaction()
self.session.timestamp_transaction('commit_timestamp=' + self.timestamp_str(2))
cursor[2] = value1
self.session.timestamp_transaction('commit_timestamp=' + self.timestamp_str(3))
cursor[3] = value2
self.conn.set_timestamp("stable_timestamp=" + self.timestamp_str(5))
#session2.checkpoint()
self.session.commit_transaction('commit_timestamp=' + self.timestamp_str(10))
if __name__ == '__main__':
wttest.run()