diff options
Diffstat (limited to 'chrome/common/extensions/docs/server2/caching_file_system.py')
-rw-r--r-- | chrome/common/extensions/docs/server2/caching_file_system.py | 28 |
1 files changed, 11 insertions, 17 deletions
diff --git a/chrome/common/extensions/docs/server2/caching_file_system.py b/chrome/common/extensions/docs/server2/caching_file_system.py index 59d8030..c0ff5d0 100644 --- a/chrome/common/extensions/docs/server2/caching_file_system.py +++ b/chrome/common/extensions/docs/server2/caching_file_system.py @@ -63,14 +63,12 @@ class CachingFileSystem(FileSystem): if dir_stat is not None: return Future(value=make_stat_info(dir_stat)) - dir_stat_future = self._MemoizedStatAsyncFromFileSystem(dir_path) - def resolve(): - dir_stat = dir_stat_future.Get() + def next(dir_stat): assert dir_stat is not None # should have raised a FileNotFoundError # We only ever need to cache the dir stat. self._stat_object_store.Set(dir_path, dir_stat) return make_stat_info(dir_stat) - return Future(callback=resolve) + return self._MemoizedStatAsyncFromFileSystem(dir_path).Then(next) @memoize def _MemoizedStatAsyncFromFileSystem(self, dir_path): @@ -93,18 +91,17 @@ class CachingFileSystem(FileSystem): # with a value. stat_futures = {} - def swallow_file_not_found_error(future): - def resolve(): - try: return future.Get() - except FileNotFoundError: return Nnone - return Future(callback=resolve) + def handle(error): + if isinstance(error, FileNotFoundError): + return None + raise error for path in paths: stat_value = cached_stat_values.get(path) if stat_value is None: stat_future = self.StatAsync(path) if skip_not_found: - stat_future = swallow_file_not_found_error(stat_future) + stat_future = stat_future.Then(lambda x: x, handle) else: stat_future = Future(value=stat_value) stat_futures[path] = stat_future @@ -120,19 +117,16 @@ class CachingFileSystem(FileSystem): # Everything was cached and up-to-date. return Future(value=fresh_data) - # Read in the values that were uncached or old. - read_futures = self._file_system.Read( - set(paths) - set(fresh_data.iterkeys()), - skip_not_found=skip_not_found) - def resolve(): - new_results = read_futures.Get() + def next(new_results): # Update the cache. This is a path -> (data, version) mapping. self._read_object_store.SetMulti( dict((path, (new_result, stat_futures[path].Get().version)) for path, new_result in new_results.iteritems())) new_results.update(fresh_data) return new_results - return Future(callback=resolve) + # Read in the values that were uncached or old. + return self._file_system.Read(set(paths) - set(fresh_data.iterkeys()), + skip_not_found=skip_not_found).Then(next) def GetIdentity(self): return self._file_system.GetIdentity() |