From f56b6bf4cc43e2445f3bf228d5e3e7ef314982e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20Borgstr=C3=B6m?= Date: Mon, 5 Sep 2011 21:30:21 +0200 Subject: [PATCH] Lazy transactions --- darc/store.py | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/darc/store.py b/darc/store.py index 9b8fe8f74..6a042e998 100644 --- a/darc/store.py +++ b/darc/store.py @@ -93,15 +93,18 @@ class Store(object): names.sort(reverse=reverse) return names - def open_index(self, head): + def open_index(self, head, read_only=False): if head is None: self.index = NSIndex.create(os.path.join(self.path, 'index.tmp')) self.segments = {} self.compact = set() else: - shutil.copy(os.path.join(self.path, 'index.%d' % head), - os.path.join(self.path, 'index.tmp')) - self.index = NSIndex(os.path.join(self.path, 'index.tmp')) + if read_only: + self.index = NSIndex(os.path.join(self.path, 'index.%d') % head) + else: + shutil.copy(os.path.join(self.path, 'index.%d' % head), + os.path.join(self.path, 'index.tmp')) + self.index = NSIndex(os.path.join(self.path, 'index.tmp')) hints = read_msgpack(os.path.join(self.path, 'hints.%d' % head)) if hints['version'] != 1: raise ValueError('Unknown hints file version: %d' % hints['version']) @@ -185,10 +188,11 @@ class Store(object): def rollback(self): """ """ + self._active_txn = False self.io = LoggedIO(self.path, self.max_segment_size, self.segments_per_dir) if self.io.head is not None and not os.path.exists(os.path.join(self.path, 'index.%d' % self.io.head)): self.recover(self.path) - self.open_index(self.io.head) + self.open_index(self.io.head, read_only=True) @deferrable def get(self, id): @@ -200,6 +204,9 @@ class Store(object): @deferrable def put(self, id, data): + if not self._active_txn: + self._active_txn = True + self.open_index(self.io.head) try: segment, _ = self.index[id] self.segments[segment] -= 1 @@ -214,6 +221,9 @@ class Store(object): @deferrable def delete(self, id): + if not self._active_txn: + self._active_txn = True + self.open_index(self.io.head) try: segment, offset = self.index.pop(id) self.segments[segment] -= 1