Support running periodic tasks immediately at startup

This change adds a parameter to allow periodic tasks that would
otherwise have to wait for a lengthy initial interval to run immediately
when the periodic tasks are started. This patch also applies the new
facility in the the _sync_power_states task in the compute manager to
get more timely access to Openstack server state when the compute node
starts up.

Change-Id: I461a5dbaa7d18919941ec31402910eef188d8e8c
This commit is contained in:
Brent Eagles 2013-02-18 11:16:59 -03:30
parent 931515378c
commit d5233d1770
2 changed files with 16 additions and 5 deletions

View File

@ -3351,7 +3351,7 @@ class ComputeManager(manager.SchedulerDependentManager):
capability['host_ip'] = CONF.my_ip
self.update_service_capabilities(capabilities)
@manager.periodic_task(spacing=600.0)
@manager.periodic_task(spacing=600.0, run_immediately=True)
def _sync_power_states(self, context):
"""Align power states between the database and the hypervisor.

View File

@ -88,9 +88,15 @@ def periodic_task(*args, **kwargs):
1. Without arguments '@periodic_task', this will be run on every cycle
of the periodic scheduler.
2. With arguments, @periodic_task(periodic_spacing=N), this will be
run on approximately every N seconds. If this number is negative the
periodic task will be disabled.
2. With arguments:
@periodic_task(spacing=N [, run_immediately=[True|False]])
this will be run on approximately every N seconds. If this number is
negative the periodic task will be disabled. If the run_immediately
argument is provided and has a value of 'True', the first run of the
task will be shortly after task scheduler starts. If
run_immediately is omitted or set to 'False', the first time the
task runs will be approximately N seconds after the task scheduler
starts.
"""
def decorator(f):
# Test for old style invocation
@ -107,7 +113,10 @@ def periodic_task(*args, **kwargs):
# Control frequency
f._periodic_spacing = kwargs.pop('spacing', 0)
f._periodic_last_run = time.time()
if kwargs.pop('run_immediately', False):
f._periodic_last_run = None
else:
f._periodic_last_run = time.time()
return f
# NOTE(sirp): The `if` is necessary to allow the decorator to be used with
@ -213,6 +222,8 @@ class Manager(base.Base):
# 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])