Commit 38fdadf8 authored by peria@chromium.org's avatar peria@chromium.org

[SyncFS] Migrate version management from MDDB to index classes.

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

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

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@283705 0039d316-1c4b-4281-b951-d872f2087c98
parent 44613a53
......@@ -16,6 +16,7 @@ const base::FilePath::CharType kDatabaseName[] =
const char kDatabaseVersionKey[] = "VERSION";
const int64 kCurrentDatabaseVersion = 3;
const int64 kDatabaseOnDiskVersion = 4;
const char kServiceMetadataKey[] = "SERVICE";
const char kFileMetadataKeyPrefix[] = "FILE: ";
const char kFileTrackerKeyPrefix[] = "TRACKER: ";
......
......@@ -18,6 +18,7 @@ extern const base::FilePath::CharType kDatabaseName[];
extern const char kDatabaseVersionKey[];
extern const int64 kCurrentDatabaseVersion;
extern const int64 kDatabaseOnDiskVersion;
extern const char kServiceMetadataKey[];
extern const char kFileMetadataKeyPrefix[];
extern const char kFileTrackerKeyPrefix[];
......
......@@ -21,6 +21,11 @@
namespace sync_file_system {
namespace drive_backend {
void PutVersionToBatch(int64 version, leveldb::WriteBatch* batch) {
if (batch)
batch->Put(kDatabaseVersionKey, base::Int64ToString(version));
}
void PutServiceMetadataToBatch(const ServiceMetadata& service_metadata,
leveldb::WriteBatch* batch) {
if (!batch)
......
......@@ -30,6 +30,8 @@ class WriteBatch;
namespace sync_file_system {
namespace drive_backend {
void PutVersionToBatch(int64 version, leveldb::WriteBatch* batch);
void PutServiceMetadataToBatch(const ServiceMetadata& service_metadata,
leveldb::WriteBatch* batch);
void PutFileMetadataToBatch(const FileMetadata& file,
......
......@@ -284,15 +284,6 @@ SyncStatusCode MigrateDatabaseIfNeeded(leveldb::DB* db) {
}
}
SyncStatusCode WriteVersionInfo(leveldb::DB* db) {
base::ThreadRestrictions::AssertIOAllowed();
DCHECK(db);
return LevelDBStatusToSyncStatusCode(
db->Put(leveldb::WriteOptions(),
kDatabaseVersionKey,
base::Int64ToString(kCurrentDatabaseVersion)));
}
bool HasInvalidTitle(const std::string& title) {
return title.empty() ||
title.find('/') != std::string::npos ||
......@@ -1479,11 +1470,7 @@ SyncStatusCode MetadataDatabase::InitializeOnFileTaskRunner() {
return status;
}
if (created) {
status = WriteVersionInfo(db_.get());
if (status != SYNC_STATUS_OK)
return status;
} else {
if (!created) {
status = MigrateDatabaseIfNeeded(db_.get());
if (status != SYNC_STATUS_OK)
return status;
......
......@@ -206,6 +206,8 @@ MetadataDatabaseIndex::Create(leveldb::DB* db, leveldb::WriteBatch* batch) {
scoped_ptr<ServiceMetadata> service_metadata = InitializeServiceMetadata(db);
DatabaseContents contents;
PutVersionToBatch(kCurrentDatabaseVersion, batch);
ReadDatabaseContents(db, &contents);
RemoveUnreachableItems(&contents,
service_metadata->sync_root_tracker_id(),
......
......@@ -142,12 +142,16 @@ std::string GenerateDemotedDirtyIDKey(int64 tracker_id) {
} // namespace
MetadataDatabaseIndexOnDisk::MetadataDatabaseIndexOnDisk(leveldb::DB* db)
: db_(db) {
// TODO(peria): Add UMA to measure the number of FileMetadata, FileTracker,
// and AppRootId.
// TODO(peria): If the DB version is 3, build up index lists.
// TODO(peria): Read service metadata from DB.
// static
scoped_ptr<MetadataDatabaseIndexOnDisk>
MetadataDatabaseIndexOnDisk::Create(
leveldb::DB* db, leveldb::WriteBatch* batch) {
DCHECK(db);
PutVersionToBatch(kDatabaseOnDiskVersion, batch);
scoped_ptr<MetadataDatabaseIndexOnDisk>
index(new MetadataDatabaseIndexOnDisk(db));
return index.Pass();
}
MetadataDatabaseIndexOnDisk::~MetadataDatabaseIndexOnDisk() {}
......@@ -552,6 +556,14 @@ MetadataDatabaseIndexOnDisk::GetAllMetadataIDs() const {
return file_ids;
}
MetadataDatabaseIndexOnDisk::MetadataDatabaseIndexOnDisk(leveldb::DB* db)
: db_(db) {
// TODO(peria): Add UMA to measure the number of FileMetadata, FileTracker,
// and AppRootId.
// TODO(peria): If the DB version is 3, build up index lists.
service_metadata_ = InitializeServiceMetadata(db_);
}
void MetadataDatabaseIndexOnDisk::AddToAppIDIndex(
const FileTracker& tracker, leveldb::WriteBatch* batch) {
if (!IsAppRoot(tracker)) {
......
......@@ -31,7 +31,9 @@ struct ParentIDAndTitle;
// Maintains indexes of MetadataDatabase on disk.
class MetadataDatabaseIndexOnDisk : public MetadataDatabaseIndexInterface {
public:
explicit MetadataDatabaseIndexOnDisk(leveldb::DB* db);
static scoped_ptr<MetadataDatabaseIndexOnDisk>
Create(leveldb::DB* db, leveldb::WriteBatch* batch);
virtual ~MetadataDatabaseIndexOnDisk();
// MetadataDatabaseIndexInterface overrides.
......@@ -84,6 +86,8 @@ class MetadataDatabaseIndexOnDisk : public MetadataDatabaseIndexInterface {
MULTIPLE, // Two or more entires are found.
};
explicit MetadataDatabaseIndexOnDisk(leveldb::DB* db);
// Maintain indexes from AppIDs to tracker IDs.
void AddToAppIDIndex(const FileTracker& new_tracker,
leveldb::WriteBatch* batch);
......
......@@ -36,7 +36,7 @@ class MetadataDatabaseIndexOnDiskTest : public testing::Test {
ASSERT_TRUE(database_dir_.CreateUniqueTempDir());
in_memory_env_.reset(leveldb::NewMemEnv(leveldb::Env::Default()));
InitializeLevelDB();
index_.reset(new MetadataDatabaseIndexOnDisk(db_.get()));
index_ = MetadataDatabaseIndexOnDisk::Create(db_.get(), NULL);
}
virtual void TearDown() OVERRIDE {
......
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