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 |
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 Loading... |
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) |
OLD | NEW |