summaryrefslogtreecommitdiff
path: root/larch
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2012-05-02 22:32:45 +0100
committerLars Wirzenius <liw@liw.fi>2012-05-02 22:32:45 +0100
commit53a4c105b93a72f18c336585f1c9817b41dce568 (patch)
tree2026088dc86948c108e55c4dd882652cf0c61183 /larch
parentf86d38b18bb36c9f109f6bd8d6a46be250dfc5b7 (diff)
downloadlarch-53a4c105b93a72f18c336585f1c9817b41dce568.tar.gz
Optimize away some round trips for accessing files in the journal
Diffstat (limited to 'larch')
-rw-r--r--larch/journal.py27
1 files changed, 20 insertions, 7 deletions
diff --git a/larch/journal.py b/larch/journal.py
index 4ea1e9f..7be6212 100644
--- a/larch/journal.py
+++ b/larch/journal.py
@@ -87,6 +87,8 @@ class Journal(object):
else:
logging.debug('Automatically rolling back remaining changes')
self.rollback()
+ self.new_files = set()
+ self.deleted_files = set()
def _require_rw(self):
'''Raise error if modifications are not allowed.'''
@@ -115,9 +117,9 @@ class Journal(object):
if self.allow_writes:
new = self._new(filename)
deleted = self._deleted(filename)
- if self.fs.exists(new):
+ if new in self.new_files:
return True
- elif self.fs.exists(deleted):
+ elif deleted in self.deleted_files:
return False
return self.fs.exists(filename)
@@ -126,19 +128,22 @@ class Journal(object):
self._require_rw()
x = self._new(dirname)
self.fs.makedirs(x)
+ self.new_files.add(x)
def overwrite_file(self, filename, contents):
tracing.trace(filename)
self._require_rw()
- self.fs.overwrite_file(self._new(filename), contents)
+ new = self._new(filename)
+ self.fs.overwrite_file(new, contents)
+ self.new_files.add(new)
def cat(self, filename):
if self.allow_writes:
new = self._new(filename)
deleted = self._deleted(filename)
- if self.fs.exists(new):
+ if new in self.new_files:
return self.fs.cat(new)
- elif self.fs.exists(deleted):
+ elif deleted in self.deleted_files:
raise OSError((errno.ENOENT, os.strerror(errno.ENOENT),
filename))
return self.fs.cat(filename)
@@ -150,12 +155,14 @@ class Journal(object):
new = self._new(filename)
deleted = self._deleted(filename)
- if self.fs.exists(new):
+ if new in self.new_files:
self.fs.remove(new)
- elif self.fs.exists(deleted):
+ self.new_files.remove(new)
+ elif deleted in self.deleted_files:
raise OSError((errno.ENOENT, os.strerror(errno.ENOENT), filename))
else:
self.fs.overwrite_file(deleted, '')
+ self.deleted_files.add(deleted)
def list_files(self, dirname):
'''List all files.
@@ -236,6 +243,9 @@ class Journal(object):
if self.fs.exists(self.deletedir):
self._clear_directory(self.deletedir)
+ self.new_files = set()
+ self.deleted_files = set()
+
tracing.trace('%s done' % self.storedir)
def _really_delete(self, deletedir):
@@ -263,4 +273,7 @@ class Journal(object):
if not skip and self.fs.exists(self.new_flag):
self.fs.rename(self.new_flag, self.flag_file)
+ self.new_files = set()
+ self.deleted_files = set()
+
tracing.trace('%s done' % self.storedir)