diff piecrust/baking/worker.py @ 455:cb3446be44b7

bake: Abort "render first" jobs if we start using other pages. This prevents the baker from having one worker stuck on a very long job, like rendering the index page of a blog with lots and lots of posts.
author Ludovic Chabant <ludovic@chabant.com>
date Wed, 08 Jul 2015 22:51:29 -0700
parents 8351a77e13f5
children 456db44dcc53
line wrap: on
line diff
--- a/piecrust/baking/worker.py	Mon Jul 06 21:32:40 2015 -0700
+++ b/piecrust/baking/worker.py	Wed Jul 08 22:51:29 2015 -0700
@@ -3,6 +3,7 @@
 from piecrust.app import PieCrust
 from piecrust.baking.records import BakeRecord, _get_transition_key
 from piecrust.baking.single import PageBaker, BakingError
+from piecrust.environment import AbortedSourceUseError
 from piecrust.rendering import (
         QualifiedPage, PageRenderingContext, render_page_segments)
 from piecrust.routing import create_route_metadata
@@ -147,18 +148,25 @@
         route_metadata = create_route_metadata(page)
         qp = QualifiedPage(page, route, route_metadata)
         ctx = PageRenderingContext(qp)
+        self.app.env.abort_source_use = True
 
         result = {
                 'path': fac.path,
+                'aborted': False,
                 'errors': None}
         logger.debug("Preparing page: %s" % fac.ref_spec)
         try:
             render_page_segments(ctx)
+        except AbortedSourceUseError:
+            logger.debug("Page %s was aborted." % fac.ref_spec)
+            result['aborted'] = True
         except Exception as ex:
             logger.debug("Got rendering error. Sending it to master.")
             result['errors'] = _get_errors(ex)
             if self.ctx.debug:
                 logger.exception(ex)
+        finally:
+            self.app.env.abort_source_use = False
         return result