Chromium Code Reviews| 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..6209a5e90c89183f695e1f2fb114ee9c7e8162cd 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,37 @@ class CronServlet(Servlet): |
| results = [] |
| try: |
| + # Run the hand-written Cron methods first; they can be run in parallel. |
| + def run_cron_for_future(target): |
| + title = target.__class__.__name__ |
| + start_time = time.time() |
| + future = target.Cron() |
| + assert isinstance(future, Future), ( |
| + '%s.Cron() did not return a Future' % title) |
| + def resolve(): |
| + try: |
| + future.Get() |
| + 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)) |
|
Jeffrey Yasskin
2013/11/06 22:37:09
This may not be so useful anymore since even if th
not at google - send to devlin
2013/11/11 04:08:33
Makes sense.
This logging is most for me to check
|
| + return Future(delegate=Gettable(resolve)) |
| + |
| + targets = (CreateDataSources(server_instance).values() + |
| + [server_instance.content_providers]) |
| + title = 'running %s parallel Cron targets' % len(targets) |
| + start_time = time.time() |
| + _cronlog.info(title) |
| + try: |
| + futures = [run_cron_for_future(target) for target in targets] |
| + for future in futures: |
|
Jeffrey Yasskin
2013/11/06 22:37:09
You could delay this loop until the end of the fun
not at google - send to devlin
2013/11/11 04:08:33
Good idea.
|
| + future.Get() |
| + 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)) |
| @@ -178,26 +210,6 @@ class CronServlet(Servlet): |
| 'example zips', |
| 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) |
| - |
| except: |
| results.append(False) |
| # This should never actually happen (each cron step does its own |