comparison piecrust/baking/baker.py @ 876:d1095774bfcf

refactor: Fix some issues with record/cache entry collisions, add counters.
author Ludovic Chabant <ludovic@chabant.com>
date Thu, 15 Jun 2017 07:33:40 -0700
parents 504ddb370df8
children d6d35b2efd04
comparison
equal deleted inserted replaced
875:7169bf42ec60 876:d1095774bfcf
41 logger.debug(" Root URL: %s" % self.app.config.get('site/root')) 41 logger.debug(" Root URL: %s" % self.app.config.get('site/root'))
42 42
43 # Get into bake mode. 43 # Get into bake mode.
44 self.app.config.set('baker/is_baking', True) 44 self.app.config.set('baker/is_baking', True)
45 self.app.config.set('site/asset_url_format', '%page_uri%/%filename%') 45 self.app.config.set('site/asset_url_format', '%page_uri%/%filename%')
46
47 stats = self.app.env.stats
48 stats.registerTimer('WorkerTastPut')
46 49
47 # Make sure the output directory exists. 50 # Make sure the output directory exists.
48 if not os.path.isdir(self.out_dir): 51 if not os.path.isdir(self.out_dir):
49 os.makedirs(self.out_dir, 0o755) 52 os.makedirs(self.out_dir, 0o755)
50 53
109 realm_list = [REALM_USER, REALM_THEME] 112 realm_list = [REALM_USER, REALM_THEME]
110 113
111 # Bake the realms -- user first, theme second, so that a user item 114 # Bake the realms -- user first, theme second, so that a user item
112 # can override a theme item. 115 # can override a theme item.
113 # Do this for as many times as we have pipeline passes left to do. 116 # Do this for as many times as we have pipeline passes left to do.
114 pp_by_pass_and_realm = {} 117 pp_by_pass_and_realm = _get_pipeline_infos_by_pass_and_realm(
115 for ppinfo in ppmngr.getPipelines(): 118 ppmngr.getPipelines())
116 pp_by_realm = pp_by_pass_and_realm.setdefault(
117 ppinfo.pipeline.PASS_NUM, {})
118 pplist = pp_by_realm.setdefault(
119 ppinfo.pipeline.source.config['realm'], [])
120 pplist.append(ppinfo)
121 119
122 for pp_pass_num in sorted(pp_by_pass_and_realm.keys()): 120 for pp_pass_num in sorted(pp_by_pass_and_realm.keys()):
123 logger.debug("Pipelines pass %d" % pp_pass_num) 121 logger.debug("Pipelines pass %d" % pp_pass_num)
124 pp_by_realm = pp_by_pass_and_realm[pp_pass_num] 122 pp_by_realm = pp_by_pass_and_realm[pp_pass_num]
125 for realm in realm_list: 123 for realm in realm_list:
134 ppmngr.collapseRecords() 132 ppmngr.collapseRecords()
135 133
136 # All done with the workers. Close the pool and get reports. 134 # All done with the workers. Close the pool and get reports.
137 pool_stats = pool.close() 135 pool_stats = pool.close()
138 total_stats = ExecutionStats() 136 total_stats = ExecutionStats()
137 total_stats.mergeStats(stats)
139 for ps in pool_stats: 138 for ps in pool_stats:
140 if ps is not None: 139 if ps is not None:
141 total_stats.mergeStats(ps) 140 total_stats.mergeStats(ps)
142 current_records.stats = total_stats 141 current_records.stats = total_stats
143 142
222 pool.userdata.next_pass_jobs = next_pass_jobs 221 pool.userdata.next_pass_jobs = next_pass_jobs
223 222
224 start_time = time.perf_counter() 223 start_time = time.perf_counter()
225 job_count = 0 224 job_count = 0
226 realm_name = REALM_NAMES[realm].lower() 225 realm_name = REALM_NAMES[realm].lower()
226 stats = self.app.env.stats
227 227
228 for ppinfo in pplist: 228 for ppinfo in pplist:
229 src = ppinfo.source 229 src = ppinfo.source
230 pp = ppinfo.pipeline 230 pp = ppinfo.pipeline
231 231
238 jcctx = PipelineJobCreateContext(pp_pass_num, record_histories) 238 jcctx = PipelineJobCreateContext(pp_pass_num, record_histories)
239 jobs = pp.createJobs(jcctx) 239 jobs = pp.createJobs(jcctx)
240 if jobs is not None: 240 if jobs is not None:
241 job_count += len(jobs) 241 job_count += len(jobs)
242 pool.queueJobs(jobs) 242 pool.queueJobs(jobs)
243
244 stats.stepTimer('WorkerTastPut', time.perf_counter() - start_time)
243 245
244 if job_count == 0: 246 if job_count == 0:
245 logger.debug("No jobs queued! Bailing out of this bake pass.") 247 logger.debug("No jobs queued! Bailing out of this bake pass.")
246 return 248 return
247 249
270 "Queuing jobs for source '%s' (%s, pass %d)." % 272 "Queuing jobs for source '%s' (%s, pass %d)." %
271 (sn, realm_name, pool.userdata.cur_pass)) 273 (sn, realm_name, pool.userdata.cur_pass))
272 job_count += len(jobs) 274 job_count += len(jobs)
273 pool.userdata.next_pass_jobs[sn] = [] 275 pool.userdata.next_pass_jobs[sn] = []
274 pool.queueJobs(jobs) 276 pool.queueJobs(jobs)
277
278 stats.stepTimer('WorkerTastPut', time.perf_counter() - start_time)
275 279
276 if job_count == 0: 280 if job_count == 0:
277 break 281 break
278 282
279 pool.wait() 283 pool.wait()
346 e = entry_class() 350 e = entry_class()
347 e.item_spec = job.content_item.spec 351 e.item_spec = job.content_item.spec
348 e.errors.append(str(exc_data)) 352 e.errors.append(str(exc_data))
349 record.addEntry(e) 353 record.addEntry(e)
350 else: 354 else:
351 e = record.getEntry(job.content_item.spec) 355 e = record.getEntry(job.record_entry_spec)
352 e.errors.append(str(exc_data)) 356 e.errors.append(str(exc_data))
353 357
354 record.success = False 358 record.success = False
355 userdata.records.success = False 359 userdata.records.success = False
356 360
364 self.baker = baker 368 self.baker = baker
365 self.ppmngr = ppmngr 369 self.ppmngr = ppmngr
366 self.records = ppmngr.record_histories.current 370 self.records = ppmngr.record_histories.current
367 self.cur_pass = 0 371 self.cur_pass = 0
368 self.next_pass_jobs = {} 372 self.next_pass_jobs = {}
373
374
375 def _get_pipeline_infos_by_pass_and_realm(pp_infos):
376 pp_by_pass_and_realm = {}
377 for pp_info in pp_infos:
378 pp_pass_num = pp_info.pipeline.PASS_NUM
379 if isinstance(pp_pass_num, list):
380 for ppn in pp_pass_num:
381 _add_pipeline_info_to_pass_and_realm_dict(
382 ppn, pp_info, pp_by_pass_and_realm)
383 else:
384 _add_pipeline_info_to_pass_and_realm_dict(
385 pp_pass_num, pp_info, pp_by_pass_and_realm)
386 return pp_by_pass_and_realm
387
388
389 def _add_pipeline_info_to_pass_and_realm_dict(pp_pass_num, pp_info,
390 pp_by_pass_and_realm):
391 pp_by_realm = pp_by_pass_and_realm.setdefault(pp_pass_num, {})
392 pplist = pp_by_realm.setdefault(
393 pp_info.pipeline.source.config['realm'], [])
394 pplist.append(pp_info)
395