From 24752c204b418014e72c4ad9909200085155623d Mon Sep 17 00:00:00 2001 From: Joshua Harlow Date: Mon, 11 May 2015 17:11:43 -0700 Subject: [PATCH] Use hash path lookup vs path finding When creating a fake symlink to a path just use hash lookup via `fetch_node` and handle that failing if the destination nodes does not exist vs. fetching the parent and linear searching for the existing target node (which gets slower as the parent node gets more children). This makes the preparing code using the little speed test helper on my not-very-fast box change to be the following: Old (preparing) - Took 29.724 seconds to run New (preparing) - Took 21.343 seconds to run Part of ongoing blueprint make-things-speedy Change-Id: I608b90ae58b4e4b6724b7f1bb8faebd118a1ec79 --- taskflow/persistence/backends/impl_memory.py | 23 ++++++++++---------- 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/taskflow/persistence/backends/impl_memory.py b/taskflow/persistence/backends/impl_memory.py index 55ea1455..2bc21662 100644 --- a/taskflow/persistence/backends/impl_memory.py +++ b/taskflow/persistence/backends/impl_memory.py @@ -220,14 +220,13 @@ class FakeFilesystem(object): """Link the destionation path to the source path.""" dest_path = self.normpath(dest_path) src_path = self.normpath(src_path) - dirname, basename = self.split(dest_path) - parent_node = self._fetch_node(dirname, normalized=True) - child_node = parent_node.find(basename, - only_direct=True, - include_self=False) - if child_node is None: - child_node = self._insert_child(parent_node, basename) - child_node.metadata['target'] = src_path + try: + dest_node = self._fetch_node(dest_path, normalized=True) + except exc.NotFound: + parent_path, basename = self.split(dest_path) + parent_node = self._fetch_node(parent_path, normalized=True) + dest_node = self._insert_child(parent_node, basename) + dest_node.metadata['target'] = src_path def __getitem__(self, path): return self._get_item(self.normpath(path)) @@ -236,11 +235,11 @@ class FakeFilesystem(object): path = self.normpath(path) value = self._copier(value) try: - item_node = self._fetch_node(path, normalized=True) - item_node.metadata.update(value=value) + node = self._fetch_node(path, normalized=True) + node.metadata.update(value=value) except exc.NotFound: - dirname, basename = self.split(path) - parent_node = self._fetch_node(dirname, normalized=True) + parent_path, basename = self.split(path) + parent_node = self._fetch_node(parent_path, normalized=True) self._insert_child(parent_node, basename, value=value)