Skip to content

Commit 774d785

Browse files
remove debug messages that caused quadratic runtime
1 parent ad40df2 commit 774d785

File tree

2 files changed

+6
-32
lines changed

2 files changed

+6
-32
lines changed

snakemake/dag.py

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -481,8 +481,6 @@ async def check_incomplete(self):
481481
incomplete = await self.incomplete_files()
482482
if incomplete:
483483
if self.workflow.dag_settings.force_incomplete:
484-
logger.debug("Forcing incomplete files:")
485-
logger.debug("\t" + "\n\t".join(incomplete))
486484
self.forcefiles.update(incomplete)
487485
else:
488486
raise IncompleteFilesException(incomplete)
@@ -767,11 +765,6 @@ def unshadow_output(self, job, only_log=False):
767765

768766
if os.path.realpath(shadow_output) == os.path.realpath(real_output):
769767
continue
770-
logger.debug(
771-
"Moving shadow output {} to destination {}".format(
772-
shadow_output, real_output
773-
)
774-
)
775768
shutil.move(shadow_output, real_output)
776769
shutil.rmtree(job.shadow_dir)
777770

@@ -1851,7 +1844,6 @@ async def update_checkpoint_dependencies(self, jobs=None):
18511844
depending = list(self.depending[job])
18521845
all_depending.extend(depending)
18531846
for j in all_depending:
1854-
logger.debug(f"Updating job {j}.")
18551847
newjob = await j.updated()
18561848
await self.replace_job(j, newjob, recursive=False)
18571849
updated = True
@@ -2044,9 +2036,7 @@ async def replace_job(self, job, newjob, recursive=True):
20442036

20452037
await self.update([newjob])
20462038

2047-
logger.debug(f"Replace {job} with {newjob}")
20482039
for job_, files in depending:
2049-
logger.debug(f"updating depending job {job_}")
20502040
self._dependencies[job_][newjob].update(files)
20512041
self.depending[newjob][job_].update(files)
20522042

snakemake/scheduler.py

Lines changed: 6 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -263,20 +263,14 @@ def schedule(self):
263263
job.reset_params_and_resources()
264264

265265
logger.debug(f"Resources before job selection: {self.resources}")
266-
logger.debug(
267-
f"Ready jobs ({len(needrun)})",
268-
# + "\n\t".join(map(str, needrun))
269-
)
266+
logger.debug(f"Ready jobs: {len(needrun)}")
270267

271268
if not self._last_job_selection_empty:
272269
logger.info("Select jobs to execute...")
273270
run = self.job_selector(needrun)
274271
self._last_job_selection_empty = not run
275272

276-
logger.debug(
277-
f"Selected jobs ({len(run)})"
278-
# + "\n\t".join(map(str, run))
279-
)
273+
logger.debug(f"Selected jobs: {len(run)}")
280274
logger.debug(f"Resources after job selection: {self.resources}")
281275

282276
# update running jobs
@@ -335,6 +329,9 @@ def _finish_jobs(self):
335329
# clear the global tofinish such that parallel calls do not interfere
336330
async def postprocess():
337331
for job in self._tofinish:
332+
# IMPORTANT: inside of this loop, there may be no calls that have
333+
# a complexity of at least the number of jobs.
334+
# Otherwise the function would be quadratic in the number of jobs.
338335
if not self.workflow.dryrun:
339336
try:
340337
if self.workflow.exec_mode == ExecMode.DEFAULT:
@@ -373,9 +370,6 @@ async def postprocess():
373370
if self.update_resources:
374371
# normal jobs have len=1, group jobs have len>1
375372
self.finished_jobs += len(job)
376-
logger.debug(
377-
f"jobs registered as running before removal {self.running}"
378-
)
379373
self.running.remove(job)
380374
self._free_resources(job)
381375

@@ -429,7 +423,6 @@ def _free_resources(self, job):
429423
def _proceed(self, job):
430424
"""Do stuff after job is finished."""
431425
with self._lock:
432-
logger.debug(f"Completion of job {job.rules} reported to scheduler.")
433426
self._tofinish.append(job)
434427

435428
if self.dryrun:
@@ -506,12 +499,7 @@ def job_selector_ilp(self, jobs):
506499
import pulp
507500
from pulp import lpSum
508501

509-
logger.debug("Selecting jobs to run using ILP solver.")
510-
511502
if len(jobs) == 1:
512-
logger.debug(
513-
"Switching to greedy selector because only one job has to be scheduled."
514-
)
515503
return self.job_selector_greedy(jobs)
516504

517505
with self._lock:
@@ -626,7 +614,6 @@ async def get_temp_sizes_gb():
626614
)
627615

628616
status = self._solve_ilp(prob, time_limit=10)
629-
logger.debug(f"Problem is {pulp.LpStatus[status]}")
630617
if pulp.LpStatus[status] != "Optimal":
631618
if pulp.LpStatus[status] == "Not Solved":
632619
logger.warning(
@@ -635,7 +622,7 @@ async def get_temp_sizes_gb():
635622
elif pulp.LpStatus[status] == "Infeasible":
636623
logger.warning("Failed to solve scheduling problem with ILP solver.")
637624

638-
logger.debug("Falling back to greedy solver.")
625+
logger.warning("Falling back to greedy solver.")
639626
return self.job_selector_greedy(jobs)
640627

641628
selected_jobs = set(
@@ -841,7 +828,4 @@ def get_free_jobs(self):
841828
for _ in range(index):
842829
self._jobs.popleft()
843830
n_free = max(self._limit.max_jobs - len(self._jobs), 0)
844-
logger.debug(
845-
f"Free jobs: {n_free}, jobs in timespan: {len(self._jobs)}, limit: {self._limit.max_jobs}, timespan: {self._limit.timespan}"
846-
)
847831
return n_free

0 commit comments

Comments
 (0)