Index: chrome/common/extensions/docs/server2/refresh_servlet.py |
diff --git a/chrome/common/extensions/docs/server2/refresh_servlet.py b/chrome/common/extensions/docs/server2/refresh_servlet.py |
index eb8c0642a7a67ccf66f876cd8f9d379da6115f47..b85ace4343fa03cb28a9f9b30af2a230f0074f82 100644 |
--- a/chrome/common/extensions/docs/server2/refresh_servlet.py |
+++ b/chrome/common/extensions/docs/server2/refresh_servlet.py |
@@ -5,8 +5,9 @@ |
import traceback |
from app_yaml_helper import AppYamlHelper |
-from appengine_wrappers import IsDeadlineExceededError, logservice |
+from appengine_wrappers import IsDeadlineExceededError, logservice, taskqueue |
from branch_utility import BranchUtility |
+from commit_tracker import CommitTracker |
from compiled_file_system import CompiledFileSystem |
from custom_logger import CustomLogger |
from data_source_registry import CreateDataSource |
@@ -17,15 +18,20 @@ from gcs_file_system_provider import CloudStorageFileSystemProvider |
from github_file_system_provider import GithubFileSystemProvider |
from host_file_system_provider import HostFileSystemProvider |
from object_store_creator import ObjectStoreCreator |
+from refresh_tracker import RefreshTracker |
from server_instance import ServerInstance |
from servlet import Servlet, Request, Response |
from timer import Timer, TimerClosure |
- |
_log = CustomLogger('refresh') |
+def _UpdateMasterCommit(object_store_creator, commit): |
+ commit_tracker = CommitTracker(object_store_creator) |
+ return commit_tracker.Set('master', commit) |
+ |
+ |
class RefreshServlet(Servlet): |
'''Servlet which refreshes a single data source. |
''' |
@@ -86,15 +92,34 @@ class RefreshServlet(Servlet): |
commit = None |
server_instance = self._CreateServerInstance(commit) |
+ refresh_tracker = RefreshTracker(server_instance.object_store_creator) |
+ |
success = True |
+ success_message = 'Success' |
try: |
if source_name == 'platform_bundle': |
data_source = server_instance.platform_bundle |
elif source_name == 'content_providers': |
data_source = server_instance.content_providers |
+ elif source_name == 'instance_master': |
+ data_source = _InstanceMasterCommitUpdater(commit) |
else: |
data_source = CreateDataSource(source_name, server_instance) |
+ # If the data source defines subtasks and none was provided, do the nice |
+ # thing and queue up the defined subtasks instead of just failing. |
+ if source_path is None: |
+ refresh_paths = data_source.GetRefreshPaths() |
+ if len(refresh_paths) > 1: |
+ queue = taskqueue.Queue() |
+ tasks = ['/_refresh/%s/%s' % (source_name, path) |
+ for path in refresh_paths] |
+ for task in tasks: |
+ queue.add(taskqueue.Task(url=task, params={'commit': commit})) |
+ success_message = 'Enqueued tasks: %s' % tasks |
+ # The finally clause really handles the return. |
+ return |
+ |
class_name = data_source.__class__.__name__ |
refresh_future = data_source.Refresh(source_path) |
assert isinstance(refresh_future, Future), ( |
@@ -102,6 +127,15 @@ class RefreshServlet(Servlet): |
timer = Timer() |
try: |
refresh_future.Get() |
+ |
+ def resolve(refresh_complete): |
+ if refresh_complete: |
+ return _UpdateMasterCommit( |
+ server_instance.object_store_creator, commit) |
+ return None |
+ refresh_tracker.MarkTaskComplete(commit, '_refresh/%s/%s' % ( |
+ source_name, path)).Get() |
+ refresh_tracker.GetRefreshComplete(commit).Then(resolve).Get() |
except Exception as e: |
_log.error('%s: error %s' % (class_name, traceback.format_exc())) |
success = False |
@@ -119,7 +153,7 @@ class RefreshServlet(Servlet): |
raise |
finally: |
_log.info('finished (%s)', 'success' if success else 'FAILED') |
- return (Response.Ok('Success') if success else |
+ return (Response.Ok(success_message) if success else |
Response.InternalError('Failure')) |
def _CreateServerInstance(self, commit): |