aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Austein <sra@hactrn.net>2016-02-19 19:27:48 +0000
committerRob Austein <sra@hactrn.net>2016-02-19 19:27:48 +0000
commitf8187b414e0b6777b97d99ecf94a101eeb960e70 (patch)
tree11b4688c0dc4bfb40fdfc021727355a1ec6b95fd
parentf25d3cc4f67fba3b7130357dbd03c4b617dc705f (diff)
Task system tweaks, see if this fixes hangs on postponed tasks.
svn path=/branches/tk705/; revision=6273
-rw-r--r--rpki/rpkid.py2
-rw-r--r--rpki/rpkid_tasks.py7
2 files changed, 8 insertions, 1 deletions
diff --git a/rpki/rpkid.py b/rpki/rpkid.py
index fbbb1cfc..a82195b3 100644
--- a/rpki/rpkid.py
+++ b/rpki/rpkid.py
@@ -291,7 +291,7 @@ class main(object):
def cronjob_handler(self, handler):
"""
External trigger to schedule periodic tasks. Obsolete for
- produciton use, but portions of the test framework still use this.
+ production use, but portions of the test framework still use this.
"""
if self.use_internal_cron:
diff --git a/rpki/rpkid_tasks.py b/rpki/rpkid_tasks.py
index 9fe193ae..afe518fa 100644
--- a/rpki/rpkid_tasks.py
+++ b/rpki/rpkid_tasks.py
@@ -22,6 +22,7 @@ because interactions with rpkid scheduler were getting too complicated.
"""
import logging
+import random
import tornado.gen
import tornado.web
@@ -126,6 +127,12 @@ class AbstractTask(object):
logger.debug("%r: Postponing", self)
self.due_date = None
self.runnable.clear()
+ tasks = tuple(task for task in self.rpkid.task_queue if task is not None)
+ if any(task.runnable.is_set() for task in tasks):
+ logger.debug("%r: Runable tasks exist, leaving well enough alone", self)
+ else:
+ logger.debug("%r: All tasks were postponed, reenabling one picked at random", self)
+ random.choice(tasks).runnable.set()
try:
self.serialize.release()
yield self.runnable.wait()