diff options
author | peria@chromium.org <peria@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-08-15 04:38:58 +0000 |
---|---|---|
committer | peria@chromium.org <peria@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-08-15 04:38:58 +0000 |
commit | 251a91806256dca9ef6bcdf1f651ba7984566e93 (patch) | |
tree | 6939f6b1106eed9a783b56c3cb432c7d0098a945 | |
parent | acb666d3e3e7b266eea54d32ec1a5ebfd3caf46d (diff) | |
download | chromium_src-251a91806256dca9ef6bcdf1f651ba7984566e93.zip chromium_src-251a91806256dca9ef6bcdf1f651ba7984566e93.tar.gz chromium_src-251a91806256dca9ef6bcdf1f651ba7984566e93.tar.bz2 |
[SyncFS] Count added/removed DB entries in building/deleteing indexes.
BUG=347425
TEST=./unit_tests --gtest_filter="MetadataDatabaseIndexOn*"
Review URL: https://codereview.chromium.org/455263003
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@289783 0039d316-1c4b-4281-b951-d872f2087c98
3 files changed, 53 insertions, 5 deletions
diff --git a/chrome/browser/sync_file_system/drive_backend/metadata_database_index_on_disk.cc b/chrome/browser/sync_file_system/drive_backend/metadata_database_index_on_disk.cc index a5b7163..ae40a2b 100644 --- a/chrome/browser/sync_file_system/drive_backend/metadata_database_index_on_disk.cc +++ b/chrome/browser/sync_file_system/drive_backend/metadata_database_index_on_disk.cc @@ -680,7 +680,9 @@ MetadataDatabaseIndexOnDisk::GetAllMetadataIDs() const { return file_ids; } -void MetadataDatabaseIndexOnDisk::BuildTrackerIndexes() { +int64 MetadataDatabaseIndexOnDisk::BuildTrackerIndexes() { + int64 num_puts_before = db_->num_puts(); + scoped_ptr<LevelDBWrapper::Iterator> itr(db_->NewIterator()); for (itr->Seek(kFileTrackerKeyPrefix); itr->Valid(); itr->Next()) { if (!RemovePrefix(itr->key().ToString(), kFileTrackerKeyPrefix, NULL)) @@ -698,6 +700,23 @@ void MetadataDatabaseIndexOnDisk::BuildTrackerIndexes() { AddToPathIndexes(tracker); AddToDirtyTrackerIndexes(tracker); } + + return db_->num_puts() - num_puts_before; +} + +int64 MetadataDatabaseIndexOnDisk::DeleteTrackerIndexes() { + const char* kIndexPrefixes[] = { + kAppRootIDByAppIDKeyPrefix, kActiveTrackerIDByFileIDKeyPrefix, + kTrackerIDByFileIDKeyPrefix, kMultiTrackerByFileIDKeyPrefix, + kActiveTrackerIDByParentAndTitleKeyPrefix, + kTrackerIDByParentAndTitleKeyPrefix, kMultiBackingParentAndTitleKeyPrefix, + kDirtyIDKeyPrefix, kDemotedDirtyIDKeyPrefix + }; + + int64 num_deletes_before = db_->num_deletes(); + for (size_t i = 0; i < arraysize(kIndexPrefixes); ++i) + DeleteKeyStartsWith(kIndexPrefixes[i]); + return db_->num_deletes() - num_deletes_before; } LevelDBWrapper* MetadataDatabaseIndexOnDisk::GetDBForTesting() { @@ -772,8 +791,7 @@ void MetadataDatabaseIndexOnDisk::AddToFileIDIndexes( DVLOG(1) << " Add to trackers by file ID: " << file_id; const std::string prefix = GenerateTrackerIDByFileIDKeyPrefix(file_id); AddToTrackerIDSetWithPrefix( - GenerateActiveTrackerIDByFileIDKey(file_id), - prefix, new_tracker); + GenerateActiveTrackerIDByFileIDKey(file_id), prefix, new_tracker); const std::string multi_tracker_key = GenerateMultiTrackerKey(file_id); if (!DBHasKey(multi_tracker_key) && @@ -1125,5 +1143,16 @@ MetadataDatabaseIndexOnDisk::CountWithPrefix( return count == 0 ? NONE : SINGLE; } +void MetadataDatabaseIndexOnDisk::DeleteKeyStartsWith( + const std::string& prefix) { + scoped_ptr<LevelDBWrapper::Iterator> itr(db_->NewIterator()); + for (itr->Seek(prefix); itr->Valid();) { + const std::string key = itr->key().ToString(); + if (!StartsWithASCII(key, prefix, true)) + break; + itr->Delete(); + } +} + } // namespace drive_backend } // namespace sync_file_system diff --git a/chrome/browser/sync_file_system/drive_backend/metadata_database_index_on_disk.h b/chrome/browser/sync_file_system/drive_backend/metadata_database_index_on_disk.h index 12f757a..8dae9ce 100644 --- a/chrome/browser/sync_file_system/drive_backend/metadata_database_index_on_disk.h +++ b/chrome/browser/sync_file_system/drive_backend/metadata_database_index_on_disk.h @@ -69,7 +69,12 @@ class MetadataDatabaseIndexOnDisk : public MetadataDatabaseIndexInterface { virtual std::vector<std::string> GetAllMetadataIDs() const OVERRIDE; // Builds on-disk indexes from FileTracker entries on disk. - void BuildTrackerIndexes(); + // Returns the number of newly added entries for indexing. + int64 BuildTrackerIndexes(); + + // Deletes entries used for indexes on on-disk database. + // Returns the number of the deleted entries. + int64 DeleteTrackerIndexes(); LevelDBWrapper* GetDBForTesting(); @@ -150,6 +155,9 @@ class MetadataDatabaseIndexOnDisk : public MetadataDatabaseIndexInterface { // Entries for |ignored_id| are not counted in. NumEntries CountWithPrefix(const std::string& prefix, int64 ignored_id); + // Deletes entries whose keys start from |prefix|. + void DeleteKeyStartsWith(const std::string& prefix); + LevelDBWrapper* db_; // Not owned. scoped_ptr<ServiceMetadata> service_metadata_; diff --git a/chrome/browser/sync_file_system/drive_backend/metadata_database_index_on_disk_unittest.cc b/chrome/browser/sync_file_system/drive_backend/metadata_database_index_on_disk_unittest.cc index f40e6f2..1ce143f 100644 --- a/chrome/browser/sync_file_system/drive_backend/metadata_database_index_on_disk_unittest.cc +++ b/chrome/browser/sync_file_system/drive_backend/metadata_database_index_on_disk_unittest.cc @@ -237,7 +237,7 @@ TEST_F(MetadataDatabaseIndexOnDiskTest, BuildIndexTest) { EXPECT_TRUE(tracker_ids.empty()); EXPECT_EQ(0U, index()->CountDirtyTracker()); - index()->BuildTrackerIndexes(); + EXPECT_EQ(16, index()->BuildTrackerIndexes()); WriteToDB(); // After building indexes, we should have correct indexes. @@ -252,6 +252,17 @@ TEST_F(MetadataDatabaseIndexOnDiskTest, BuildIndexTest) { EXPECT_EQ(1U, index()->CountDirtyTracker()); } +TEST_F(MetadataDatabaseIndexOnDiskTest, BuildAndDeleteIndexTest) { + CreateTestDatabase(false, NULL); + int64 answer = index()->BuildTrackerIndexes(); + WriteToDB(); + ASSERT_EQ(16, answer); + EXPECT_EQ(answer, index()->DeleteTrackerIndexes()); + WriteToDB(); + EXPECT_EQ(answer, index()->BuildTrackerIndexes()); + WriteToDB(); +} + TEST_F(MetadataDatabaseIndexOnDiskTest, AllEntriesTest) { CreateTestDatabase(true, NULL); |