Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(9571)

Unified Diff: chrome/common/extensions/docs/server2/refresh_servlet.py

Issue 660383002: Docserver: Persist stat cache for versioned file systems (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: change caching strategy, better refresh cycle synchronization Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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):

Powered by Google App Engine
This is Rietveld 408576698