Index: chrome/common/extensions/docs/server2/cron_servlet.py |
diff --git a/chrome/common/extensions/docs/server2/cron_servlet.py b/chrome/common/extensions/docs/server2/cron_servlet.py |
index aa37ae3091c8d02ab97770ac91e0cd5e43081c0b..7865aa0163fc394c9727f210c3df79a81ca0008d 100644 |
--- a/chrome/common/extensions/docs/server2/cron_servlet.py |
+++ b/chrome/common/extensions/docs/server2/cron_servlet.py |
@@ -15,6 +15,7 @@ from data_source_registry import CreateDataSources |
from empty_dir_file_system import EmptyDirFileSystem |
from environment import IsDevServer |
from file_system_util import CreateURLsFromPaths |
+from future import Gettable, Future |
from github_file_system_provider import GithubFileSystemProvider |
from host_file_system_provider import HostFileSystemProvider |
from object_store_creator import ObjectStoreCreator |
@@ -151,6 +152,41 @@ class CronServlet(Servlet): |
results = [] |
try: |
+ # Start running the hand-written Cron methods first; they can be run in |
+ # parallel. They are resolved at the end. |
+ def run_cron_for_future(target): |
+ title = target.__class__.__name__ |
+ start_time = time.time() |
+ future = target.Cron() |
+ init_time = time.time() - start_time |
+ assert isinstance(future, Future), ( |
+ '%s.Cron() did not return a Future' % title) |
+ def resolve(): |
+ start_time = time.time() |
+ try: |
+ future.Get() |
+ except Exception as e: |
+ _cronlog.error('%s: error %s' % (title, traceback.format_exc())) |
+ results.append(False) |
+ if IsDeadlineExceededError(e): raise |
+ finally: |
+ resolve_time = time.time() - start_time |
+ _cronlog.info( |
+ '%s: used %s seconds, %s to initialize and %s to resolve' % |
+ (title, init_time + resolve_time, init_time, resolve_time)) |
+ return Future(delegate=Gettable(resolve)) |
+ |
+ targets = (CreateDataSources(server_instance).values() + |
+ [server_instance.content_providers]) |
+ title = 'initializing %s parallel Cron targets' % len(targets) |
+ start_time = time.time() |
+ _cronlog.info(title) |
+ try: |
+ cron_futures = [run_cron_for_future(target) for target in targets] |
+ finally: |
+ _cronlog.info('%s took %s seconds' % (title, time.time() - start_time)) |
+ |
+ |
# Rendering the public templates will also pull in all of the private |
# templates. |
results.append(request_files_in_dir(svn_constants.PUBLIC_TEMPLATE_PATH)) |
@@ -179,24 +215,15 @@ class CronServlet(Servlet): |
example_zips, |
lambda path: render('extensions/examples/' + path))) |
- def run_cron(data_source): |
- title = data_source.__class__.__name__ |
- _cronlog.info('%s: starting' % title) |
- start_time = time.time() |
- try: |
- data_source.Cron() |
- except Exception as e: |
- _cronlog.error('%s: error %s' % (title, traceback.format_exc())) |
- results.append(False) |
- if IsDeadlineExceededError(e): raise |
- finally: |
- _cronlog.info( |
- '%s: took %s seconds' % (title, time.time() - start_time)) |
- |
- for data_source in CreateDataSources(server_instance).values(): |
- run_cron(data_source) |
- |
- run_cron(server_instance.content_providers) |
+ # Resolve the hand-written Cron method futures. |
+ title = 'resolving %s parallel Cron targets' % len(targets) |
+ _cronlog.info(title) |
+ start_time = time.time() |
+ try: |
+ for future in cron_futures: |
+ future.Get() |
+ finally: |
+ _cronlog.info('%s took %s seconds' % (title, time.time() - start_time)) |
except: |
results.append(False) |