From d5233d17706148a821c9ca3022ae63c74e9c8748 Mon Sep 17 00:00:00 2001 From: Brent Eagles Date: Mon, 18 Feb 2013 11:16:59 -0330 Subject: [PATCH] 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 --- nova/compute/manager.py | 2 +- nova/manager.py | 19 +++++++++++++++---- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/nova/compute/manager.py b/nova/compute/manager.py index 1b545495c823..13a294e9b776 100755 --- a/nova/compute/manager.py +++ b/nova/compute/manager.py @@ -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. diff --git a/nova/manager.py b/nova/manager.py index 7c7cbeb67a56..a0269d30b775 100644 --- a/nova/manager.py +++ b/nova/manager.py @@ -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])