From c51db5fa471cedc6b9145f3cb87cd8ffe49a8293 Mon Sep 17 00:00:00 2001
From: Martin Mares <mj@ucw.cz>
Date: Sun, 20 Oct 2024 15:58:43 +0200
Subject: [PATCH] =?UTF-8?q?run-jobs:=20Probouzen=C3=AD=20=C4=8Dekaj=C3=ADc?=
 =?UTF-8?q?=C3=ADch=20job=C5=AF=20jen=20na=20po=C5=BE=C3=A1d=C3=A1n=C3=AD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Jinak v testovacím prostředí spouštíme hromady jobů naplánovaných
na nějaké datum v dávné minulosti (ročník 42).
---
 bin/run-jobs        |  5 ++++-
 mo/jobs/__init__.py | 19 ++++++++++---------
 2 files changed, 14 insertions(+), 10 deletions(-)

diff --git a/bin/run-jobs b/bin/run-jobs
index 2b76a58f..f0460c56 100755
--- a/bin/run-jobs
+++ b/bin/run-jobs
@@ -7,6 +7,7 @@ import argparse
 parser = argparse.ArgumentParser(description='Spustí joby ve frontě')
 parser.add_argument('-j', '--job', type=int, metavar='ID', help='Spustí konkrétní job')
 parser.add_argument('-r', '--restart', default=False, action='store_true', help='Znovu spustí dokončený job')
+parser.add_argument('-w', '--wake', default=False, action='store_true', help='Probudí naplánované joby, jejichž čas přišel')
 
 args = parser.parse_args()
 
@@ -15,9 +16,11 @@ init_standalone()
 if args.job is None:
     if args.restart:
         die("Přepínač --restart lze použít jen s --job")
-    mo.jobs.process_jobs()
+    mo.jobs.process_jobs(wake=args.wake)
 else:
     tj = mo.jobs.TheJob(args.job)
     if not tj.load():
         die("Tento job neexistuje")
+    if args.wake:
+        tj.wake()
     tj.run(restart=args.restart)
diff --git a/mo/jobs/__init__.py b/mo/jobs/__init__.py
index b82ac547..95d6cdb6 100644
--- a/mo/jobs/__init__.py
+++ b/mo/jobs/__init__.py
@@ -240,7 +240,7 @@ class TheJob:
                 mo.email.send_job_done_email(job)
 
 
-def process_jobs(min_priority: int = 0):
+def process_jobs(min_priority: int = 0, wake: bool = True):
     sess = db.get_session()
     assert hasattr(mo, 'now'), 'mo.now není nastaveno'
 
@@ -259,14 +259,15 @@ def process_jobs(min_priority: int = 0):
         tj.expire()
 
     # Probereme čekající joby, jejichž čas už přišel
-    to_wake = (sess.query(db.Job.job_id)
-               .filter(db.Job.state == db.JobState.waiting)
-               .filter(db.Job.waiting_until < mo.now)
-               .all())
-    sess.rollback()
-    for job_id, in to_wake:
-        tj = TheJob(job_id)
-        tj.wake()
+    if wake:
+        to_wake = (sess.query(db.Job.job_id)
+                   .filter(db.Job.state == db.JobState.waiting)
+                   .filter(db.Job.waiting_until < mo.now)
+                   .all())
+        sess.rollback()
+        for job_id, in to_wake:
+            tj = TheJob(job_id)
+            tj.wake()
 
     # Probereme joby, které by měly běžet
     ready = (sess.query(db.Job.job_id)
-- 
GitLab