diff options
| author | Eoghan Glynn <eglynn@redhat.com> | 2012-11-16 15:17:52 +0000 |
|---|---|---|
| committer | Eoghan Glynn <eglynn@redhat.com> | 2012-11-19 22:16:48 +0000 |
| commit | 615d76910388d3590ad77e9cfce7ded421b060c0 (patch) | |
| tree | 814a2044fa8bb9082d08f7e932fc9e9e5fd7a480 /openstack/common | |
| parent | ce80aac98a905a07ea7ec093f37243a4c3bbb6e0 (diff) | |
| download | oslo-615d76910388d3590ad77e9cfce7ded421b060c0.tar.gz oslo-615d76910388d3590ad77e9cfce7ded421b060c0.tar.xz oslo-615d76910388d3590ad77e9cfce7ded421b060c0.zip | |
Account for tasks duration in LoopingCall delay
Fixes bug 1079725
Previously the time spent executing tasks was not accounted for
when determining how much time to sleep between task runs.
Now we subtract the duration of the last tasks run from the next
sleep interval.
Change-Id: I4b3e27d4aaa21d020159d46eea40bdd80361cea7
Diffstat (limited to 'openstack/common')
| -rw-r--r-- | openstack/common/loopingcall.py | 9 | ||||
| -rw-r--r-- | openstack/common/timeutils.py | 16 |
2 files changed, 21 insertions, 4 deletions
diff --git a/openstack/common/loopingcall.py b/openstack/common/loopingcall.py index 1d34519..be044d8 100644 --- a/openstack/common/loopingcall.py +++ b/openstack/common/loopingcall.py @@ -24,6 +24,7 @@ from eventlet import greenthread from openstack.common.gettextutils import _ from openstack.common import log as logging +from openstack.common import timeutils LOG = logging.getLogger(__name__) @@ -62,10 +63,16 @@ class LoopingCall(object): try: while self._running: + start = timeutils.utcnow() self.f(*self.args, **self.kw) + end = timeutils.utcnow() if not self._running: break - greenthread.sleep(interval) + delay = interval - timeutils.delta_seconds(start, end) + if delay <= 0: + LOG.warn(_('task run outlasted interval by %s sec') % + -delay) + greenthread.sleep(delay if delay > 0 else 0) except LoopingCallDone, e: self.stop() done.send(e.retvalue) diff --git a/openstack/common/timeutils.py b/openstack/common/timeutils.py index 4bf19a5..ea69164 100644 --- a/openstack/common/timeutils.py +++ b/openstack/common/timeutils.py @@ -87,7 +87,10 @@ def utcnow_ts(): def utcnow(): """Overridable version of utils.utcnow.""" if utcnow.override_time: - return utcnow.override_time + try: + return utcnow.override_time.pop(0) + except AttributeError: + return utcnow.override_time return datetime.datetime.utcnow() @@ -95,14 +98,21 @@ utcnow.override_time = None def set_time_override(override_time=datetime.datetime.utcnow()): - """Override utils.utcnow to return a constant time.""" + """ + Override utils.utcnow to return a constant time or a list thereof, + one at a time. + """ utcnow.override_time = override_time def advance_time_delta(timedelta): """Advance overridden time using a datetime.timedelta.""" assert(not utcnow.override_time is None) - utcnow.override_time += timedelta + try: + for dt in utcnow.override_time: + dt += timedelta + except TypeError: + utcnow.override_time += timedelta def advance_time_seconds(seconds): |
