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