Commit bca076af authored by peria's avatar peria Committed by Commit bot

[SyncFS] Make on-disk version default for metadata database index

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

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

Cr-Commit-Position: refs/heads/master@{#293714}
parent 7e1fe273
...@@ -45,8 +45,8 @@ namespace drive_backend { ...@@ -45,8 +45,8 @@ namespace drive_backend {
namespace { namespace {
// Command line flag to enable on-disk indexing. // Command line flag to disable on-disk indexing.
const char kEnableMetadataDatabaseOnDisk[] = "enable-syncfs-on-disk-indexing"; const char kDisableMetadataDatabaseOnDisk[] = "disable-syncfs-on-disk-indexing";
void EmptyStatusCallback(SyncStatusCode status) {} void EmptyStatusCallback(SyncStatusCode status) {}
...@@ -262,8 +262,8 @@ SyncStatusCode MigrateDatabaseIfNeeded(LevelDBWrapper* db) { ...@@ -262,8 +262,8 @@ SyncStatusCode MigrateDatabaseIfNeeded(LevelDBWrapper* db) {
// TODO(peria): Move the migration code (from v3 to v4) here. // TODO(peria): Move the migration code (from v3 to v4) here.
return SYNC_STATUS_OK; return SYNC_STATUS_OK;
case 4: case 4:
if (!CommandLine::ForCurrentProcess()->HasSwitch( if (CommandLine::ForCurrentProcess()->HasSwitch(
kEnableMetadataDatabaseOnDisk)) { kDisableMetadataDatabaseOnDisk)) {
MigrateDatabaseFromV4ToV3(db->GetLevelDB()); MigrateDatabaseFromV4ToV3(db->GetLevelDB());
} }
return SYNC_STATUS_OK; return SYNC_STATUS_OK;
...@@ -551,10 +551,13 @@ void MetadataDatabase::Create( ...@@ -551,10 +551,13 @@ void MetadataDatabase::Create(
// static // static
SyncStatusCode MetadataDatabase::CreateForTesting( SyncStatusCode MetadataDatabase::CreateForTesting(
scoped_ptr<LevelDBWrapper> db, scoped_ptr<LevelDBWrapper> db,
bool enable_on_disk_index,
scoped_ptr<MetadataDatabase>* metadata_database_out) { scoped_ptr<MetadataDatabase>* metadata_database_out) {
scoped_ptr<MetadataDatabase> metadata_database( scoped_ptr<MetadataDatabase> metadata_database(
new MetadataDatabase(base::ThreadTaskRunnerHandle::Get(), new MetadataDatabase(base::ThreadTaskRunnerHandle::Get(),
base::FilePath(), NULL)); base::FilePath(),
enable_on_disk_index,
NULL));
metadata_database->db_ = db.Pass(); metadata_database->db_ = db.Pass();
SyncStatusCode status = metadata_database->Initialize(); SyncStatusCode status = metadata_database->Initialize();
if (status == SYNC_STATUS_OK) if (status == SYNC_STATUS_OK)
...@@ -1405,10 +1408,12 @@ void MetadataDatabase::SweepDirtyTrackers( ...@@ -1405,10 +1408,12 @@ void MetadataDatabase::SweepDirtyTrackers(
MetadataDatabase::MetadataDatabase( MetadataDatabase::MetadataDatabase(
const scoped_refptr<base::SequencedTaskRunner>& worker_task_runner, const scoped_refptr<base::SequencedTaskRunner>& worker_task_runner,
const base::FilePath& database_path, const base::FilePath& database_path,
bool enable_on_disk_index,
leveldb::Env* env_override) leveldb::Env* env_override)
: worker_task_runner_(worker_task_runner), : worker_task_runner_(worker_task_runner),
database_path_(database_path), database_path_(database_path),
env_override_(env_override), env_override_(env_override),
enable_on_disk_index_(enable_on_disk_index),
largest_known_change_id_(0), largest_known_change_id_(0),
weak_ptr_factory_(this) { weak_ptr_factory_(this) {
DCHECK(worker_task_runner.get()); DCHECK(worker_task_runner.get());
...@@ -1420,9 +1425,12 @@ void MetadataDatabase::CreateOnWorkerTaskRunner( ...@@ -1420,9 +1425,12 @@ void MetadataDatabase::CreateOnWorkerTaskRunner(
const CreateCallback& callback) { const CreateCallback& callback) {
DCHECK(create_param->worker_task_runner->RunsTasksOnCurrentThread()); DCHECK(create_param->worker_task_runner->RunsTasksOnCurrentThread());
bool enable_on_disk_index = !CommandLine::ForCurrentProcess()->HasSwitch(
kDisableMetadataDatabaseOnDisk);
scoped_ptr<MetadataDatabase> metadata_database( scoped_ptr<MetadataDatabase> metadata_database(
new MetadataDatabase(create_param->worker_task_runner, new MetadataDatabase(create_param->worker_task_runner,
create_param->database_path, create_param->database_path,
enable_on_disk_index,
create_param->env_override)); create_param->env_override));
SyncStatusCode status = metadata_database->Initialize(); SyncStatusCode status = metadata_database->Initialize();
...@@ -1434,6 +1442,7 @@ void MetadataDatabase::CreateOnWorkerTaskRunner( ...@@ -1434,6 +1442,7 @@ void MetadataDatabase::CreateOnWorkerTaskRunner(
metadata_database.reset( metadata_database.reset(
new MetadataDatabase(create_param->worker_task_runner, new MetadataDatabase(create_param->worker_task_runner,
create_param->database_path, create_param->database_path,
enable_on_disk_index,
create_param->env_override)); create_param->env_override));
status = metadata_database->Initialize(); status = metadata_database->Initialize();
} }
...@@ -1468,8 +1477,7 @@ SyncStatusCode MetadataDatabase::Initialize() { ...@@ -1468,8 +1477,7 @@ SyncStatusCode MetadataDatabase::Initialize() {
return status; return status;
} }
if (CommandLine::ForCurrentProcess()->HasSwitch( if (enable_on_disk_index_) {
kEnableMetadataDatabaseOnDisk)) {
index_ = MetadataDatabaseIndexOnDisk::Create(db_.get()); index_ = MetadataDatabaseIndexOnDisk::Create(db_.get());
} else { } else {
index_ = MetadataDatabaseIndex::Create(db_.get()); index_ = MetadataDatabaseIndex::Create(db_.get());
......
...@@ -139,6 +139,7 @@ class MetadataDatabase { ...@@ -139,6 +139,7 @@ class MetadataDatabase {
const CreateCallback& callback); const CreateCallback& callback);
static SyncStatusCode CreateForTesting( static SyncStatusCode CreateForTesting(
scoped_ptr<LevelDBWrapper> db, scoped_ptr<LevelDBWrapper> db,
bool enable_on_disk_index,
scoped_ptr<MetadataDatabase>* metadata_database_out); scoped_ptr<MetadataDatabase>* metadata_database_out);
~MetadataDatabase(); ~MetadataDatabase();
...@@ -358,6 +359,7 @@ class MetadataDatabase { ...@@ -358,6 +359,7 @@ class MetadataDatabase {
MetadataDatabase( MetadataDatabase(
const scoped_refptr<base::SequencedTaskRunner>& worker_task_runner, const scoped_refptr<base::SequencedTaskRunner>& worker_task_runner,
const base::FilePath& database_path, const base::FilePath& database_path,
bool enable_on_disk_index,
leveldb::Env* env_override); leveldb::Env* env_override);
static void CreateOnWorkerTaskRunner( static void CreateOnWorkerTaskRunner(
scoped_ptr<CreateParam> create_param, scoped_ptr<CreateParam> create_param,
...@@ -418,6 +420,8 @@ class MetadataDatabase { ...@@ -418,6 +420,8 @@ class MetadataDatabase {
leveldb::Env* env_override_; leveldb::Env* env_override_;
scoped_ptr<LevelDBWrapper> db_; scoped_ptr<LevelDBWrapper> db_;
bool enable_on_disk_index_;
int64 largest_known_change_id_; int64 largest_known_change_id_;
scoped_ptr<MetadataDatabaseIndexInterface> index_; scoped_ptr<MetadataDatabaseIndexInterface> index_;
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
#include "chrome/browser/sync_file_system/drive_backend/metadata_database.pb.h" #include "chrome/browser/sync_file_system/drive_backend/metadata_database.pb.h"
#include "chrome/browser/sync_file_system/drive_backend/metadata_database_index.h" #include "chrome/browser/sync_file_system/drive_backend/metadata_database_index.h"
#include "chrome/browser/sync_file_system/drive_backend/metadata_database_index_interface.h" #include "chrome/browser/sync_file_system/drive_backend/metadata_database_index_interface.h"
#include "chrome/browser/sync_file_system/drive_backend/metadata_database_index_on_disk.h"
#include "chrome/browser/sync_file_system/sync_file_system_test_util.h" #include "chrome/browser/sync_file_system/sync_file_system_test_util.h"
#include "google_apis/drive/drive_api_parser.h" #include "google_apis/drive/drive_api_parser.h"
#include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest/include/gtest/gtest.h"
...@@ -462,59 +463,75 @@ class MetadataDatabaseTest : public testing::Test { ...@@ -462,59 +463,75 @@ class MetadataDatabaseTest : public testing::Test {
return db->Commit(); return db->Commit();
} }
void VerifyReloadConsistency() { void VerifyReloadConsistencyForOnMemory(MetadataDatabaseIndex* index1,
scoped_ptr<MetadataDatabase> metadata_database_2; MetadataDatabaseIndex* index2) {
ASSERT_EQ(SYNC_STATUS_OK, ExpectEquivalentServiceMetadata(index1, index2);
MetadataDatabase::CreateForTesting(
metadata_database_->db_.Pass(),
&metadata_database_2));
metadata_database_->db_ = metadata_database_2->db_.Pass();
const MetadataDatabaseIndex* on_memory =
static_cast<MetadataDatabaseIndex*>(metadata_database_->index_.get());
const MetadataDatabaseIndex* reloaded =
static_cast<MetadataDatabaseIndex*>(metadata_database_2->index_.get());
{
SCOPED_TRACE("Expect equivalent service_metadata");
ExpectEquivalentServiceMetadata(metadata_database_->index_.get(),
metadata_database_2->index_.get());
}
{ {
SCOPED_TRACE("Expect equivalent metadata_by_id_ contents."); SCOPED_TRACE("Expect equivalent metadata_by_id_ contents.");
ExpectEquivalent(on_memory->metadata_by_id_, ExpectEquivalent(index1->metadata_by_id_, index2->metadata_by_id_);
reloaded->metadata_by_id_);
} }
{ {
SCOPED_TRACE("Expect equivalent tracker_by_id_ contents."); SCOPED_TRACE("Expect equivalent tracker_by_id_ contents.");
ExpectEquivalent(on_memory->tracker_by_id_, ExpectEquivalent(index1->tracker_by_id_, index2->tracker_by_id_);
reloaded->tracker_by_id_);
} }
{ {
SCOPED_TRACE("Expect equivalent trackers_by_file_id_ contents."); SCOPED_TRACE("Expect equivalent trackers_by_file_id_ contents.");
ExpectEquivalent(on_memory->trackers_by_file_id_, ExpectEquivalent(index1->trackers_by_file_id_,
reloaded->trackers_by_file_id_); index2->trackers_by_file_id_);
} }
{ {
SCOPED_TRACE("Expect equivalent app_root_by_app_id_ contents."); SCOPED_TRACE("Expect equivalent app_root_by_app_id_ contents.");
ExpectEquivalent(on_memory->app_root_by_app_id_, ExpectEquivalent(index1->app_root_by_app_id_,
reloaded->app_root_by_app_id_); index2->app_root_by_app_id_);
} }
{ {
SCOPED_TRACE("Expect equivalent trackers_by_parent_and_title_ contents."); SCOPED_TRACE("Expect equivalent trackers_by_parent_and_title_ contents.");
ExpectEquivalent(on_memory->trackers_by_parent_and_title_, ExpectEquivalent(index1->trackers_by_parent_and_title_,
reloaded->trackers_by_parent_and_title_); index2->trackers_by_parent_and_title_);
} }
{ {
SCOPED_TRACE("Expect equivalent dirty_trackers_ contents."); SCOPED_TRACE("Expect equivalent dirty_trackers_ contents.");
ExpectEquivalent(on_memory->dirty_trackers_, ExpectEquivalent(index1->dirty_trackers_, index2->dirty_trackers_);
reloaded->dirty_trackers_); }
}
void VerifyReloadConsistencyForOnDisk(
MetadataDatabaseIndexOnDisk* index1,
MetadataDatabaseIndexOnDisk* index2) {
ExpectEquivalentServiceMetadata(index1, index2);
scoped_ptr<LevelDBWrapper::Iterator> itr1 =
index1->GetDBForTesting()->NewIterator();
scoped_ptr<LevelDBWrapper::Iterator> itr2 =
index2->GetDBForTesting()->NewIterator();
for (itr1->SeekToFirst(), itr2->SeekToFirst();
itr1->Valid() && itr2->Valid();
itr1->Next(), itr2->Next()) {
EXPECT_EQ(itr1->key().ToString(), itr2->key().ToString());
EXPECT_EQ(itr1->value().ToString(), itr2->value().ToString());
}
EXPECT_TRUE(!itr1->Valid());
EXPECT_TRUE(!itr2->Valid());
}
void VerifyReloadConsistency() {
scoped_ptr<MetadataDatabase> metadata_database_2;
ASSERT_EQ(SYNC_STATUS_OK,
MetadataDatabase::CreateForTesting(
metadata_database_->db_.Pass(),
metadata_database_->enable_on_disk_index_,
&metadata_database_2));
metadata_database_->db_ = metadata_database_2->db_.Pass();
MetadataDatabaseIndexInterface* index1 = metadata_database_->index_.get();
MetadataDatabaseIndexInterface* index2 = metadata_database_2->index_.get();
if (metadata_database_->enable_on_disk_index_) {
VerifyReloadConsistencyForOnDisk(
static_cast<MetadataDatabaseIndexOnDisk*>(index1),
static_cast<MetadataDatabaseIndexOnDisk*>(index2));
} else {
VerifyReloadConsistencyForOnMemory(
static_cast<MetadataDatabaseIndex*>(index1),
static_cast<MetadataDatabaseIndex*>(index2));
} }
} }
......
...@@ -125,7 +125,7 @@ class RegisterAppTaskTest : public testing::Test { ...@@ -125,7 +125,7 @@ class RegisterAppTaskTest : public testing::Test {
scoped_ptr<MetadataDatabase> metadata_db; scoped_ptr<MetadataDatabase> metadata_db;
ASSERT_EQ(SYNC_STATUS_OK, ASSERT_EQ(SYNC_STATUS_OK,
MetadataDatabase::CreateForTesting( MetadataDatabase::CreateForTesting(
db.Pass(), &metadata_db)); db.Pass(), true /* enable_on_disk_index */, &metadata_db));
context_->SetMetadataDatabase(metadata_db.Pass()); context_->SetMetadataDatabase(metadata_db.Pass());
} }
......
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