Mercurial > piecrust2
diff piecrust/environment.py @ 96:0445a2232de7
Improvements and fixes to incremental baking.
* Better handling of the render pass during page rendering.
* Used sources are paired with the pass they were used in.
* Proper use and invalidation of the rendered segments cache based on render
passes.
* The `Assetor` is also better tracking what was used in a page.
* Add flags on a page to get better caching information for the debug window.
* Property invalidation of the previous bake record when needed.
* Better information about why pages are delayed.
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Sun, 07 Sep 2014 23:48:57 -0700 |
parents | 563ce5dd02af |
children | 208c652551a3 |
line wrap: on
line diff
--- a/piecrust/environment.py Sun Sep 07 21:37:10 2014 -0700 +++ b/piecrust/environment.py Sun Sep 07 23:48:57 2014 -0700 @@ -25,6 +25,16 @@ self.cache = repoze.lru.LRUCache(size) self.lock = threading.RLock() self.fs_cache = None + self._invalidated_fs_items = set() + + def invalidate(self, key): + with self.lock: + logger.debug("Invalidating cache item '%s'." % key) + self.cache.invalidate(key) + if self.fs_cache: + logger.debug("Invalidating FS cache item '%s'." % key) + fs_key = _make_fs_cache_key(key) + self._invalidated_fs_items.add(fs_key) def get(self, key, item_maker, fs_cache_time=None): item = self.cache.get(key) @@ -37,7 +47,8 @@ fs_cache_time is not None): # Try first from the file-system cache. fs_key = _make_fs_cache_key(key) - if self.fs_cache.isValid(fs_key, fs_cache_time): + if (fs_key not in self._invalidated_fs_items and + self.fs_cache.isValid(fs_key, fs_cache_time)): logger.debug("'%s' found in file-system cache." % key) item_raw = self.fs_cache.read(fs_key) @@ -59,15 +70,9 @@ return item -PHASE_PAGE_PARSING = 0 -PHASE_PAGE_FORMATTING = 1 -PHASE_PAGE_RENDERING = 2 - - class ExecutionInfo(object): - def __init__(self, page, phase, render_ctx): + def __init__(self, page, render_ctx): self.page = page - self.phase = phase self.render_ctx = render_ctx self.was_cache_valid = False self.start_time = time.clock() @@ -93,8 +98,11 @@ return True return False - def pushPage(self, page, phase, render_ctx): - self._page_stack.append(ExecutionInfo(page, phase, render_ctx)) + def pushPage(self, page, render_ctx): + if len(self._page_stack) > 0: + top = self._page_stack[-1] + assert top.page is not page + self._page_stack.append(ExecutionInfo(page, render_ctx)) def popPage(self): del self._page_stack[-1] @@ -108,12 +116,10 @@ self.page_repository = MemCache() self.rendered_segments_repository = MemCache() self.base_asset_url_format = '%uri%' - self._use_rendered_segments_fs_cache = False def initialize(self, app): - if self._use_rendered_segments_fs_cache: - cache = app.cache.getCache('renders') - self.rendered_segments_repository.fs_cache = cache + cache = app.cache.getCache('renders') + self.rendered_segments_repository.fs_cache = cache class StandardEnvironment(Environment):