Add callbacks for futures

Added callbacks for the known futures (react scripts, scheduler,
serializer). This will help us debug known long-lasting futures
easily. Define one function called future_callback, and use
functools to pass arguments to the callbacks to determine type
of future, etc

Change-Id: I579a41e92736568535ce3f64c5507ac5224d5a62
This commit is contained in:
Pranesh Pandurangan 2014-07-06 13:45:40 -07:00
parent 5b647e5f79
commit 857fb52cf1
1 changed files with 27 additions and 2 deletions

View File

@ -17,6 +17,7 @@
import collections
import datetime
import functools
import logging
import operator
import os
@ -83,6 +84,7 @@ class Engine(object):
# Serializer related variables
self._serializer = None
self._scheduler = None
# State related variables
self._state = states.ENABLED
@ -127,13 +129,19 @@ class Engine(object):
if not self._serializer:
self._serializer = self.executor.submit(self.start_serializer)
self.futures.append(self._serializer)
self._serializer.add_done_callback(
functools.partial(self.future_callback,
future_type='serializer'))
# Start react scripts.
self.futures.extend(self.start_react_scripts(
self._get_react_scripts()))
scheduler = self.executor.submit(self.schedule)
self.futures.append(scheduler)
self._scheduler = self.executor.submit(self.schedule)
self.futures.append(self._scheduler)
self._scheduler.add_done_callback(
functools.partial(self.future_callback,
future_type='scheduler'))
# watchdog
self._watchdog_thread = self.start_watchdog()
@ -147,6 +155,19 @@ class Engine(object):
if next_jobs:
self.setup_audit(next_time, next_jobs)
def future_callback(self, future, future_type='unknown_type',
name='no_name', **kwargs):
if future_type in ['serializer', 'scheduler']:
LOG.info('Call back for %s, finished state %s',
future_type, future.done())
return
if future_type == 'react':
LOG.info('Callback for react script %s', name)
for future in self._repairs:
if not future.done():
LOG.info('Not all react scripts are done yet')
return
def wait_next(self, timeout=None):
watch = None
next_jobs = []
@ -377,6 +398,10 @@ class Engine(object):
self.running_repairs.append(script)
imported_module = imp.load_module(react_script, *available_modules)
future = self.executor.submit(imported_module.main, **kwargs)
future.add_done_callback(
functools.partial(self.future_callback,
future_type='react',
name=kwargs['name']))
self._repairs.append(future)
return future
except Exception: