diff options
author | Antoine Brenner <brenner+obnam@gymglish.com> | 2013-01-16 22:58:35 +0100 |
---|---|---|
committer | Antoine Brenner <brenner+obnam@gymglish.com> | 2013-01-16 22:58:35 +0100 |
commit | 42d9d6c7d048580e06cab7003db5fdd61a0a3f11 (patch) | |
tree | 6fe572dc8904d0b487755ccadeae08db557da01c | |
parent | 206fb1529bf3bef9c51e9c47dd5b3fa053c485ba (diff) | |
parent | 76fdb08a8660fc2abe7caecbd2ffca98c9ff06f5 (diff) | |
download | larch-42d9d6c7d048580e06cab7003db5fdd61a0a3f11.tar.gz |
Repair non-working example.py and speed-test
The introduction of the allow_writes parameter in larch/forest.py:open_forest()
broke example.py and speed-test.
Just adding the parameter to the open_forest calls was not enough to fix the
issue. This patch fixes the issue by adding the allow_writes parameter where it
is needed beyond the open_forest calls.
Most notably, this patch changes the __init__ signature of the abstract base
class larch.NodeStore from __init__(self, node_size, codec) to
__init__(self, allow_writes, node_size, codec)
This mimicks the current signatures of NodeStoreDisk and NodeStoreMemory, which
include the use of allow_writes as first parameter, and which seem required
to actually create a forest anyway since forest.py creates node_store instances
with allow_writes as first parameter in open_forest
-rw-r--r-- | example.py | 14 | ||||
-rw-r--r-- | larch/forest_tests.py | 2 | ||||
-rw-r--r-- | larch/nodestore.py | 3 | ||||
-rw-r--r-- | larch/nodestore_disk.py | 2 | ||||
-rw-r--r-- | larch/nodestore_memory.py | 4 | ||||
-rw-r--r-- | larch/nodestore_memory_tests.py | 2 | ||||
-rw-r--r-- | larch/tree_tests.py | 6 | ||||
-rwxr-xr-x | speed-test | 14 |
8 files changed, 26 insertions, 21 deletions
@@ -33,11 +33,11 @@ def compute(filename): return md5.hexdigest() -def open_tree(dirname): +def open_tree(allow_writes, dirname): key_size = len(compute('/dev/null')) node_size = 4096 - forest = larch.open_forest(key_size=key_size, node_size=node_size, + forest = larch.open_forest(allow_writes=allow_writes, key_size=key_size, node_size=node_size, dirname=dirname) if forest.trees: tree = forest.trees[0] @@ -47,7 +47,7 @@ def open_tree(dirname): def add(filenames): - forest, tree = open_tree('example.tree') + forest, tree = open_tree(allow_writes=True, dirname='example.tree') for filename in filenames: checksum = compute(filename) tree.insert(checksum, filename) @@ -55,17 +55,17 @@ def add(filenames): def find(checksums): - forest, tree = open_tree('example.tree') + forest, tree = open_tree(allow_writes=False, dirname='example.tree') for checksum in checksums: filename = tree.lookup(checksum) print checksum, filename def list_checksums(): - forest, tree = open_tree('example.tree') + forest, tree = open_tree(allow_writes=False, dirname='example.tree') key_size = len(compute('/dev/null')) - minkey = '00' * key_size - maxkey = 'ff' * key_size + minkey = '0' * key_size + maxkey = 'f' * key_size for checksum, filename in tree.lookup_range(minkey, maxkey): print checksum, filename diff --git a/larch/forest_tests.py b/larch/forest_tests.py index 9a786bd..a7c9677 100644 --- a/larch/forest_tests.py +++ b/larch/forest_tests.py @@ -26,7 +26,7 @@ class ForestTests(unittest.TestCase): def setUp(self): self.codec = larch.NodeCodec(3) - self.ns = larch.NodeStoreMemory(64, self.codec) + self.ns = larch.NodeStoreMemory(allow_writes=True, node_size=64, codec=self.codec) self.forest = larch.Forest(self.ns) def test_new_node_ids_grow(self): diff --git a/larch/nodestore.py b/larch/nodestore.py index 929450a..dd9b536 100644 --- a/larch/nodestore.py +++ b/larch/nodestore.py @@ -98,7 +98,8 @@ class NodeStore(object): # pragma: no cover ''' - def __init__(self, node_size, codec): + def __init__(self, allow_writes, node_size, codec): + self.allow_writes = allow_writes self.node_size = node_size self.codec = codec self.max_value_size = (node_size / 2) - codec.leaf_header.size diff --git a/larch/nodestore_disk.py b/larch/nodestore_disk.py index 197a411..3cb8ee7 100644 --- a/larch/nodestore_disk.py +++ b/larch/nodestore_disk.py @@ -117,7 +117,7 @@ class NodeStoreDisk(larch.NodeStore): if format is not None: tracing.trace('forcing format_base: %s', format) self.format_base = format - larch.NodeStore.__init__(self, node_size, codec) + larch.NodeStore.__init__(self, allow_writes=allow_writes, node_size=node_size, codec=codec) self.dirname = dirname self.metadata_name = os.path.join(dirname, 'metadata') self.metadata = None diff --git a/larch/nodestore_memory.py b/larch/nodestore_memory.py index 510ce5e..f0598be 100644 --- a/larch/nodestore_memory.py +++ b/larch/nodestore_memory.py @@ -26,8 +26,8 @@ class NodeStoreMemory(larch.NodeStore): ''' - def __init__(self, node_size, codec): - larch.NodeStore.__init__(self, node_size, codec) + def __init__(self,allow_writes, node_size, codec): + larch.NodeStore.__init__(self, allow_writes=allow_writes, node_size=node_size, codec=codec) self.nodes = dict() self.refcounts = dict() self.metadata = dict() diff --git a/larch/nodestore_memory_tests.py b/larch/nodestore_memory_tests.py index eecb905..8c210db 100644 --- a/larch/nodestore_memory_tests.py +++ b/larch/nodestore_memory_tests.py @@ -25,5 +25,5 @@ class NodeStoreMemoryTests(unittest.TestCase, larch.NodeStoreTests): def setUp(self): self.node_size = 4096 self.codec = larch.NodeCodec(self.key_bytes) - self.ns = nodestore_memory.NodeStoreMemory(self.node_size, self.codec) + self.ns = nodestore_memory.NodeStoreMemory(allow_writes=True, node_size=self.node_size, codec=self.codec) diff --git a/larch/tree_tests.py b/larch/tree_tests.py index 86895f0..8a4a4e9 100644 --- a/larch/tree_tests.py +++ b/larch/tree_tests.py @@ -67,7 +67,7 @@ class BTreeTests(unittest.TestCase): # We use a small node size so that all code paths are traversed # during testing. Use coverage.py to make sure they do. self.codec = larch.NodeCodec(3) - self.ns = DummyNodeStore(64, self.codec) + self.ns = DummyNodeStore(allow_writes=True, node_size=64, codec=self.codec) self.forest = DummyForest() self.tree = larch.BTree(self.forest, self.ns, None) self.dump = False @@ -549,7 +549,7 @@ class BTreeDecrementTests(unittest.TestCase): # We use a small node size so that all code paths are traversed # during testing. Use coverage.py to make sure they do. self.codec = larch.NodeCodec(3) - self.ns = DummyNodeStore(64, self.codec) + self.ns = DummyNodeStore(allow_writes=True, node_size=64, codec=self.codec) self.forest = DummyForest() self.tree = larch.BTree(self.forest, self.ns, None) self.tree.insert('foo', 'bar') @@ -574,7 +574,7 @@ class BTreeDecrementTests(unittest.TestCase): class BTreeBalanceTests(unittest.TestCase): def setUp(self): - ns = DummyNodeStore(4096, larch.NodeCodec(2)) + ns = DummyNodeStore(allow_writes=True, node_size=4096, codec=larch.NodeCodec(2)) forest = DummyForest() self.tree = larch.BTree(forest, ns, None) self.keys = ['%02d' % i for i in range(10)] @@ -15,8 +15,8 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. # Excercise my B-tree implementation, for simple benchmarking purposes. -# The benchmark gets a location and an operation count as command line -# arguments. +# The benchmark gets a location and nb of keys to use as command line +# arguments --location=LOCATION and --keys=KEYS. # # If the location is the empty string, an in-memory node store is used. # Otherwise it must be a non-existent directory name. @@ -73,13 +73,13 @@ class SpeedTest(cliapp.Application): raise Exception('You must set number of keys with --keys') if not location: - forest = larch.open_forest(key_size=key_size, node_size=node_size, + forest = larch.open_forest(allow_writes=True, key_size=key_size, node_size=node_size, node_store=larch.NodeStoreMemory) else: if os.path.exists(location): raise Exception('%s exists already' % location) os.mkdir(location) - forest = larch.open_forest(key_size=key_size, node_size=node_size, + forest = larch.open_forest(allow_writes=True, key_size=key_size, node_size=node_size, dirname=location) tree = forest.new_tree() @@ -144,7 +144,11 @@ class SpeedTest(cliapp.Application): # Report def speed(result, i): - return n / (result[i] - looptime[i]) + if result[i] == looptime[i]: + # computer too fast for the number of "keys" used... + return float("infinity") + else: + return n / (result[i] - looptime[i]) def report(label, result): cpu, wall = result print '%-16s: %5.3f s (%8.1f/s) CPU; %5.3f s (%8.1f/s) wall' % \ |