summaryrefslogtreecommitdiffstats
path: root/openstack/common
diff options
context:
space:
mode:
authorEoghan Glynn <eglynn@redhat.com>2012-11-16 15:17:52 +0000
committerEoghan Glynn <eglynn@redhat.com>2012-11-19 22:16:48 +0000
commit615d76910388d3590ad77e9cfce7ded421b060c0 (patch)
tree814a2044fa8bb9082d08f7e932fc9e9e5fd7a480 /openstack/common
parentce80aac98a905a07ea7ec093f37243a4c3bbb6e0 (diff)
downloadoslo-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.py9
-rw-r--r--openstack/common/timeutils.py16
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):