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

Side by Side 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: Created 6 years, 1 month 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 unified diff | Download patch
OLDNEW
1 # Copyright 2014 The Chromium Authors. All rights reserved. 1 # Copyright 2014 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be 2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file. 3 # found in the LICENSE file.
4 4
5 import traceback 5 import traceback
6 6
7 from app_yaml_helper import AppYamlHelper 7 from app_yaml_helper import AppYamlHelper
8 from appengine_wrappers import IsDeadlineExceededError, logservice 8 from appengine_wrappers import IsDeadlineExceededError, logservice, taskqueue
9 from branch_utility import BranchUtility 9 from branch_utility import BranchUtility
10 from commit_tracker import CommitTracker
10 from compiled_file_system import CompiledFileSystem 11 from compiled_file_system import CompiledFileSystem
11 from custom_logger import CustomLogger 12 from custom_logger import CustomLogger
12 from data_source_registry import CreateDataSource 13 from data_source_registry import CreateDataSource
13 from environment import GetAppVersion 14 from environment import GetAppVersion
14 from file_system import IsFileSystemThrottledError 15 from file_system import IsFileSystemThrottledError
15 from future import Future 16 from future import Future
16 from gcs_file_system_provider import CloudStorageFileSystemProvider 17 from gcs_file_system_provider import CloudStorageFileSystemProvider
17 from github_file_system_provider import GithubFileSystemProvider 18 from github_file_system_provider import GithubFileSystemProvider
18 from host_file_system_provider import HostFileSystemProvider 19 from host_file_system_provider import HostFileSystemProvider
19 from object_store_creator import ObjectStoreCreator 20 from object_store_creator import ObjectStoreCreator
21 from refresh_tracker import RefreshTracker
20 from server_instance import ServerInstance 22 from server_instance import ServerInstance
21 from servlet import Servlet, Request, Response 23 from servlet import Servlet, Request, Response
22 from timer import Timer, TimerClosure 24 from timer import Timer, TimerClosure
23 25
24 26
25
26 _log = CustomLogger('refresh') 27 _log = CustomLogger('refresh')
27 28
28 29
29 class RefreshServlet(Servlet): 30 class RefreshServlet(Servlet):
30 '''Servlet which refreshes a single data source. 31 '''Servlet which refreshes a single data source.
31 ''' 32 '''
32 def __init__(self, request, delegate_for_test=None): 33 def __init__(self, request, delegate_for_test=None):
33 Servlet.__init__(self, request) 34 Servlet.__init__(self, request)
34 self._delegate = delegate_for_test or RefreshServlet.Delegate() 35 self._delegate = delegate_for_test or RefreshServlet.Delegate()
35 36
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
79 (source_name, '' if source_path is None else '[%s]' % source_path)) 80 (source_name, '' if source_path is None else '[%s]' % source_path))
80 81
81 if 'commit' in self._request.arguments: 82 if 'commit' in self._request.arguments:
82 commit = self._request.arguments['commit'] 83 commit = self._request.arguments['commit']
83 else: 84 else:
84 _log.warning('No commit given; refreshing from master. ' 85 _log.warning('No commit given; refreshing from master. '
85 'This is probably NOT what you want.') 86 'This is probably NOT what you want.')
86 commit = None 87 commit = None
87 88
88 server_instance = self._CreateServerInstance(commit) 89 server_instance = self._CreateServerInstance(commit)
90 commit_tracker = CommitTracker(server_instance.object_store_creator)
91 refresh_tracker = RefreshTracker(server_instance.object_store_creator)
92
89 success = True 93 success = True
90 try: 94 try:
91 if source_name == 'platform_bundle': 95 if source_name == 'platform_bundle':
92 data_source = server_instance.platform_bundle 96 data_source = server_instance.platform_bundle
93 elif source_name == 'content_providers': 97 elif source_name == 'content_providers':
94 data_source = server_instance.content_providers 98 data_source = server_instance.content_providers
95 else: 99 else:
96 data_source = CreateDataSource(source_name, server_instance) 100 data_source = CreateDataSource(source_name, server_instance)
97 101
98 class_name = data_source.__class__.__name__ 102 class_name = data_source.__class__.__name__
99 refresh_future = data_source.Refresh(source_path) 103 refresh_future = data_source.Refresh(source_path)
100 assert isinstance(refresh_future, Future), ( 104 assert isinstance(refresh_future, Future), (
101 '%s.Refresh() did not return a Future' % class_name) 105 '%s.Refresh() did not return a Future' % class_name)
102 timer = Timer() 106 timer = Timer()
103 try: 107 try:
104 refresh_future.Get() 108 refresh_future.Get()
109
110 # Mark this (commit, task) pair as completed and then see if this
111 # concludes the full cache refresh. The list of tasks required to
112 # complete a cache refresh is registered (and keyed on commit ID) by the
113 # CronServlet before kicking off all the refresh tasks.
114 (refresh_tracker.MarkTaskComplete(commit, path)
115 .Then(lambda _: refresh_tracker.GetRefreshComplete(commit))
116 .Then(lambda is_complete:
117 commit_tracker.Set('master', commit) if is_complete else None)
118 .Get())
105 except Exception as e: 119 except Exception as e:
106 _log.error('%s: error %s' % (class_name, traceback.format_exc())) 120 _log.error('%s: error %s' % (class_name, traceback.format_exc()))
107 success = False 121 success = False
108 if IsFileSystemThrottledError(e): 122 if IsFileSystemThrottledError(e):
109 return Response.ThrottledError('Throttled') 123 return Response.ThrottledError('Throttled')
110 raise 124 raise
111 finally: 125 finally:
112 _log.info('Refreshing %s took %s' % 126 _log.info('Refreshing %s took %s' %
113 (class_name, timer.Stop().FormatElapsed())) 127 (class_name, timer.Stop().FormatElapsed()))
114 128
(...skipping 19 matching lines...) Expand all
134 github_file_system_provider = self._delegate.CreateGithubFileSystemProvider( 148 github_file_system_provider = self._delegate.CreateGithubFileSystemProvider(
135 object_store_creator) 149 object_store_creator)
136 gcs_file_system_provider = self._delegate.CreateGCSFileSystemProvider( 150 gcs_file_system_provider = self._delegate.CreateGCSFileSystemProvider(
137 object_store_creator) 151 object_store_creator)
138 return ServerInstance(object_store_creator, 152 return ServerInstance(object_store_creator,
139 CompiledFileSystem.Factory(object_store_creator), 153 CompiledFileSystem.Factory(object_store_creator),
140 branch_utility, 154 branch_utility,
141 host_file_system_provider, 155 host_file_system_provider,
142 github_file_system_provider, 156 github_file_system_provider,
143 gcs_file_system_provider) 157 gcs_file_system_provider)
OLDNEW
« no previous file with comments | « chrome/common/extensions/docs/server2/queue.yaml ('k') | chrome/common/extensions/docs/server2/refresh_tracker.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698