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):