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

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

Issue 542233003: [SyncFS] Make on-disk version default for metadata database index (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase Created 6 years, 3 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/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 27 matching lines...) Expand all
38 #include "third_party/leveldatabase/src/include/leveldb/env.h" 38 #include "third_party/leveldatabase/src/include/leveldb/env.h"
39 #include "third_party/leveldatabase/src/include/leveldb/status.h" 39 #include "third_party/leveldatabase/src/include/leveldb/status.h"
40 #include "third_party/leveldatabase/src/include/leveldb/write_batch.h" 40 #include "third_party/leveldatabase/src/include/leveldb/write_batch.h"
41 #include "webkit/common/fileapi/file_system_util.h" 41 #include "webkit/common/fileapi/file_system_util.h"
42 42
43 namespace sync_file_system { 43 namespace sync_file_system {
44 namespace drive_backend { 44 namespace drive_backend {
45 45
46 namespace { 46 namespace {
47 47
48 // Command line flag to enable on-disk indexing. 48 // Command line flag to disable on-disk indexing.
49 const char kEnableMetadataDatabaseOnDisk[] = "enable-syncfs-on-disk-indexing"; 49 const char kDisableMetadataDatabaseOnDisk[] = "disable-syncfs-on-disk-indexing";
50 50
51 void EmptyStatusCallback(SyncStatusCode status) {} 51 void EmptyStatusCallback(SyncStatusCode status) {}
52 52
53 std::string FileKindToString(FileKind file_kind) { 53 std::string FileKindToString(FileKind file_kind) {
54 switch (file_kind) { 54 switch (file_kind) {
55 case FILE_KIND_UNSUPPORTED: 55 case FILE_KIND_UNSUPPORTED:
56 return "unsupported"; 56 return "unsupported";
57 case FILE_KIND_FILE: 57 case FILE_KIND_FILE:
58 return "file"; 58 return "file";
59 case FILE_KIND_FOLDER: 59 case FILE_KIND_FOLDER:
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after
255 // Drop all data in old database and refetch them from the remote service. 255 // Drop all data in old database and refetch them from the remote service.
256 NOTREACHED(); 256 NOTREACHED();
257 return SYNC_DATABASE_ERROR_FAILED; 257 return SYNC_DATABASE_ERROR_FAILED;
258 case 3: 258 case 3:
259 DCHECK_EQ(3, kCurrentDatabaseVersion); 259 DCHECK_EQ(3, kCurrentDatabaseVersion);
260 // If MetadataDatabaseOnDisk is enabled, migration will be done in 260 // If MetadataDatabaseOnDisk is enabled, migration will be done in
261 // MetadataDatabaseOnDisk::Create(). 261 // MetadataDatabaseOnDisk::Create().
262 // TODO(peria): Move the migration code (from v3 to v4) here. 262 // TODO(peria): Move the migration code (from v3 to v4) here.
263 return SYNC_STATUS_OK; 263 return SYNC_STATUS_OK;
264 case 4: 264 case 4:
265 if (!CommandLine::ForCurrentProcess()->HasSwitch( 265 if (CommandLine::ForCurrentProcess()->HasSwitch(
266 kEnableMetadataDatabaseOnDisk)) { 266 kDisableMetadataDatabaseOnDisk)) {
267 MigrateDatabaseFromV4ToV3(db->GetLevelDB()); 267 MigrateDatabaseFromV4ToV3(db->GetLevelDB());
268 } 268 }
269 return SYNC_STATUS_OK; 269 return SYNC_STATUS_OK;
270 default: 270 default:
271 return SYNC_DATABASE_ERROR_FAILED; 271 return SYNC_DATABASE_ERROR_FAILED;
272 } 272 }
273 } 273 }
274 274
275 bool HasInvalidTitle(const std::string& title) { 275 bool HasInvalidTitle(const std::string& title) {
276 return title.empty() || 276 return title.empty() ||
(...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after
544 base::Passed(make_scoped_ptr(new CreateParam( 544 base::Passed(make_scoped_ptr(new CreateParam(
545 worker_task_runner, 545 worker_task_runner,
546 database_path, 546 database_path,
547 env_override))), 547 env_override))),
548 callback)); 548 callback));
549 } 549 }
550 550
551 // static 551 // static
552 SyncStatusCode MetadataDatabase::CreateForTesting( 552 SyncStatusCode MetadataDatabase::CreateForTesting(
553 scoped_ptr<LevelDBWrapper> db, 553 scoped_ptr<LevelDBWrapper> db,
554 bool enable_on_disk_index,
554 scoped_ptr<MetadataDatabase>* metadata_database_out) { 555 scoped_ptr<MetadataDatabase>* metadata_database_out) {
555 scoped_ptr<MetadataDatabase> metadata_database( 556 scoped_ptr<MetadataDatabase> metadata_database(
556 new MetadataDatabase(base::ThreadTaskRunnerHandle::Get(), 557 new MetadataDatabase(base::ThreadTaskRunnerHandle::Get(),
557 base::FilePath(), NULL)); 558 base::FilePath(),
559 enable_on_disk_index,
560 NULL));
558 metadata_database->db_ = db.Pass(); 561 metadata_database->db_ = db.Pass();
559 SyncStatusCode status = metadata_database->Initialize(); 562 SyncStatusCode status = metadata_database->Initialize();
560 if (status == SYNC_STATUS_OK) 563 if (status == SYNC_STATUS_OK)
561 *metadata_database_out = metadata_database.Pass(); 564 *metadata_database_out = metadata_database.Pass();
562 return status; 565 return status;
563 } 566 }
564 567
565 MetadataDatabase::~MetadataDatabase() { 568 MetadataDatabase::~MetadataDatabase() {
566 worker_task_runner_->DeleteSoon(FROM_HERE, db_.release()); 569 worker_task_runner_->DeleteSoon(FROM_HERE, db_.release());
567 } 570 }
(...skipping 830 matching lines...) Expand 10 before | Expand all | Expand 10 after
1398 tracker->set_dirty(false); 1401 tracker->set_dirty(false);
1399 index_->StoreFileTracker(tracker.Pass()); 1402 index_->StoreFileTracker(tracker.Pass());
1400 } 1403 }
1401 1404
1402 WriteToDatabase(callback); 1405 WriteToDatabase(callback);
1403 } 1406 }
1404 1407
1405 MetadataDatabase::MetadataDatabase( 1408 MetadataDatabase::MetadataDatabase(
1406 const scoped_refptr<base::SequencedTaskRunner>& worker_task_runner, 1409 const scoped_refptr<base::SequencedTaskRunner>& worker_task_runner,
1407 const base::FilePath& database_path, 1410 const base::FilePath& database_path,
1411 bool enable_on_disk_index,
1408 leveldb::Env* env_override) 1412 leveldb::Env* env_override)
1409 : worker_task_runner_(worker_task_runner), 1413 : worker_task_runner_(worker_task_runner),
1410 database_path_(database_path), 1414 database_path_(database_path),
1411 env_override_(env_override), 1415 env_override_(env_override),
1416 enable_on_disk_index_(enable_on_disk_index),
1412 largest_known_change_id_(0), 1417 largest_known_change_id_(0),
1413 weak_ptr_factory_(this) { 1418 weak_ptr_factory_(this) {
1414 DCHECK(worker_task_runner.get()); 1419 DCHECK(worker_task_runner.get());
1415 } 1420 }
1416 1421
1417 // static 1422 // static
1418 void MetadataDatabase::CreateOnWorkerTaskRunner( 1423 void MetadataDatabase::CreateOnWorkerTaskRunner(
1419 scoped_ptr<CreateParam> create_param, 1424 scoped_ptr<CreateParam> create_param,
1420 const CreateCallback& callback) { 1425 const CreateCallback& callback) {
1421 DCHECK(create_param->worker_task_runner->RunsTasksOnCurrentThread()); 1426 DCHECK(create_param->worker_task_runner->RunsTasksOnCurrentThread());
1422 1427
1428 bool enable_on_disk_index = !CommandLine::ForCurrentProcess()->HasSwitch(
1429 kDisableMetadataDatabaseOnDisk);
1423 scoped_ptr<MetadataDatabase> metadata_database( 1430 scoped_ptr<MetadataDatabase> metadata_database(
1424 new MetadataDatabase(create_param->worker_task_runner, 1431 new MetadataDatabase(create_param->worker_task_runner,
1425 create_param->database_path, 1432 create_param->database_path,
1433 enable_on_disk_index,
1426 create_param->env_override)); 1434 create_param->env_override));
1427 1435
1428 SyncStatusCode status = metadata_database->Initialize(); 1436 SyncStatusCode status = metadata_database->Initialize();
1429 if (status == SYNC_DATABASE_ERROR_FAILED) { 1437 if (status == SYNC_DATABASE_ERROR_FAILED) {
1430 // Delete the previous instance to avoid creating a LevelDB instance for 1438 // Delete the previous instance to avoid creating a LevelDB instance for
1431 // the same path. 1439 // the same path.
1432 metadata_database.reset(); 1440 metadata_database.reset();
1433 1441
1434 metadata_database.reset( 1442 metadata_database.reset(
1435 new MetadataDatabase(create_param->worker_task_runner, 1443 new MetadataDatabase(create_param->worker_task_runner,
1436 create_param->database_path, 1444 create_param->database_path,
1445 enable_on_disk_index,
1437 create_param->env_override)); 1446 create_param->env_override));
1438 status = metadata_database->Initialize(); 1447 status = metadata_database->Initialize();
1439 } 1448 }
1440 1449
1441 if (status != SYNC_STATUS_OK) 1450 if (status != SYNC_STATUS_OK)
1442 metadata_database.reset(); 1451 metadata_database.reset();
1443 1452
1444 if (metadata_database) 1453 if (metadata_database)
1445 metadata_database->DetachFromSequence(); 1454 metadata_database->DetachFromSequence();
1446 create_param->worker_task_runner->PostTask( 1455 create_param->worker_task_runner->PostTask(
(...skipping 14 matching lines...) Expand all
1461 if (status != SYNC_STATUS_OK) 1470 if (status != SYNC_STATUS_OK)
1462 return status; 1471 return status;
1463 } 1472 }
1464 1473
1465 if (!created) { 1474 if (!created) {
1466 status = MigrateDatabaseIfNeeded(db_.get()); 1475 status = MigrateDatabaseIfNeeded(db_.get());
1467 if (status != SYNC_STATUS_OK) 1476 if (status != SYNC_STATUS_OK)
1468 return status; 1477 return status;
1469 } 1478 }
1470 1479
1471 if (CommandLine::ForCurrentProcess()->HasSwitch( 1480 if (enable_on_disk_index_) {
1472 kEnableMetadataDatabaseOnDisk)) {
1473 index_ = MetadataDatabaseIndexOnDisk::Create(db_.get()); 1481 index_ = MetadataDatabaseIndexOnDisk::Create(db_.get());
1474 } else { 1482 } else {
1475 index_ = MetadataDatabaseIndex::Create(db_.get()); 1483 index_ = MetadataDatabaseIndex::Create(db_.get());
1476 } 1484 }
1477 if (!index_) { 1485 if (!index_) {
1478 // Delete all entries in |db_| to reset it. 1486 // Delete all entries in |db_| to reset it.
1479 // TODO(peria): Make LevelDBWrapper::DestroyDB() to avoid a full scan. 1487 // TODO(peria): Make LevelDBWrapper::DestroyDB() to avoid a full scan.
1480 scoped_ptr<LevelDBWrapper::Iterator> itr = db_->NewIterator(); 1488 scoped_ptr<LevelDBWrapper::Iterator> itr = db_->NewIterator();
1481 for (itr->SeekToFirst(); itr->Valid();) 1489 for (itr->SeekToFirst(); itr->Valid();)
1482 itr->Delete(); 1490 itr->Delete();
(...skipping 495 matching lines...) Expand 10 before | Expand all | Expand 10 after
1978 return false; 1986 return false;
1979 1987
1980 if (!parents.empty()) 1988 if (!parents.empty())
1981 return false; 1989 return false;
1982 1990
1983 return true; 1991 return true;
1984 } 1992 }
1985 1993
1986 } // namespace drive_backend 1994 } // namespace drive_backend
1987 } // namespace sync_file_system 1995 } // namespace sync_file_system
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698