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

Side by Side Diff: chrome/browser/sync_file_system/drive_backend/metadata_database.cc

Issue 437943002: [SyncFS] Remove usage of file task runner under drive_backend/ (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Work for nits Created 6 years, 4 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 | Annotate | Revision Log
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/drive_backend/metadata_database.h" 5 #include "chrome/browser/sync_file_system/drive_backend/metadata_database.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <stack> 8 #include <stack>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after
184 *app_root_tracker->mutable_synced_details() = app_root_metadata.details(); 184 *app_root_tracker->mutable_synced_details() = app_root_metadata.details();
185 return app_root_tracker.Pass(); 185 return app_root_tracker.Pass();
186 } 186 }
187 187
188 scoped_ptr<FileTracker> CloneFileTracker(const FileTracker* obj) { 188 scoped_ptr<FileTracker> CloneFileTracker(const FileTracker* obj) {
189 if (!obj) 189 if (!obj)
190 return scoped_ptr<FileTracker>(); 190 return scoped_ptr<FileTracker>();
191 return scoped_ptr<FileTracker>(new FileTracker(*obj)); 191 return scoped_ptr<FileTracker>(new FileTracker(*obj));
192 } 192 }
193 193
194 void WriteOnFileTaskRunner(
195 leveldb::DB* db,
196 scoped_ptr<leveldb::WriteBatch> batch,
197 scoped_refptr<base::SequencedTaskRunner> worker_task_runner,
198 const SyncStatusCallback& callback) {
199 DCHECK(db);
200 DCHECK(batch);
201 leveldb::Status status = db->Write(leveldb::WriteOptions(), batch.get());
202 worker_task_runner->PostTask(
203 FROM_HERE,
204 base::Bind(callback, LevelDBStatusToSyncStatusCode(status)));
205 }
206
207 // Returns true if |db| has no content. 194 // Returns true if |db| has no content.
208 bool IsDatabaseEmpty(leveldb::DB* db) { 195 bool IsDatabaseEmpty(leveldb::DB* db) {
209 DCHECK(db); 196 DCHECK(db);
210 scoped_ptr<leveldb::Iterator> itr(db->NewIterator(leveldb::ReadOptions())); 197 scoped_ptr<leveldb::Iterator> itr(db->NewIterator(leveldb::ReadOptions()));
211 itr->SeekToFirst(); 198 itr->SeekToFirst();
212 return !itr->Valid(); 199 return !itr->Valid();
213 } 200 }
214 201
215 SyncStatusCode OpenDatabase(const base::FilePath& path, 202 SyncStatusCode OpenDatabase(const base::FilePath& path,
216 leveldb::Env* env_override, 203 leveldb::Env* env_override,
(...skipping 319 matching lines...) Expand 10 before | Expand all | Expand 10 after
536 523
537 if (index->GetFileTrackerIDsByFileID(file_id).empty()) { 524 if (index->GetFileTrackerIDsByFileID(file_id).empty()) {
538 index->RemoveFileMetadata(file_id, batch); 525 index->RemoveFileMetadata(file_id, batch);
539 } 526 }
540 } 527 }
541 528
542 } // namespace 529 } // namespace
543 530
544 struct MetadataDatabase::CreateParam { 531 struct MetadataDatabase::CreateParam {
545 scoped_refptr<base::SequencedTaskRunner> worker_task_runner; 532 scoped_refptr<base::SequencedTaskRunner> worker_task_runner;
546 scoped_refptr<base::SequencedTaskRunner> file_task_runner;
547 base::FilePath database_path; 533 base::FilePath database_path;
548 leveldb::Env* env_override; 534 leveldb::Env* env_override;
549 535
550 CreateParam(base::SequencedTaskRunner* worker_task_runner, 536 CreateParam(base::SequencedTaskRunner* worker_task_runner,
551 base::SequencedTaskRunner* file_task_runner,
552 const base::FilePath& database_path, 537 const base::FilePath& database_path,
553 leveldb::Env* env_override) 538 leveldb::Env* env_override)
554 : worker_task_runner(worker_task_runner), 539 : worker_task_runner(worker_task_runner),
555 file_task_runner(file_task_runner),
556 database_path(database_path), 540 database_path(database_path),
557 env_override(env_override) { 541 env_override(env_override) {
558 } 542 }
559 }; 543 };
560 544
561 // static 545 // static
562 void MetadataDatabase::Create(base::SequencedTaskRunner* worker_task_runner, 546 void MetadataDatabase::Create(base::SequencedTaskRunner* worker_task_runner,
563 base::SequencedTaskRunner* file_task_runner,
564 const base::FilePath& database_path, 547 const base::FilePath& database_path,
565 leveldb::Env* env_override, 548 leveldb::Env* env_override,
566 const CreateCallback& callback) { 549 const CreateCallback& callback) {
567 file_task_runner->PostTask(FROM_HERE, base::Bind( 550 worker_task_runner->PostTask(FROM_HERE, base::Bind(
568 &MetadataDatabase::CreateOnFileTaskRunner, 551 &MetadataDatabase::CreateOnWorkerTaskRunner,
569 base::Passed(make_scoped_ptr(new CreateParam( 552 base::Passed(make_scoped_ptr(new CreateParam(
570 worker_task_runner, 553 worker_task_runner,
571 file_task_runner,
572 database_path, 554 database_path,
573 env_override))), 555 env_override))),
574 callback)); 556 callback));
575 } 557 }
576 558
577 // static 559 // static
578 SyncStatusCode MetadataDatabase::CreateForTesting( 560 SyncStatusCode MetadataDatabase::CreateForTesting(
579 scoped_ptr<leveldb::DB> db, 561 scoped_ptr<leveldb::DB> db,
580 scoped_ptr<MetadataDatabase>* metadata_database_out) { 562 scoped_ptr<MetadataDatabase>* metadata_database_out) {
581 scoped_ptr<MetadataDatabase> metadata_database( 563 scoped_ptr<MetadataDatabase> metadata_database(
582 new MetadataDatabase(base::ThreadTaskRunnerHandle::Get(), 564 new MetadataDatabase(base::ThreadTaskRunnerHandle::Get(),
583 base::ThreadTaskRunnerHandle::Get(),
584 base::FilePath(), NULL)); 565 base::FilePath(), NULL));
585 metadata_database->db_ = db.Pass(); 566 metadata_database->db_ = db.Pass();
586 SyncStatusCode status = 567 SyncStatusCode status = metadata_database->Initialize();
587 metadata_database->InitializeOnFileTaskRunner();
588 if (status == SYNC_STATUS_OK) 568 if (status == SYNC_STATUS_OK)
589 *metadata_database_out = metadata_database.Pass(); 569 *metadata_database_out = metadata_database.Pass();
590 return status; 570 return status;
591 } 571 }
592 572
593 MetadataDatabase::~MetadataDatabase() { 573 MetadataDatabase::~MetadataDatabase() {
594 file_task_runner_->DeleteSoon(FROM_HERE, db_.release()); 574 worker_task_runner_->DeleteSoon(FROM_HERE, db_.release());
595 } 575 }
596 576
597 // static 577 // static
598 void MetadataDatabase::ClearDatabase( 578 void MetadataDatabase::ClearDatabase(
599 scoped_ptr<MetadataDatabase> metadata_database) { 579 scoped_ptr<MetadataDatabase> metadata_database) {
600 DCHECK(metadata_database); 580 DCHECK(metadata_database);
601 scoped_refptr<base::SequencedTaskRunner> file_task_runner = 581 scoped_refptr<base::SequencedTaskRunner> worker_task_runner =
602 metadata_database->file_task_runner_; 582 metadata_database->worker_task_runner_;
603 base::FilePath database_path = metadata_database->database_path_; 583 base::FilePath database_path = metadata_database->database_path_;
604 DCHECK(!database_path.empty()); 584 DCHECK(!database_path.empty());
605 metadata_database.reset(); 585 metadata_database.reset();
606 586
607 file_task_runner->PostTask( 587 worker_task_runner->PostTask(
608 FROM_HERE, 588 FROM_HERE,
609 base::Bind(base::IgnoreResult(base::DeleteFile), 589 base::Bind(base::IgnoreResult(base::DeleteFile),
610 database_path, true /* recursive */)); 590 database_path, true /* recursive */));
611 } 591 }
612 592
613 int64 MetadataDatabase::GetLargestFetchedChangeID() const { 593 int64 MetadataDatabase::GetLargestFetchedChangeID() const {
614 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread()); 594 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
615 return index_->GetLargestChangeID(); 595 return index_->GetLargestChangeID();
616 } 596 }
617 597
(...skipping 798 matching lines...) Expand 10 before | Expand all | Expand 10 after
1416 } 1396 }
1417 1397
1418 void MetadataDatabase::GetRegisteredAppIDs(std::vector<std::string>* app_ids) { 1398 void MetadataDatabase::GetRegisteredAppIDs(std::vector<std::string>* app_ids) {
1419 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread()); 1399 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
1420 DCHECK(app_ids); 1400 DCHECK(app_ids);
1421 *app_ids = index_->GetRegisteredAppIDs(); 1401 *app_ids = index_->GetRegisteredAppIDs();
1422 } 1402 }
1423 1403
1424 MetadataDatabase::MetadataDatabase( 1404 MetadataDatabase::MetadataDatabase(
1425 base::SequencedTaskRunner* worker_task_runner, 1405 base::SequencedTaskRunner* worker_task_runner,
1426 base::SequencedTaskRunner* file_task_runner,
1427 const base::FilePath& database_path, 1406 const base::FilePath& database_path,
1428 leveldb::Env* env_override) 1407 leveldb::Env* env_override)
1429 : worker_task_runner_(worker_task_runner), 1408 : worker_task_runner_(worker_task_runner),
1430 file_task_runner_(file_task_runner),
1431 database_path_(database_path), 1409 database_path_(database_path),
1432 env_override_(env_override), 1410 env_override_(env_override),
1433 largest_known_change_id_(0), 1411 largest_known_change_id_(0),
1434 weak_ptr_factory_(this) { 1412 weak_ptr_factory_(this) {
1435 DCHECK(worker_task_runner); 1413 DCHECK(worker_task_runner);
1436 DCHECK(file_task_runner);
1437 } 1414 }
1438 1415
1439 // static 1416 // static
1440 void MetadataDatabase::CreateOnFileTaskRunner( 1417 void MetadataDatabase::CreateOnWorkerTaskRunner(
1441 scoped_ptr<CreateParam> create_param, 1418 scoped_ptr<CreateParam> create_param,
1442 const CreateCallback& callback) { 1419 const CreateCallback& callback) {
1420 DCHECK(create_param->worker_task_runner->RunsTasksOnCurrentThread());
1421
1443 scoped_ptr<MetadataDatabase> metadata_database( 1422 scoped_ptr<MetadataDatabase> metadata_database(
1444 new MetadataDatabase(create_param->worker_task_runner.get(), 1423 new MetadataDatabase(create_param->worker_task_runner.get(),
1445 create_param->file_task_runner.get(),
1446 create_param->database_path, 1424 create_param->database_path,
1447 create_param->env_override)); 1425 create_param->env_override));
1448 SyncStatusCode status = 1426 SyncStatusCode status = metadata_database->Initialize();
1449 metadata_database->InitializeOnFileTaskRunner();
1450 if (status != SYNC_STATUS_OK) 1427 if (status != SYNC_STATUS_OK)
1451 metadata_database.reset(); 1428 metadata_database.reset();
1452 1429
1453 metadata_database->DetachFromSequence(); 1430 metadata_database->DetachFromSequence();
1454 create_param->worker_task_runner->PostTask( 1431 create_param->worker_task_runner->PostTask(
1455 FROM_HERE, 1432 FROM_HERE,
1456 base::Bind( 1433 base::Bind(
1457 callback, status, base::Passed(&metadata_database))); 1434 callback, status, base::Passed(&metadata_database)));
1458 } 1435 }
1459 1436
1460 SyncStatusCode MetadataDatabase::InitializeOnFileTaskRunner() { 1437 SyncStatusCode MetadataDatabase::Initialize() {
1461 base::ThreadRestrictions::AssertIOAllowed(); 1438 base::ThreadRestrictions::AssertIOAllowed();
1462 DCHECK(file_task_runner_->RunsTasksOnCurrentThread()); 1439 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
1463 1440
1464 SyncStatusCode status = SYNC_STATUS_UNKNOWN; 1441 SyncStatusCode status = SYNC_STATUS_UNKNOWN;
1465 bool created = false; 1442 bool created = false;
1466 // Open database unless |db_| is overridden for testing. 1443 // Open database unless |db_| is overridden for testing.
1467 if (!db_) { 1444 if (!db_) {
1468 status = OpenDatabase(database_path_, env_override_, &db_, &created); 1445 status = OpenDatabase(database_path_, env_override_, &db_, &created);
1469 if (status != SYNC_STATUS_OK) 1446 if (status != SYNC_STATUS_OK)
1470 return status; 1447 return status;
1471 } 1448 }
1472 1449
(...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after
1731 if (option != UPDATE_TRACKER_FOR_SYNCED_FILE) 1708 if (option != UPDATE_TRACKER_FOR_SYNCED_FILE)
1732 MarkTrackerSetDirty(trackers, index_.get(), batch); 1709 MarkTrackerSetDirty(trackers, index_.get(), batch);
1733 } 1710 }
1734 } 1711 }
1735 1712
1736 void MetadataDatabase::WriteToDatabase(scoped_ptr<leveldb::WriteBatch> batch, 1713 void MetadataDatabase::WriteToDatabase(scoped_ptr<leveldb::WriteBatch> batch,
1737 const SyncStatusCallback& callback) { 1714 const SyncStatusCallback& callback) {
1738 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread()); 1715 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
1739 1716
1740 if (!batch) { 1717 if (!batch) {
1741 worker_task_runner_->PostTask( 1718 callback.Run(SYNC_STATUS_OK);
1742 FROM_HERE,
1743 base::Bind(callback, SYNC_STATUS_OK));
1744 return; 1719 return;
1745 } 1720 }
1746 1721
1747 // TODO(peria): Write to DB on disk synchronously. 1722 leveldb::Status status = db_->Write(leveldb::WriteOptions(), batch.get());
1748 file_task_runner_->PostTask( 1723 callback.Run(LevelDBStatusToSyncStatusCode(status));
1749 FROM_HERE,
1750 base::Bind(&WriteOnFileTaskRunner,
1751 base::Unretained(db_.get()),
1752 base::Passed(&batch),
1753 worker_task_runner_,
1754 callback));
1755 } 1724 }
1756 1725
1757 scoped_ptr<base::ListValue> MetadataDatabase::DumpFiles( 1726 scoped_ptr<base::ListValue> MetadataDatabase::DumpFiles(
1758 const std::string& app_id) { 1727 const std::string& app_id) {
1759 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread()); 1728 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
1760 1729
1761 scoped_ptr<base::ListValue> files(new base::ListValue); 1730 scoped_ptr<base::ListValue> files(new base::ListValue);
1762 1731
1763 FileTracker app_root_tracker; 1732 FileTracker app_root_tracker;
1764 if (!FindAppRootTracker(app_id, &app_root_tracker)) 1733 if (!FindAppRootTracker(app_id, &app_root_tracker))
(...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after
1966 index_->StoreFileMetadata(app_root_metadata.Pass(), batch); 1935 index_->StoreFileMetadata(app_root_metadata.Pass(), batch);
1967 index_->StoreFileTracker(app_root_tracker.Pass(), batch); 1936 index_->StoreFileTracker(app_root_tracker.Pass(), batch);
1968 } 1937 }
1969 1938
1970 void MetadataDatabase::DetachFromSequence() { 1939 void MetadataDatabase::DetachFromSequence() {
1971 worker_sequence_checker_.DetachFromSequence(); 1940 worker_sequence_checker_.DetachFromSequence();
1972 } 1941 }
1973 1942
1974 } // namespace drive_backend 1943 } // namespace drive_backend
1975 } // namespace sync_file_system 1944 } // namespace sync_file_system
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698