diff options
author | Lars Wirzenius <liw@liw.fi> | 2013-12-27 11:40:49 +0000 |
---|---|---|
committer | Lars Wirzenius <liw@liw.fi> | 2013-12-28 21:51:25 +0000 |
commit | 69f0fd1c2f17664d98630ff3f13ea1a85445ea76 (patch) | |
tree | 6acf5b811ea3653b223f9b502ccbc32c4357d036 | |
parent | 23e179cb89e21f36e96cae1134e8191bcab92308 (diff) | |
download | obnam-69f0fd1c2f17664d98630ff3f13ea1a85445ea76.tar.gz |
Cache file key lookups in format 6
-rw-r--r-- | obnamlib/repo_fmt_6.py | 24 | ||||
-rw-r--r-- | test-gpghome/random_seed | bin | 600 -> 600 bytes |
2 files changed, 20 insertions, 4 deletions
diff --git a/obnamlib/repo_fmt_6.py b/obnamlib/repo_fmt_6.py index 2d24064f..bd601ab1 100644 --- a/obnamlib/repo_fmt_6.py +++ b/obnamlib/repo_fmt_6.py @@ -726,6 +726,14 @@ class RepositoryFormat6(obnamlib.RepositoryInterface): } + # A cache for file key lookups. Without this, we always need to + # fetch and decode a full, encoded obnamlib.Metadata object. + # The dict is indexed by (generation_number, pathname) tuples, + # and is invalidated when any change is made to any file key. + # FIXME: This only helps with lookups, not with setting keys. + + self._file_key_cache = {} + def _require_existing_file(self, generation_id, filename): client_name, gen_number = generation_id @@ -766,10 +774,15 @@ class RepositoryFormat6(obnamlib.RepositoryInterface): self._require_existing_file(generation_id, filename) client_name, gen_number = generation_id - client = self._open_client(client_name) - - encoded_metadata = client.get_metadata(gen_number, filename) - metadata = obnamlib.decode_metadata(encoded_metadata) + + cache_key = (gen_number, filename) + if cache_key in self._file_key_cache: + metadata = self._file_key_cache[cache_key] + else: + client = self._open_client(client_name) + encoded_metadata = client.get_metadata(gen_number, filename) + metadata = obnamlib.decode_metadata(encoded_metadata) + self._file_key_cache[cache_key] = metadata if key in self._file_keys: value = getattr(metadata, self._file_keys[key]) @@ -786,6 +799,9 @@ class RepositoryFormat6(obnamlib.RepositoryInterface): self._require_client_lock(client_name) self._require_existing_file(generation_id, filename) + # Invalidate the file key cache. + self._file_key_cache = {} + client = self._open_client(client_name) encoded_metadata = client.get_metadata(gen_number, filename) diff --git a/test-gpghome/random_seed b/test-gpghome/random_seed Binary files differindex 75f29732..b8fbeb97 100644 --- a/test-gpghome/random_seed +++ b/test-gpghome/random_seed |