'agent_type': constants.AGENT_TYPE_DHCP}
report_interval = cfg.CONF.AGENT.report_interval
if report_interval:
- self.heartbeat = loopingcall.LoopingCall(self._report_state)
+ self.heartbeat = loopingcall.FixedIntervalLoopingCall(
+ self._report_state)
self.heartbeat.start(interval=report_interval)
def _report_state(self):
'agent_type': l3_constants.AGENT_TYPE_L3}
report_interval = cfg.CONF.AGENT.report_interval
if report_interval:
- self.heartbeat = loopingcall.LoopingCall(self._report_state)
+ self.heartbeat = loopingcall.FixedIntervalLoopingCall(
+ self._report_state)
self.heartbeat.start(interval=report_interval)
def _report_state(self):
self.retvalue = retvalue
-class LoopingCall(object):
+class LoopingCallBase(object):
def __init__(self, f=None, *args, **kw):
self.args = args
self.kw = kw
self.f = f
self._running = False
+ self.done = None
+
+ def stop(self):
+ self._running = False
+
+ def wait(self):
+ return self.done.wait()
+
+
+class FixedIntervalLoopingCall(LoopingCallBase):
+ """A fixed interval looping call."""
def start(self, interval, initial_delay=None):
self._running = True
self.stop()
done.send(e.retvalue)
except Exception:
- LOG.exception(_('in looping call'))
+ LOG.exception(_('in fixed duration looping call'))
done.send_exception(*sys.exc_info())
return
else:
greenthread.spawn_n(_inner)
return self.done
- def stop(self):
- self._running = False
- def wait(self):
- return self.done.wait()
+# TODO(mikal): this class name is deprecated in Havana and should be removed
+# in the I release
+LoopingCall = FixedIntervalLoopingCall
+
+
+class DynamicLoopingCall(LoopingCallBase):
+ """A looping call which sleeps until the next known event.
+
+ The function called should return how long to sleep for before being
+ called again.
+ """
+
+ def start(self, initial_delay=None, periodic_interval_max=None):
+ self._running = True
+ done = event.Event()
+
+ def _inner():
+ if initial_delay:
+ greenthread.sleep(initial_delay)
+
+ try:
+ while self._running:
+ idle = self.f(*self.args, **self.kw)
+ if not self._running:
+ break
+
+ if periodic_interval_max is not None:
+ idle = min(idle, periodic_interval_max)
+ LOG.debug(_('Dynamic looping call sleeping for %.02f '
+ 'seconds'), idle)
+ greenthread.sleep(idle)
+ except LoopingCallDone, e:
+ self.stop()
+ done.send(e.retvalue)
+ except Exception:
+ LOG.exception(_('in dynamic looping call'))
+ done.send_exception(*sys.exc_info())
+ return
+ else:
+ done.send(True)
+
+ self.done = done
+
+ greenthread.spawn(_inner)
+ return self.done
def add_timer(self, interval, callback, initial_delay=None,
*args, **kwargs):
- pulse = loopingcall.LoopingCall(callback, *args, **kwargs)
+ pulse = loopingcall.FixedIntervalLoopingCall(callback, *args, **kwargs)
pulse.start(interval=interval,
initial_delay=initial_delay)
self.timers.append(pulse)
consumers)
report_interval = cfg.CONF.AGENT.report_interval
if report_interval:
- heartbeat = loopingcall.LoopingCall(self._report_state)
+ heartbeat = loopingcall.FixedIntervalLoopingCall(
+ self._report_state)
heartbeat.start(interval=report_interval)
def setup_linux_bridge(self, interface_mappings):
report_interval = config.CONF.AGENT.report_interval
if report_interval:
- heartbeat = loopingcall.LoopingCall(self._report_state)
+ heartbeat = loopingcall.FixedIntervalLoopingCall(
+ self._report_state)
heartbeat.start(interval=report_interval)
def _report_state(self):
consumers)
report_interval = cfg.CONF.AGENT.report_interval
if report_interval:
- heartbeat = loopingcall.LoopingCall(self._report_state)
+ heartbeat = loopingcall.FixedIntervalLoopingCall(
+ self._report_state)
heartbeat.start(interval=report_interval)
def get_net_uuid(self, vif_id):
self.manager.init_host()
super(Service, self).start()
if self.report_interval:
- pulse = loopingcall.LoopingCall(self.report_state)
+ pulse = loopingcall.FixedIntervalLoopingCall(self.report_state)
pulse.start(interval=self.report_interval,
initial_delay=self.report_interval)
self.timers.append(pulse)
else:
initial_delay = None
- periodic = loopingcall.LoopingCall(self.periodic_tasks)
+ periodic = loopingcall.FixedIntervalLoopingCall(
+ self.periodic_tasks)
periodic.start(interval=self.periodic_interval,
initial_delay=initial_delay)
self.timers.append(periodic)