diff options
Diffstat (limited to 'src/third_party/wiredtiger/test/suite/wttimestamp.py')
-rwxr-xr-x | src/third_party/wiredtiger/test/suite/wttimestamp.py | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/src/third_party/wiredtiger/test/suite/wttimestamp.py b/src/third_party/wiredtiger/test/suite/wttimestamp.py new file mode 100755 index 00000000000..26fff886d65 --- /dev/null +++ b/src/third_party/wiredtiger/test/suite/wttimestamp.py @@ -0,0 +1,105 @@ +#!/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. +from contextlib import contextmanager +import wttest, wiredtiger + +# Timestamp abstraction class +class WiredTigerTimeStamp(object): + def __init__(self, initial_timestamp=1): + self.ts = initial_timestamp + + def incr(self): + self.ts += 1 + + def get_incr(self): + ret = self.ts + self.ts += 1 + return ret + + def get(self): + return self.ts + +# This allows us to easily "wrap" an operation in a transaction at the +# next timestamp. This global function version can be called externally. +@contextmanager +def session_timestamped_transaction(session, timestamper): + need_commit = False + if timestamper != None and not getattr(session, "_has_transaction", False): + session.begin_transaction() + need_commit = True + yield + if need_commit: + config = 'commit_timestamp=%x' % timestamper.get_incr() + #wttest.WiredTigerTestCase.tty('commit_transaction ' + config) + session.commit_transaction(config) + elif timestamper != None: + config = 'commit_timestamp=%x' % timestamper.get_incr() + #wttest.WiredTigerTestCase.tty('timestamp_transaction ' + config) + session.timestamp_transaction(config) + +# This class acts as a "proxy" for a Cursor. All methods, etc. +# are passed to the implementation object (via __getattr__), +# except for the ones that we explicitly override here. +class TimestampedCursor(wiredtiger.Cursor): + def __init__(self, cursor, timeStamper, testcase): + self._cursor = cursor + self._timeStamper = timeStamper + self._testcase = testcase + + def __getattr__(self, name): + return getattr(self._cursor, name) + + # A more convenient way to "wrap" an operation in a transaction + @contextmanager + def timestamped_transaction(self): + # Prefer the _session object if available, it returns a Python + # Session object that is 1-1 mapped to the WT_SESSION in the C API. + session = getattr(self._cursor, "_session", self._cursor.session) + timestamper = self._timeStamper + with session_timestamped_transaction(session, timestamper): + yield + + # Overrides Cursor.insert + def insert(self): + with self.timestamped_transaction(): + return self._cursor.insert() + + # Overrides Cursor.update + def update(self): + with self.timestamped_transaction(): + return self._cursor.update() + + # Overrides Cursor.remove + def remove(self): + with self.timestamped_transaction(): + return self._cursor.remove() + + # Overrides Cursor.modify + def modify(self, mods): + with self.timestamped_transaction(): + return self._cursor.modify(mods) |