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