summaryrefslogtreecommitdiffstats
path: root/nova/manager.py
diff options
context:
space:
mode:
Diffstat (limited to 'nova/manager.py')
-rw-r--r--nova/manager.py37
1 files changed, 17 insertions, 20 deletions
diff --git a/nova/manager.py b/nova/manager.py
index cc7d464ca..d6a62c509 100644
--- a/nova/manager.py
+++ b/nova/manager.py
@@ -53,8 +53,7 @@ This module provides Manager, a base class for managers.
"""
-import time
-
+import datetime
import eventlet
from oslo.config import cfg
@@ -63,6 +62,7 @@ from nova import exception
from nova.openstack.common import log as logging
from nova.openstack.common.plugin import pluginmanager
from nova.openstack.common.rpc import dispatcher as rpc_dispatcher
+from nova.openstack.common import timeutils
from nova.scheduler import rpcapi as scheduler_rpcapi
@@ -114,10 +114,11 @@ def periodic_task(*args, **kwargs):
# Control frequency
f._periodic_spacing = kwargs.pop('spacing', 0)
- if kwargs.pop('run_immediately', False):
+ f._periodic_immediate = kwargs.pop('run_immediately', False)
+ if f._periodic_immediate:
f._periodic_last_run = None
else:
- f._periodic_last_run = time.time()
+ f._periodic_last_run = timeutils.utcnow()
return f
# NOTE(sirp): The `if` is necessary to allow the decorator to be used with
@@ -220,22 +221,22 @@ class Manager(base.Base):
for task_name, task in self._periodic_tasks:
full_task_name = '.'.join([self.__class__.__name__, task_name])
+ now = timeutils.utcnow()
+ spacing = self._periodic_spacing[task_name]
+ last_run = self._periodic_last_run[task_name]
+
# If a periodic task is _nearly_ due, then we'll run it early
- if self._periodic_spacing[task_name] is None:
- wait = 0
- elif self._periodic_last_run[task_name] is None:
- wait = 0
- else:
- due = (self._periodic_last_run[task_name] +
- self._periodic_spacing[task_name])
- wait = max(0, due - time.time())
- if wait > 0.2:
- if wait < idle_for:
- idle_for = wait
+ if spacing is not None and last_run is not None:
+ due = last_run + datetime.timedelta(seconds=spacing)
+ if not timeutils.is_soon(due, 0.2):
+ idle_for = min(idle_for, timeutils.delta_seconds(now, due))
continue
+ if spacing is not None:
+ idle_for = min(idle_for, spacing)
+
LOG.debug(_("Running periodic task %(full_task_name)s"), locals())
- self._periodic_last_run[task_name] = time.time()
+ self._periodic_last_run[task_name] = timeutils.utcnow()
try:
task(self, context)
@@ -244,10 +245,6 @@ class Manager(base.Base):
raise
LOG.exception(_("Error during %(full_task_name)s: %(e)s"),
locals())
-
- if (not self._periodic_spacing[task_name] is None and
- self._periodic_spacing[task_name] < idle_for):
- idle_for = self._periodic_spacing[task_name]
eventlet.sleep(0)
return idle_for