diff options
Diffstat (limited to 'src/third_party/wiredtiger/test/suite/test_stat02.py')
-rw-r--r-- | src/third_party/wiredtiger/test/suite/test_stat02.py | 232 |
1 files changed, 232 insertions, 0 deletions
diff --git a/src/third_party/wiredtiger/test/suite/test_stat02.py b/src/third_party/wiredtiger/test/suite/test_stat02.py new file mode 100644 index 00000000000..8643d700793 --- /dev/null +++ b/src/third_party/wiredtiger/test/suite/test_stat02.py @@ -0,0 +1,232 @@ +#!/usr/bin/env python +# +# Public Domain 2014-2015 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 itertools, wiredtiger, wttest +from suite_subprocess import suite_subprocess +from wtscenario import multiply_scenarios, number_scenarios +from wiredtiger import stat +from helper import complex_populate, complex_populate_lsm, simple_populate + +# test_stat02.py +# Statistics cursor configurations. +class test_stat_cursor_config(wttest.WiredTigerTestCase): + pfx = 'test_stat_cursor_config' + uri = [ + ('file', dict(uri='file:' + pfx, pop=simple_populate, cfg='')), + ('table', dict(uri='table:' + pfx, pop=simple_populate, cfg='')), + ('table-lsm', + dict(uri='table:' + pfx, pop=simple_populate, cfg=',type=lsm')), + ('complex', dict(uri='table:' + pfx, pop=complex_populate, cfg='')), + ('complex-lsm', + dict(uri='table:' + pfx, pop=complex_populate_lsm, cfg='')) + ] + data_config = [ + ('none', dict(data_config='none', ok=[])), + ( 'all', dict(data_config='all', ok=['empty', 'fast', 'all', 'size'])), + ('fast', dict(data_config='fast', ok=['empty', 'fast', 'size'])) + ] + cursor_config = [ + ('empty', dict(cursor_config='empty')), + ( 'all', dict(cursor_config='all')), + ('fast', dict(cursor_config='fast')), + ('size', dict(cursor_config='size')) + ] + + scenarios = number_scenarios( + multiply_scenarios('.', uri, data_config, cursor_config)) + + # Override WiredTigerTestCase, we have extensions. + def setUpConnectionOpen(self, dir): + conn = wiredtiger.wiredtiger_open(dir, + 'create,' + + 'statistics=(' + self.data_config + '),' + + 'error_prefix="%s: "' % self.shortid()) + return conn + + # For each database/cursor configuration, confirm the right combinations + # succeed or fail. + def test_stat_cursor_config(self): + self.pop(self, self.uri, 'key_format=S' + self.cfg, 100) + config = 'statistics=(' + if self.cursor_config != 'empty': + config = config + self.cursor_config + config = config + ')' + if self.ok and self.cursor_config in self.ok: + self.session.open_cursor('statistics:', None, config) + else: + msg = '/database statistics configuration/' + self.assertRaisesWithMessage(wiredtiger.WiredTigerError, lambda: + self.session.open_cursor('statistics:', None, config), msg) + + +# Test the connection "clear" configuration. +class test_stat_cursor_conn_clear(wttest.WiredTigerTestCase): + pfx = 'test_stat_cursor_conn_clear' + + # Override WiredTigerTestCase, we have extensions. + def setUpConnectionOpen(self, dir): + conn = wiredtiger.wiredtiger_open(dir, + 'create,statistics=(all),' + + 'error_prefix="%s: "' % self.shortid()) + return conn + + def test_stat_cursor_conn_clear(self): + uri = 'table:' + self.pfx + complex_populate(self, uri, 'key_format=S', 100) + + # cursor_insert should clear + # cache_bytes_dirty should not clear + cursor = self.session.open_cursor( + 'statistics:', None, 'statistics=(all,clear)') + self.assertGreater(cursor[stat.conn.cache_bytes_dirty][2], 0) + self.assertGreater(cursor[stat.conn.cursor_insert][2], 0) + cursor = self.session.open_cursor( + 'statistics:', None, 'statistics=(all,clear)') + self.assertGreater(cursor[stat.conn.cache_bytes_dirty][2], 0) + self.assertEqual(cursor[stat.conn.cursor_insert][2], 0) + + +# Test the data-source "clear" configuration. +class test_stat_cursor_dsrc_clear(wttest.WiredTigerTestCase): + pfx = 'test_stat_cursor_dsrc_clear' + + uri = [ + ('1', dict(uri='file:' + pfx, pop=simple_populate)), + ('2', dict(uri='table:' + pfx, pop=simple_populate)), + ('3', dict(uri='table:' + pfx, pop=complex_populate)), + ('4', dict(uri='table:' + pfx, pop=complex_populate_lsm)) + ] + + scenarios = number_scenarios(multiply_scenarios('.', uri)) + + # Override WiredTigerTestCase, we have extensions. + def setUpConnectionOpen(self, dir): + conn = wiredtiger.wiredtiger_open(dir, + 'create,statistics=(all),' + + 'error_prefix="%s: "' % self.shortid()) + return conn + + def test_stat_cursor_dsrc_clear(self): + self.pop(self, self.uri, 'key_format=S', 100) + + # cursor_insert should clear + # + # We can't easily test data-source items that shouldn't clear: as I + # write this, session_cursor_open is the only such item, and it will + # change to account for the statistics cursors we open here. + cursor = self.session.open_cursor( + 'statistics:' + self.uri, None, 'statistics=(all,clear)') + self.assertGreater(cursor[stat.dsrc.cursor_insert][2], 0) + cursor = self.session.open_cursor( + 'statistics:' + self.uri, None, 'statistics=(all,clear)') + self.assertEqual(cursor[stat.dsrc.cursor_insert][2], 0) + + +# Test the "fast" configuration. +class test_stat_cursor_fast(wttest.WiredTigerTestCase): + pfx = 'test_stat_cursor_fast' + + uri = [ + ('1', dict(uri='file:' + pfx, pop=simple_populate)), + ('2', dict(uri='table:' + pfx, pop=simple_populate)), + ('3', dict(uri='table:' + pfx, pop=complex_populate)), + ('4', dict(uri='table:' + pfx, pop=complex_populate_lsm)) + ] + + scenarios = number_scenarios(multiply_scenarios('.', uri)) + + # Override WiredTigerTestCase, we have extensions. + def setUpConnectionOpen(self, dir): + conn = wiredtiger.wiredtiger_open(dir, + 'create,statistics=(all),' + + 'error_prefix="%s: "' % self.shortid()) + return conn + + def test_stat_cursor_fast(self): + self.pop(self, self.uri, 'key_format=S', 100) + + # A "fast" cursor shouldn't see the underlying btree statistics. + # Check "fast" first, otherwise we get a copy of the statistics + # we generated in the "all" call, they just aren't updated. + cursor = self.session.open_cursor( + 'statistics:' + self.uri, None, 'statistics=(fast)') + self.assertEqual(cursor[stat.dsrc.btree_entries][2], 0) + cursor = self.session.open_cursor( + 'statistics:' + self.uri, None, 'statistics=(all)') + self.assertGreater(cursor[stat.dsrc.btree_entries][2], 0) + + +# Test connection error combinations. +class test_stat_cursor_conn_error(wttest.WiredTigerTestCase): + def setUpConnectionOpen(self, dir): + return None + def setUpSessionOpen(self, conn): + return None + + def test_stat_cursor_conn_error(self): + args = ['none', 'all', 'fast'] + for i in list(itertools.permutations(args, 2)): + config = 'create,statistics=(' + i[0] + ',' + i[1] + ')' + msg = '/only one statistics configuration value/' + self.assertRaisesWithMessage(wiredtiger.WiredTigerError, + lambda: wiredtiger.wiredtiger_open('.', config), msg) + + +# Test data-source error combinations. +class test_stat_cursor_dsrc_error(wttest.WiredTigerTestCase): + pfx = 'test_stat_cursor_dsrc_error' + + uri = [ + ('1', dict(uri='file:' + pfx, pop=simple_populate)), + ('2', dict(uri='table:' + pfx, pop=simple_populate)), + ('3', dict(uri='table:' + pfx, pop=complex_populate)), + ('4', dict(uri='table:' + pfx, pop=complex_populate_lsm)) + ] + + scenarios = number_scenarios(multiply_scenarios('.', uri)) + + # Override WiredTigerTestCase, we have extensions. + def setUpConnectionOpen(self, dir): + conn = wiredtiger.wiredtiger_open(dir, + 'create,statistics=(all),' + + 'error_prefix="%s: "' % self.shortid()) + return conn + + def test_stat_cursor_dsrc_error(self): + self.pop(self, self.uri, 'key_format=S', 100) + args = ['all', 'fast'] + for i in list(itertools.permutations(args, 2)): + config = 'statistics=(' + i[0] + ',' + i[1] + ')' + msg = '/only one statistics configuration value/' + self.assertRaisesWithMessage(wiredtiger.WiredTigerError, + lambda: self.session.open_cursor( + 'statistics:' + self.uri, None, config), msg) + + +if __name__ == '__main__': + wttest.run() |