Mercurial > piecrust2
comparison 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 |
comparison
equal
deleted
inserted
replaced
454:96d363e2da4b | 455:cb3446be44b7 |
---|---|
1 import time | 1 import time |
2 import logging | 2 import logging |
3 from piecrust.app import PieCrust | 3 from piecrust.app import PieCrust |
4 from piecrust.baking.records import BakeRecord, _get_transition_key | 4 from piecrust.baking.records import BakeRecord, _get_transition_key |
5 from piecrust.baking.single import PageBaker, BakingError | 5 from piecrust.baking.single import PageBaker, BakingError |
6 from piecrust.environment import AbortedSourceUseError | |
6 from piecrust.rendering import ( | 7 from piecrust.rendering import ( |
7 QualifiedPage, PageRenderingContext, render_page_segments) | 8 QualifiedPage, PageRenderingContext, render_page_segments) |
8 from piecrust.routing import create_route_metadata | 9 from piecrust.routing import create_route_metadata |
9 from piecrust.sources.base import PageFactory | 10 from piecrust.sources.base import PageFactory |
10 from piecrust.workerpool import IWorker | 11 from piecrust.workerpool import IWorker |
145 | 146 |
146 page = fac.buildPage() | 147 page = fac.buildPage() |
147 route_metadata = create_route_metadata(page) | 148 route_metadata = create_route_metadata(page) |
148 qp = QualifiedPage(page, route, route_metadata) | 149 qp = QualifiedPage(page, route, route_metadata) |
149 ctx = PageRenderingContext(qp) | 150 ctx = PageRenderingContext(qp) |
151 self.app.env.abort_source_use = True | |
150 | 152 |
151 result = { | 153 result = { |
152 'path': fac.path, | 154 'path': fac.path, |
155 'aborted': False, | |
153 'errors': None} | 156 'errors': None} |
154 logger.debug("Preparing page: %s" % fac.ref_spec) | 157 logger.debug("Preparing page: %s" % fac.ref_spec) |
155 try: | 158 try: |
156 render_page_segments(ctx) | 159 render_page_segments(ctx) |
160 except AbortedSourceUseError: | |
161 logger.debug("Page %s was aborted." % fac.ref_spec) | |
162 result['aborted'] = True | |
157 except Exception as ex: | 163 except Exception as ex: |
158 logger.debug("Got rendering error. Sending it to master.") | 164 logger.debug("Got rendering error. Sending it to master.") |
159 result['errors'] = _get_errors(ex) | 165 result['errors'] = _get_errors(ex) |
160 if self.ctx.debug: | 166 if self.ctx.debug: |
161 logger.exception(ex) | 167 logger.exception(ex) |
168 finally: | |
169 self.app.env.abort_source_use = False | |
162 return result | 170 return result |
163 | 171 |
164 | 172 |
165 class BakeJobHandler(JobHandler): | 173 class BakeJobHandler(JobHandler): |
166 def __init__(self, ctx): | 174 def __init__(self, ctx): |