Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 | |
|
nhiroki
2014/09/08 10:45:10
nit: there is an extra line
peria
2014/09/08 10:53:05
Done.
| |
| 1429 bool enable_on_disk_index = !CommandLine::ForCurrentProcess()->HasSwitch( | |
| 1430 kDisableMetadataDatabaseOnDisk); | |
| 1423 scoped_ptr<MetadataDatabase> metadata_database( | 1431 scoped_ptr<MetadataDatabase> metadata_database( |
| 1424 new MetadataDatabase(create_param->worker_task_runner, | 1432 new MetadataDatabase(create_param->worker_task_runner, |
| 1425 create_param->database_path, | 1433 create_param->database_path, |
| 1434 enable_on_disk_index, | |
| 1426 create_param->env_override)); | 1435 create_param->env_override)); |
| 1427 | 1436 |
| 1428 SyncStatusCode status = metadata_database->Initialize(); | 1437 SyncStatusCode status = metadata_database->Initialize(); |
| 1429 if (status == SYNC_DATABASE_ERROR_FAILED) { | 1438 if (status == SYNC_DATABASE_ERROR_FAILED) { |
| 1430 // Delete the previous instance to avoid creating a LevelDB instance for | 1439 // Delete the previous instance to avoid creating a LevelDB instance for |
| 1431 // the same path. | 1440 // the same path. |
| 1432 metadata_database.reset(); | 1441 metadata_database.reset(); |
| 1433 | 1442 |
| 1434 metadata_database.reset( | 1443 metadata_database.reset( |
| 1435 new MetadataDatabase(create_param->worker_task_runner, | 1444 new MetadataDatabase(create_param->worker_task_runner, |
| 1436 create_param->database_path, | 1445 create_param->database_path, |
| 1446 enable_on_disk_index, | |
| 1437 create_param->env_override)); | 1447 create_param->env_override)); |
| 1438 status = metadata_database->Initialize(); | 1448 status = metadata_database->Initialize(); |
| 1439 } | 1449 } |
| 1440 | 1450 |
| 1441 if (status != SYNC_STATUS_OK) | 1451 if (status != SYNC_STATUS_OK) |
| 1442 metadata_database.reset(); | 1452 metadata_database.reset(); |
| 1443 | 1453 |
| 1444 if (metadata_database) | 1454 if (metadata_database) |
| 1445 metadata_database->DetachFromSequence(); | 1455 metadata_database->DetachFromSequence(); |
| 1446 create_param->worker_task_runner->PostTask( | 1456 create_param->worker_task_runner->PostTask( |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 1461 if (status != SYNC_STATUS_OK) | 1471 if (status != SYNC_STATUS_OK) |
| 1462 return status; | 1472 return status; |
| 1463 } | 1473 } |
| 1464 | 1474 |
| 1465 if (!created) { | 1475 if (!created) { |
| 1466 status = MigrateDatabaseIfNeeded(db_.get()); | 1476 status = MigrateDatabaseIfNeeded(db_.get()); |
| 1467 if (status != SYNC_STATUS_OK) | 1477 if (status != SYNC_STATUS_OK) |
| 1468 return status; | 1478 return status; |
| 1469 } | 1479 } |
| 1470 | 1480 |
| 1471 if (CommandLine::ForCurrentProcess()->HasSwitch( | 1481 if (enable_on_disk_index_) { |
| 1472 kEnableMetadataDatabaseOnDisk)) { | |
| 1473 index_ = MetadataDatabaseIndexOnDisk::Create(db_.get()); | 1482 index_ = MetadataDatabaseIndexOnDisk::Create(db_.get()); |
| 1474 } else { | 1483 } else { |
| 1475 index_ = MetadataDatabaseIndex::Create(db_.get()); | 1484 index_ = MetadataDatabaseIndex::Create(db_.get()); |
| 1476 } | 1485 } |
| 1477 if (!index_) { | 1486 if (!index_) { |
| 1478 // Delete all entries in |db_| to reset it. | 1487 // Delete all entries in |db_| to reset it. |
| 1479 // TODO(peria): Make LevelDBWrapper::DestroyDB() to avoid a full scan. | 1488 // TODO(peria): Make LevelDBWrapper::DestroyDB() to avoid a full scan. |
| 1480 scoped_ptr<LevelDBWrapper::Iterator> itr = db_->NewIterator(); | 1489 scoped_ptr<LevelDBWrapper::Iterator> itr = db_->NewIterator(); |
| 1481 for (itr->SeekToFirst(); itr->Valid();) | 1490 for (itr->SeekToFirst(); itr->Valid();) |
| 1482 itr->Delete(); | 1491 itr->Delete(); |
| (...skipping 495 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1978 return false; | 1987 return false; |
| 1979 | 1988 |
| 1980 if (!parents.empty()) | 1989 if (!parents.empty()) |
| 1981 return false; | 1990 return false; |
| 1982 | 1991 |
| 1983 return true; | 1992 return true; |
| 1984 } | 1993 } |
| 1985 | 1994 |
| 1986 } // namespace drive_backend | 1995 } // namespace drive_backend |
| 1987 } // namespace sync_file_system | 1996 } // namespace sync_file_system |
| OLD | NEW |