OLD | NEW |
---|---|
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 Loading... | |
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 |
99 elif source_name == 'instance_master': | |
100 data_source = _InstanceMasterCommitUpdater(commit) | |
not at google - send to devlin
2014/10/24 00:04:51
I don't see _InstanceMasterCommitUpdater anywhere?
Ken Rockot(use gerrit already)
2014/10/24 21:26:54
Oops. Yeah this is old dead code. Removed.
| |
95 else: | 101 else: |
96 data_source = CreateDataSource(source_name, server_instance) | 102 data_source = CreateDataSource(source_name, server_instance) |
97 | 103 |
104 # If the data source defines subtasks and none was provided, do the nice | |
105 # thing and queue up the defined subtasks instead of just failing. | |
106 if source_path is None: | |
107 refresh_paths = data_source.GetRefreshPaths() | |
108 if len(refresh_paths) > 1: | |
109 queue = taskqueue.Queue() | |
110 tasks = ['/_refresh/%s/%s' % (source_name, path) | |
111 for path in refresh_paths] | |
112 for task in tasks: | |
113 queue.add(taskqueue.Task(url=task, params={'commit': commit})) | |
114 return | |
not at google - send to devlin
2014/10/24 00:04:51
What happens if source_path is None but there are
Ken Rockot(use gerrit already)
2014/10/24 21:26:54
This works just fine (when source_path is None it
| |
115 | |
98 class_name = data_source.__class__.__name__ | 116 class_name = data_source.__class__.__name__ |
99 refresh_future = data_source.Refresh(source_path) | 117 refresh_future = data_source.Refresh(source_path) |
100 assert isinstance(refresh_future, Future), ( | 118 assert isinstance(refresh_future, Future), ( |
101 '%s.Refresh() did not return a Future' % class_name) | 119 '%s.Refresh() did not return a Future' % class_name) |
102 timer = Timer() | 120 timer = Timer() |
103 try: | 121 try: |
104 refresh_future.Get() | 122 refresh_future.Get() |
123 | |
124 def resolve(refresh_complete): | |
125 if refresh_complete: | |
126 return commit_tracker.Set('master', commit) | |
127 return None | |
128 | |
129 refresh_tracker.MarkTaskComplete(commit, path).Get() | |
not at google - send to devlin
2014/10/24 00:04:51
Use Then() not Get()?
You could even go so far as
Ken Rockot(use gerrit already)
2014/10/24 21:26:54
Neat. I'm all for chaining futures of you're down
not at google - send to devlin
2014/10/24 23:36:07
I think the Python creators are against anonymous
| |
130 refresh_tracker.GetRefreshComplete(commit).Then(resolve).Get() | |
not at google - send to devlin
2014/10/24 00:04:52
You should mention how this relates to cron servle
Ken Rockot(use gerrit already)
2014/10/24 21:26:54
Done.
| |
105 except Exception as e: | 131 except Exception as e: |
106 _log.error('%s: error %s' % (class_name, traceback.format_exc())) | 132 _log.error('%s: error %s' % (class_name, traceback.format_exc())) |
107 success = False | 133 success = False |
108 if IsFileSystemThrottledError(e): | 134 if IsFileSystemThrottledError(e): |
109 return Response.ThrottledError('Throttled') | 135 return Response.ThrottledError('Throttled') |
110 raise | 136 raise |
111 finally: | 137 finally: |
112 _log.info('Refreshing %s took %s' % | 138 _log.info('Refreshing %s took %s' % |
113 (class_name, timer.Stop().FormatElapsed())) | 139 (class_name, timer.Stop().FormatElapsed())) |
114 | 140 |
(...skipping 19 matching lines...) Expand all Loading... | |
134 github_file_system_provider = self._delegate.CreateGithubFileSystemProvider( | 160 github_file_system_provider = self._delegate.CreateGithubFileSystemProvider( |
135 object_store_creator) | 161 object_store_creator) |
136 gcs_file_system_provider = self._delegate.CreateGCSFileSystemProvider( | 162 gcs_file_system_provider = self._delegate.CreateGCSFileSystemProvider( |
137 object_store_creator) | 163 object_store_creator) |
138 return ServerInstance(object_store_creator, | 164 return ServerInstance(object_store_creator, |
139 CompiledFileSystem.Factory(object_store_creator), | 165 CompiledFileSystem.Factory(object_store_creator), |
140 branch_utility, | 166 branch_utility, |
141 host_file_system_provider, | 167 host_file_system_provider, |
142 github_file_system_provider, | 168 github_file_system_provider, |
143 gcs_file_system_provider) | 169 gcs_file_system_provider) |
OLD | NEW |