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

Side by Side Diff: chrome/browser/sync_file_system/local/local_file_change_tracker.cc

Issue 2871303004: Rename TaskRunner::RunsTasksOnCurrentThread() in //chrome (Closed)
Patch Set: fixed build error Created 3 years, 7 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 unified diff | Download patch
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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 #include "chrome/browser/sync_file_system/local/local_file_change_tracker.h" 5 #include "chrome/browser/sync_file_system/local/local_file_change_tracker.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <queue> 8 #include <queue>
9 #include <utility> 9 #include <utility>
10 10
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
82 leveldb::Env* env_override, 82 leveldb::Env* env_override,
83 base::SequencedTaskRunner* file_task_runner) 83 base::SequencedTaskRunner* file_task_runner)
84 : initialized_(false), 84 : initialized_(false),
85 file_task_runner_(file_task_runner), 85 file_task_runner_(file_task_runner),
86 tracker_db_(new TrackerDB(base_path, env_override)), 86 tracker_db_(new TrackerDB(base_path, env_override)),
87 current_change_seq_number_(0), 87 current_change_seq_number_(0),
88 num_changes_(0) { 88 num_changes_(0) {
89 } 89 }
90 90
91 LocalFileChangeTracker::~LocalFileChangeTracker() { 91 LocalFileChangeTracker::~LocalFileChangeTracker() {
92 DCHECK(file_task_runner_->RunsTasksOnCurrentThread()); 92 DCHECK(file_task_runner_->RunsTasksInCurrentSequence());
93 tracker_db_.reset(); 93 tracker_db_.reset();
94 } 94 }
95 95
96 void LocalFileChangeTracker::OnStartUpdate(const FileSystemURL& url) { 96 void LocalFileChangeTracker::OnStartUpdate(const FileSystemURL& url) {
97 DCHECK(file_task_runner_->RunsTasksOnCurrentThread()); 97 DCHECK(file_task_runner_->RunsTasksInCurrentSequence());
98 if (base::ContainsKey(changes_, url) || 98 if (base::ContainsKey(changes_, url) ||
99 base::ContainsKey(demoted_changes_, url)) { 99 base::ContainsKey(demoted_changes_, url)) {
100 return; 100 return;
101 } 101 }
102 // TODO(nhiroki): propagate the error code (see http://crbug.com/152127). 102 // TODO(nhiroki): propagate the error code (see http://crbug.com/152127).
103 MarkDirtyOnDatabase(url); 103 MarkDirtyOnDatabase(url);
104 } 104 }
105 105
106 void LocalFileChangeTracker::OnEndUpdate(const FileSystemURL& url) {} 106 void LocalFileChangeTracker::OnEndUpdate(const FileSystemURL& url) {}
107 107
(...skipping 23 matching lines...) Expand all
131 SYNC_FILE_TYPE_DIRECTORY)); 131 SYNC_FILE_TYPE_DIRECTORY));
132 } 132 }
133 133
134 void LocalFileChangeTracker::OnRemoveDirectory(const FileSystemURL& url) { 134 void LocalFileChangeTracker::OnRemoveDirectory(const FileSystemURL& url) {
135 RecordChange(url, FileChange(FileChange::FILE_CHANGE_DELETE, 135 RecordChange(url, FileChange(FileChange::FILE_CHANGE_DELETE,
136 SYNC_FILE_TYPE_DIRECTORY)); 136 SYNC_FILE_TYPE_DIRECTORY));
137 } 137 }
138 138
139 void LocalFileChangeTracker::GetNextChangedURLs( 139 void LocalFileChangeTracker::GetNextChangedURLs(
140 std::deque<FileSystemURL>* urls, int max_urls) { 140 std::deque<FileSystemURL>* urls, int max_urls) {
141 DCHECK(file_task_runner_->RunsTasksOnCurrentThread()); 141 DCHECK(file_task_runner_->RunsTasksInCurrentSequence());
142 DCHECK(urls); 142 DCHECK(urls);
143 urls->clear(); 143 urls->clear();
144 // Mildly prioritizes the URLs that older changes and have not been updated 144 // Mildly prioritizes the URLs that older changes and have not been updated
145 // for a while. 145 // for a while.
146 for (ChangeSeqMap::iterator iter = change_seqs_.begin(); 146 for (ChangeSeqMap::iterator iter = change_seqs_.begin();
147 iter != change_seqs_.end() && 147 iter != change_seqs_.end() &&
148 (max_urls == 0 || urls->size() < static_cast<size_t>(max_urls)); 148 (max_urls == 0 || urls->size() < static_cast<size_t>(max_urls));
149 ++iter) { 149 ++iter) {
150 urls->push_back(iter->second); 150 urls->push_back(iter->second);
151 } 151 }
152 } 152 }
153 153
154 void LocalFileChangeTracker::GetChangesForURL( 154 void LocalFileChangeTracker::GetChangesForURL(
155 const FileSystemURL& url, FileChangeList* changes) { 155 const FileSystemURL& url, FileChangeList* changes) {
156 DCHECK(file_task_runner_->RunsTasksOnCurrentThread()); 156 DCHECK(file_task_runner_->RunsTasksInCurrentSequence());
157 DCHECK(changes); 157 DCHECK(changes);
158 changes->clear(); 158 changes->clear();
159 FileChangeMap::iterator found = changes_.find(url); 159 FileChangeMap::iterator found = changes_.find(url);
160 if (found == changes_.end()) { 160 if (found == changes_.end()) {
161 found = demoted_changes_.find(url); 161 found = demoted_changes_.find(url);
162 if (found == demoted_changes_.end()) 162 if (found == demoted_changes_.end())
163 return; 163 return;
164 } 164 }
165 *changes = found->second.change_list; 165 *changes = found->second.change_list;
166 } 166 }
167 167
168 void LocalFileChangeTracker::ClearChangesForURL(const FileSystemURL& url) { 168 void LocalFileChangeTracker::ClearChangesForURL(const FileSystemURL& url) {
169 DCHECK(file_task_runner_->RunsTasksOnCurrentThread()); 169 DCHECK(file_task_runner_->RunsTasksInCurrentSequence());
170 ClearDirtyOnDatabase(url); 170 ClearDirtyOnDatabase(url);
171 mirror_changes_.erase(url); 171 mirror_changes_.erase(url);
172 demoted_changes_.erase(url); 172 demoted_changes_.erase(url);
173 FileChangeMap::iterator found = changes_.find(url); 173 FileChangeMap::iterator found = changes_.find(url);
174 if (found == changes_.end()) 174 if (found == changes_.end())
175 return; 175 return;
176 change_seqs_.erase(found->second.change_seq); 176 change_seqs_.erase(found->second.change_seq);
177 changes_.erase(found); 177 changes_.erase(found);
178 UpdateNumChanges(); 178 UpdateNumChanges();
179 } 179 }
180 180
181 void LocalFileChangeTracker::CreateFreshMirrorForURL( 181 void LocalFileChangeTracker::CreateFreshMirrorForURL(
182 const storage::FileSystemURL& url) { 182 const storage::FileSystemURL& url) {
183 DCHECK(file_task_runner_->RunsTasksOnCurrentThread()); 183 DCHECK(file_task_runner_->RunsTasksInCurrentSequence());
184 DCHECK(!base::ContainsKey(mirror_changes_, url)); 184 DCHECK(!base::ContainsKey(mirror_changes_, url));
185 mirror_changes_[url] = ChangeInfo(); 185 mirror_changes_[url] = ChangeInfo();
186 } 186 }
187 187
188 void LocalFileChangeTracker::RemoveMirrorAndCommitChangesForURL( 188 void LocalFileChangeTracker::RemoveMirrorAndCommitChangesForURL(
189 const storage::FileSystemURL& url) { 189 const storage::FileSystemURL& url) {
190 DCHECK(file_task_runner_->RunsTasksOnCurrentThread()); 190 DCHECK(file_task_runner_->RunsTasksInCurrentSequence());
191 FileChangeMap::iterator found = mirror_changes_.find(url); 191 FileChangeMap::iterator found = mirror_changes_.find(url);
192 if (found == mirror_changes_.end()) 192 if (found == mirror_changes_.end())
193 return; 193 return;
194 mirror_changes_.erase(found); 194 mirror_changes_.erase(found);
195 195
196 if (base::ContainsKey(changes_, url) || 196 if (base::ContainsKey(changes_, url) ||
197 base::ContainsKey(demoted_changes_, url)) { 197 base::ContainsKey(demoted_changes_, url)) {
198 MarkDirtyOnDatabase(url); 198 MarkDirtyOnDatabase(url);
199 } else { 199 } else {
200 ClearDirtyOnDatabase(url); 200 ClearDirtyOnDatabase(url);
201 } 201 }
202 UpdateNumChanges(); 202 UpdateNumChanges();
203 } 203 }
204 204
205 void LocalFileChangeTracker::ResetToMirrorAndCommitChangesForURL( 205 void LocalFileChangeTracker::ResetToMirrorAndCommitChangesForURL(
206 const storage::FileSystemURL& url) { 206 const storage::FileSystemURL& url) {
207 DCHECK(file_task_runner_->RunsTasksOnCurrentThread()); 207 DCHECK(file_task_runner_->RunsTasksInCurrentSequence());
208 FileChangeMap::iterator found = mirror_changes_.find(url); 208 FileChangeMap::iterator found = mirror_changes_.find(url);
209 if (found == mirror_changes_.end() || found->second.change_list.empty()) { 209 if (found == mirror_changes_.end() || found->second.change_list.empty()) {
210 ClearChangesForURL(url); 210 ClearChangesForURL(url);
211 return; 211 return;
212 } 212 }
213 const ChangeInfo& info = found->second; 213 const ChangeInfo& info = found->second;
214 if (base::ContainsKey(demoted_changes_, url)) { 214 if (base::ContainsKey(demoted_changes_, url)) {
215 DCHECK(!base::ContainsKey(changes_, url)); 215 DCHECK(!base::ContainsKey(changes_, url));
216 demoted_changes_[url] = info; 216 demoted_changes_[url] = info;
217 } else { 217 } else {
218 DCHECK(!base::ContainsKey(demoted_changes_, url)); 218 DCHECK(!base::ContainsKey(demoted_changes_, url));
219 change_seqs_[info.change_seq] = url; 219 change_seqs_[info.change_seq] = url;
220 changes_[url] = info; 220 changes_[url] = info;
221 } 221 }
222 RemoveMirrorAndCommitChangesForURL(url); 222 RemoveMirrorAndCommitChangesForURL(url);
223 } 223 }
224 224
225 void LocalFileChangeTracker::DemoteChangesForURL( 225 void LocalFileChangeTracker::DemoteChangesForURL(
226 const storage::FileSystemURL& url) { 226 const storage::FileSystemURL& url) {
227 DCHECK(file_task_runner_->RunsTasksOnCurrentThread()); 227 DCHECK(file_task_runner_->RunsTasksInCurrentSequence());
228 228
229 FileChangeMap::iterator found = changes_.find(url); 229 FileChangeMap::iterator found = changes_.find(url);
230 if (found == changes_.end()) 230 if (found == changes_.end())
231 return; 231 return;
232 DCHECK(!base::ContainsKey(demoted_changes_, url)); 232 DCHECK(!base::ContainsKey(demoted_changes_, url));
233 change_seqs_.erase(found->second.change_seq); 233 change_seqs_.erase(found->second.change_seq);
234 demoted_changes_.insert(*found); 234 demoted_changes_.insert(*found);
235 changes_.erase(found); 235 changes_.erase(found);
236 UpdateNumChanges(); 236 UpdateNumChanges();
237 } 237 }
238 238
239 void LocalFileChangeTracker::PromoteDemotedChangesForURL( 239 void LocalFileChangeTracker::PromoteDemotedChangesForURL(
240 const storage::FileSystemURL& url) { 240 const storage::FileSystemURL& url) {
241 DCHECK(file_task_runner_->RunsTasksOnCurrentThread()); 241 DCHECK(file_task_runner_->RunsTasksInCurrentSequence());
242 242
243 FileChangeMap::iterator iter = demoted_changes_.find(url); 243 FileChangeMap::iterator iter = demoted_changes_.find(url);
244 if (iter == demoted_changes_.end()) 244 if (iter == demoted_changes_.end())
245 return; 245 return;
246 246
247 FileChangeList::List change_list = iter->second.change_list.list(); 247 FileChangeList::List change_list = iter->second.change_list.list();
248 // Make sure that this URL is in no queues. 248 // Make sure that this URL is in no queues.
249 DCHECK(!base::ContainsKey(change_seqs_, iter->second.change_seq)); 249 DCHECK(!base::ContainsKey(change_seqs_, iter->second.change_seq));
250 DCHECK(!base::ContainsKey(changes_, url)); 250 DCHECK(!base::ContainsKey(changes_, url));
251 251
252 change_seqs_[iter->second.change_seq] = url; 252 change_seqs_[iter->second.change_seq] = url;
253 changes_.insert(*iter); 253 changes_.insert(*iter);
254 demoted_changes_.erase(iter); 254 demoted_changes_.erase(iter);
255 UpdateNumChanges(); 255 UpdateNumChanges();
256 } 256 }
257 257
258 bool LocalFileChangeTracker::PromoteDemotedChanges() { 258 bool LocalFileChangeTracker::PromoteDemotedChanges() {
259 DCHECK(file_task_runner_->RunsTasksOnCurrentThread()); 259 DCHECK(file_task_runner_->RunsTasksInCurrentSequence());
260 if (demoted_changes_.empty()) 260 if (demoted_changes_.empty())
261 return false; 261 return false;
262 while (!demoted_changes_.empty()) { 262 while (!demoted_changes_.empty()) {
263 storage::FileSystemURL url = demoted_changes_.begin()->first; 263 storage::FileSystemURL url = demoted_changes_.begin()->first;
264 PromoteDemotedChangesForURL(url); 264 PromoteDemotedChangesForURL(url);
265 } 265 }
266 UpdateNumChanges(); 266 UpdateNumChanges();
267 return true; 267 return true;
268 } 268 }
269 269
270 SyncStatusCode LocalFileChangeTracker::Initialize( 270 SyncStatusCode LocalFileChangeTracker::Initialize(
271 FileSystemContext* file_system_context) { 271 FileSystemContext* file_system_context) {
272 DCHECK(file_task_runner_->RunsTasksOnCurrentThread()); 272 DCHECK(file_task_runner_->RunsTasksInCurrentSequence());
273 DCHECK(!initialized_); 273 DCHECK(!initialized_);
274 DCHECK(file_system_context); 274 DCHECK(file_system_context);
275 275
276 SyncStatusCode status = CollectLastDirtyChanges(file_system_context); 276 SyncStatusCode status = CollectLastDirtyChanges(file_system_context);
277 if (status == SYNC_STATUS_OK) 277 if (status == SYNC_STATUS_OK)
278 initialized_ = true; 278 initialized_ = true;
279 return status; 279 return status;
280 } 280 }
281 281
282 void LocalFileChangeTracker::ResetForFileSystem(const GURL& origin, 282 void LocalFileChangeTracker::ResetForFileSystem(const GURL& origin,
283 storage::FileSystemType type) { 283 storage::FileSystemType type) {
284 DCHECK(file_task_runner_->RunsTasksOnCurrentThread()); 284 DCHECK(file_task_runner_->RunsTasksInCurrentSequence());
285 std::unique_ptr<leveldb::WriteBatch> batch(new leveldb::WriteBatch); 285 std::unique_ptr<leveldb::WriteBatch> batch(new leveldb::WriteBatch);
286 for (FileChangeMap::iterator iter = changes_.begin(); 286 for (FileChangeMap::iterator iter = changes_.begin();
287 iter != changes_.end();) { 287 iter != changes_.end();) {
288 storage::FileSystemURL url = iter->first; 288 storage::FileSystemURL url = iter->first;
289 int change_seq = iter->second.change_seq; 289 int change_seq = iter->second.change_seq;
290 // Advance |iter| before calling ResetForURL to avoid the iterator 290 // Advance |iter| before calling ResetForURL to avoid the iterator
291 // invalidation in it. 291 // invalidation in it.
292 ++iter; 292 ++iter;
293 if (url.origin() == origin && url.type() == type) 293 if (url.origin() == origin && url.type() == type)
294 ResetForURL(url, change_seq, batch.get()); 294 ResetForURL(url, change_seq, batch.get());
(...skipping 15 matching lines...) Expand all
310 tracker_db_->WriteBatch(std::move(batch)); 310 tracker_db_->WriteBatch(std::move(batch));
311 UpdateNumChanges(); 311 UpdateNumChanges();
312 } 312 }
313 313
314 void LocalFileChangeTracker::UpdateNumChanges() { 314 void LocalFileChangeTracker::UpdateNumChanges() {
315 base::AutoLock lock(num_changes_lock_); 315 base::AutoLock lock(num_changes_lock_);
316 num_changes_ = static_cast<int64_t>(change_seqs_.size()); 316 num_changes_ = static_cast<int64_t>(change_seqs_.size());
317 } 317 }
318 318
319 void LocalFileChangeTracker::GetAllChangedURLs(FileSystemURLSet* urls) { 319 void LocalFileChangeTracker::GetAllChangedURLs(FileSystemURLSet* urls) {
320 DCHECK(file_task_runner_->RunsTasksOnCurrentThread()); 320 DCHECK(file_task_runner_->RunsTasksInCurrentSequence());
321 std::deque<FileSystemURL> url_deque; 321 std::deque<FileSystemURL> url_deque;
322 GetNextChangedURLs(&url_deque, 0); 322 GetNextChangedURLs(&url_deque, 0);
323 urls->clear(); 323 urls->clear();
324 urls->insert(url_deque.begin(), url_deque.end()); 324 urls->insert(url_deque.begin(), url_deque.end());
325 } 325 }
326 326
327 void LocalFileChangeTracker::DropAllChanges() { 327 void LocalFileChangeTracker::DropAllChanges() {
328 DCHECK(file_task_runner_->RunsTasksOnCurrentThread()); 328 DCHECK(file_task_runner_->RunsTasksInCurrentSequence());
329 changes_.clear(); 329 changes_.clear();
330 change_seqs_.clear(); 330 change_seqs_.clear();
331 mirror_changes_.clear(); 331 mirror_changes_.clear();
332 UpdateNumChanges(); 332 UpdateNumChanges();
333 } 333 }
334 334
335 SyncStatusCode LocalFileChangeTracker::MarkDirtyOnDatabase( 335 SyncStatusCode LocalFileChangeTracker::MarkDirtyOnDatabase(
336 const FileSystemURL& url) { 336 const FileSystemURL& url) {
337 std::string serialized_url; 337 std::string serialized_url;
338 if (!SerializeSyncableFileSystemURL(url, &serialized_url)) 338 if (!SerializeSyncableFileSystemURL(url, &serialized_url))
339 return SYNC_FILE_ERROR_INVALID_URL; 339 return SYNC_FILE_ERROR_INVALID_URL;
340 340
341 return tracker_db_->MarkDirty(serialized_url); 341 return tracker_db_->MarkDirty(serialized_url);
342 } 342 }
343 343
344 SyncStatusCode LocalFileChangeTracker::ClearDirtyOnDatabase( 344 SyncStatusCode LocalFileChangeTracker::ClearDirtyOnDatabase(
345 const FileSystemURL& url) { 345 const FileSystemURL& url) {
346 DCHECK(file_task_runner_->RunsTasksOnCurrentThread()); 346 DCHECK(file_task_runner_->RunsTasksInCurrentSequence());
347 std::string serialized_url; 347 std::string serialized_url;
348 if (!SerializeSyncableFileSystemURL(url, &serialized_url)) 348 if (!SerializeSyncableFileSystemURL(url, &serialized_url))
349 return SYNC_FILE_ERROR_INVALID_URL; 349 return SYNC_FILE_ERROR_INVALID_URL;
350 350
351 return tracker_db_->ClearDirty(serialized_url); 351 return tracker_db_->ClearDirty(serialized_url);
352 } 352 }
353 353
354 SyncStatusCode LocalFileChangeTracker::CollectLastDirtyChanges( 354 SyncStatusCode LocalFileChangeTracker::CollectLastDirtyChanges(
355 FileSystemContext* file_system_context) { 355 FileSystemContext* file_system_context) {
356 DCHECK(file_task_runner_->RunsTasksOnCurrentThread()); 356 DCHECK(file_task_runner_->RunsTasksInCurrentSequence());
357 357
358 std::queue<FileSystemURL> dirty_files; 358 std::queue<FileSystemURL> dirty_files;
359 const SyncStatusCode status = tracker_db_->GetDirtyEntries(&dirty_files); 359 const SyncStatusCode status = tracker_db_->GetDirtyEntries(&dirty_files);
360 if (status != SYNC_STATUS_OK) 360 if (status != SYNC_STATUS_OK)
361 return status; 361 return status;
362 362
363 FileSystemFileUtil* file_util = 363 FileSystemFileUtil* file_util =
364 file_system_context->sandbox_delegate()->sync_file_util(); 364 file_system_context->sandbox_delegate()->sync_file_util();
365 DCHECK(file_util); 365 DCHECK(file_util);
366 std::unique_ptr<FileSystemOperationContext> context( 366 std::unique_ptr<FileSystemOperationContext> context(
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
413 // TODO(nhiroki): handle file access error (http://crbug.com/155251). 413 // TODO(nhiroki): handle file access error (http://crbug.com/155251).
414 LOG(WARNING) << "Failed to access local file."; 414 LOG(WARNING) << "Failed to access local file.";
415 break; 415 break;
416 } 416 }
417 } 417 }
418 return SYNC_STATUS_OK; 418 return SYNC_STATUS_OK;
419 } 419 }
420 420
421 void LocalFileChangeTracker::RecordChange( 421 void LocalFileChangeTracker::RecordChange(
422 const FileSystemURL& url, const FileChange& change) { 422 const FileSystemURL& url, const FileChange& change) {
423 DCHECK(file_task_runner_->RunsTasksOnCurrentThread()); 423 DCHECK(file_task_runner_->RunsTasksInCurrentSequence());
424 int change_seq = current_change_seq_number_++; 424 int change_seq = current_change_seq_number_++;
425 if (base::ContainsKey(demoted_changes_, url)) { 425 if (base::ContainsKey(demoted_changes_, url)) {
426 RecordChangeToChangeMaps(url, change, change_seq, 426 RecordChangeToChangeMaps(url, change, change_seq,
427 &demoted_changes_, nullptr); 427 &demoted_changes_, nullptr);
428 } else { 428 } else {
429 RecordChangeToChangeMaps(url, change, change_seq, &changes_, &change_seqs_); 429 RecordChangeToChangeMaps(url, change, change_seq, &changes_, &change_seqs_);
430 } 430 }
431 if (base::ContainsKey(mirror_changes_, url)) { 431 if (base::ContainsKey(mirror_changes_, url)) {
432 RecordChangeToChangeMaps(url, change, change_seq, &mirror_changes_, 432 RecordChangeToChangeMaps(url, change, change_seq, &mirror_changes_,
433 nullptr); 433 nullptr);
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after
624 if (!status.ok() && !status.IsNotFound()) { 624 if (!status.ok() && !status.IsNotFound()) {
625 HandleError(FROM_HERE, status); 625 HandleError(FROM_HERE, status);
626 db_status_ = LevelDBStatusToSyncStatusCode(status); 626 db_status_ = LevelDBStatusToSyncStatusCode(status);
627 db_.reset(); 627 db_.reset();
628 return db_status_; 628 return db_status_;
629 } 629 }
630 return SYNC_STATUS_OK; 630 return SYNC_STATUS_OK;
631 } 631 }
632 632
633 } // namespace sync_file_system 633 } // namespace sync_file_system
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698