Commit 7813fa6a authored by peria@chromium.org's avatar peria@chromium.org

[SyncFS] Build indexes from FileTracker entries on disk.

It is assumed that no indexes exist before.

BUG=347425
TEST=./unit_tests --gtest_filter="MetadataDatabaseIndexOnDiskTest.*"

Review URL: https://codereview.chromium.org/391623002

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@283759 0039d316-1c4b-4281-b951-d872f2087c98
parent eb63642a
...@@ -556,6 +556,27 @@ MetadataDatabaseIndexOnDisk::GetAllMetadataIDs() const { ...@@ -556,6 +556,27 @@ MetadataDatabaseIndexOnDisk::GetAllMetadataIDs() const {
return file_ids; return file_ids;
} }
void MetadataDatabaseIndexOnDisk::BuildTrackerIndexes(
leveldb::WriteBatch* batch) {
scoped_ptr<leveldb::Iterator> itr(db_->NewIterator(leveldb::ReadOptions()));
for (itr->Seek(kFileTrackerKeyPrefix); itr->Valid(); itr->Next()) {
if (!RemovePrefix(itr->key().ToString(), kFileTrackerKeyPrefix, NULL))
break;
FileTracker tracker;
if (!tracker.ParseFromString(itr->value().ToString())) {
util::Log(logging::LOG_WARNING, FROM_HERE,
"Failed to parse a Tracker");
continue;
}
AddToAppIDIndex(tracker, batch);
AddToFileIDIndexes(tracker, batch);
AddToPathIndexes(tracker, batch);
AddToDirtyTrackerIndexes(tracker, batch);
}
}
MetadataDatabaseIndexOnDisk::MetadataDatabaseIndexOnDisk(leveldb::DB* db) MetadataDatabaseIndexOnDisk::MetadataDatabaseIndexOnDisk(leveldb::DB* db)
: db_(db) { : db_(db) {
// TODO(peria): Add UMA to measure the number of FileMetadata, FileTracker, // TODO(peria): Add UMA to measure the number of FileMetadata, FileTracker,
......
...@@ -79,6 +79,9 @@ class MetadataDatabaseIndexOnDisk : public MetadataDatabaseIndexInterface { ...@@ -79,6 +79,9 @@ class MetadataDatabaseIndexOnDisk : public MetadataDatabaseIndexInterface {
virtual std::vector<int64> GetAllTrackerIDs() const OVERRIDE; virtual std::vector<int64> GetAllTrackerIDs() const OVERRIDE;
virtual std::vector<std::string> GetAllMetadataIDs() const OVERRIDE; virtual std::vector<std::string> GetAllMetadataIDs() const OVERRIDE;
// Builds on-disk indexes from FileTracker entries on disk.
void BuildTrackerIndexes(leveldb::WriteBatch* batch);
private: private:
enum NumEntries { enum NumEntries {
NONE, // No entries are found. NONE, // No entries are found.
......
...@@ -183,6 +183,35 @@ TEST_F(MetadataDatabaseIndexOnDiskTest, SetEntryTest) { ...@@ -183,6 +183,35 @@ TEST_F(MetadataDatabaseIndexOnDiskTest, SetEntryTest) {
EXPECT_FALSE(index()->GetFileTracker(tracker_id, NULL)); EXPECT_FALSE(index()->GetFileTracker(tracker_id, NULL));
} }
TEST_F(MetadataDatabaseIndexOnDiskTest, BuildIndexTest) {
CreateTestDatabase(false);
TrackerIDSet tracker_ids;
// Before building indexes, no references exist.
EXPECT_EQ(kInvalidTrackerID, index()->GetAppRootTracker("app_id"));
tracker_ids = index()->GetFileTrackerIDsByFileID("file_id");
EXPECT_TRUE(tracker_ids.empty());
tracker_ids = index()->GetFileTrackerIDsByParentAndTitle(
kAppRootTrackerID, "file");
EXPECT_TRUE(tracker_ids.empty());
EXPECT_EQ(0U, index()->CountDirtyTracker());
scoped_ptr<leveldb::WriteBatch> batch(new leveldb::WriteBatch);
index()->BuildTrackerIndexes(batch.get());
WriteToDB(batch.Pass());
// After building indexes, we should have correct indexes.
EXPECT_EQ(kAppRootTrackerID, index()->GetAppRootTracker("app_id"));
tracker_ids = index()->GetFileTrackerIDsByFileID("file_id");
EXPECT_EQ(1U, tracker_ids.size());
EXPECT_EQ(kFileTrackerID, tracker_ids.active_tracker());
tracker_ids = index()->GetFileTrackerIDsByParentAndTitle(
kAppRootTrackerID, "file");
EXPECT_EQ(1U, tracker_ids.size());
EXPECT_EQ(kFileTrackerID, tracker_ids.active_tracker());
EXPECT_EQ(1U, index()->CountDirtyTracker());
}
TEST_F(MetadataDatabaseIndexOnDiskTest, AllEntriesTest) { TEST_F(MetadataDatabaseIndexOnDiskTest, AllEntriesTest) {
CreateTestDatabase(true); CreateTestDatabase(true);
...@@ -352,7 +381,7 @@ TEST_F(MetadataDatabaseIndexOnDiskTest, TrackerIDSetByParentIDAndTitleTest) { ...@@ -352,7 +381,7 @@ TEST_F(MetadataDatabaseIndexOnDiskTest, TrackerIDSetByParentIDAndTitleTest) {
tracker_ids = index()->GetFileTrackerIDsByParentAndTitle( tracker_ids = index()->GetFileTrackerIDsByParentAndTitle(
kAppRootTrackerID, "file2"); kAppRootTrackerID, "file2");
EXPECT_EQ(0U, tracker_ids.size()); EXPECT_TRUE(tracker_ids.empty());
const int64 tracker_id = 72; const int64 tracker_id = 72;
// Testing AddToFileIDIndexes // Testing AddToFileIDIndexes
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment