diff options
author | Lars Wirzenius <liw@liw.fi> | 2012-05-02 22:32:45 +0100 |
---|---|---|
committer | Lars Wirzenius <liw@liw.fi> | 2012-05-02 22:32:45 +0100 |
commit | 53a4c105b93a72f18c336585f1c9817b41dce568 (patch) | |
tree | 2026088dc86948c108e55c4dd882652cf0c61183 | |
parent | f86d38b18bb36c9f109f6bd8d6a46be250dfc5b7 (diff) | |
download | larch-53a4c105b93a72f18c336585f1c9817b41dce568.tar.gz |
Optimize away some round trips for accessing files in the journal
-rw-r--r-- | NEWS | 6 | ||||
-rw-r--r-- | larch/journal.py | 27 |
2 files changed, 26 insertions, 7 deletions
@@ -4,6 +4,12 @@ NEWS for larch These are the release notes for larch, a Python implementation of a copy-on-write B-tree, designed by Odah Rodeh. +Version 0.31, released UNRELEASED +--------------------------------- + +* Optimize journal use to have fewer round-trips. This matters when the + journal is stored on a high-latency storage, such as an SFTP server. + Version 0.30, released 2012-04-29 --------------------------------- 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) |