aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--rpkid/rpki/rpki_engine.py54
1 files changed, 40 insertions, 14 deletions
diff --git a/rpkid/rpki/rpki_engine.py b/rpkid/rpki/rpki_engine.py
index 69a196e6..c5ee2164 100644
--- a/rpkid/rpki/rpki_engine.py
+++ b/rpkid/rpki/rpki_engine.py
@@ -63,7 +63,12 @@ class rpkid_context(object):
self.initial_delay = random.randint(cfg.getint("initial-delay-min", 10),
cfg.getint("initial-delay-max", 120))
- self.cron_period = cfg.getint("cron-period", 120) # Should be much longer in production
+ # Should be much longer in production
+ self.cron_period = rpki.sundial.timedelta(seconds = cfg.getint("cron-period", 120))
+ self.cron_keepalive = rpki.sundial.timedelta(seconds = cfg.getint("cron-keepalive", 0))
+ if not self.cron_keepalive:
+ self.cron_keepalive = self.cron_period * 4
+ self.cron_timeout = None
def start_cron(self):
"""
@@ -199,31 +204,52 @@ class rpkid_context(object):
rpki.log.trace()
self.sql.ping()
- def loop(iterator, s):
- s.cron(iterator)
+ now = rpki.sundial.now()
+
+ assert self.use_internal_cron or self.cron_timeout is None
+
+ if self.use_internal_cron:
+
+ if self.cron_timeout and self.cron_timeout < now + self.cron_keepalive:
+ rpki.log.warn("cron keepalive threshold %s has expired, breaking lock" % self.cron_timeout)
+ self.cron_timeout = None
- def sched():
- when = rpki.sundial.now() + rpki.sundial.timedelta(seconds = self.cron_period)
+ when = now + self.cron_period
rpki.log.debug("Scheduling next cron run at %s" % when)
rpki.async.timer(handler = self.cron).set(when)
+ if self.cron_timeout:
+ rpki.log.warn("cron already running, keepalive will expire at %s" % self.cron_timeout)
+ return
+
+ self.cron_timeout = now + self.cron_keepalive
+
+ def loop(iterator, s):
+ s.cron(iterator)
+
def done():
self.sql.sweep()
- if self.use_internal_cron:
- sched()
- else:
+ self.cron_timeout = None
+ rpki.log.info("Finished cron run started at %s" % now)
+ if not self.use_internal_cron:
cb()
- try:
- rpki.async.iterator(rpki.left_right.self_elt.sql_fetch_all(self), loop, done)
- except (rpki.async.ExitNow, SystemExit):
- raise
- except Exception, data:
+ def lose(e):
+ self.cron_timeout = None
if self.use_internal_cron:
rpki.log.traceback()
- sched()
else:
raise
+
+ try:
+ rpki.async.iterator(rpki.left_right.self_elt.sql_fetch_all(self), loop, done)
+
+ except (rpki.async.ExitNow, SystemExit):
+ self.cron_timeout = None
+ raise
+
+ except Exception, e:
+ lose(e)
def cronjob_handler(self, query, path, cb):
"""