summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorearthdok@chromium.org <earthdok@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-07-30 11:36:44 +0000
committerearthdok@chromium.org <earthdok@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-07-30 11:36:44 +0000
commitb3e1607da7aee4ce3de286379d2a45f99acd2256 (patch)
tree3b5ff673c45143038b08dbd5190530516c929673
parentf311c233e1c2cb66205eb777d6b40b16ea36e58b (diff)
downloadchromium_src-b3e1607da7aee4ce3de286379d2a45f99acd2256.zip
chromium_src-b3e1607da7aee4ce3de286379d2a45f99acd2256.tar.gz
chromium_src-b3e1607da7aee4ce3de286379d2a45f99acd2256.tar.bz2
Revert of [SyncFS] Introduce DatabaseWrapper class (https://codereview.chromium.org/415033002/)
Reason for revert: Broke compile on DrMemory bots. Original issue's description: > [SyncFS] Introduce DatabaseWrapper class. > > DatabaseWrapper class wraps leveldb::DB and leveldb::WriteBatch class. > DatabaseWrapper has following features. > - Simple interfaces for many usages. > - I/O seems synchronous, with caching pending transactions on memory. > > > > BUG=347425 > TEST=./unit_tests --gtest_filter="DatabaseWrapper*" > > Committed: https://src.chromium.org/viewvc/chrome?view=rev&revision=286451 TBR=nhiroki@chromium.org,tzik@chromium.org,peria@chromium.org NOTREECHECKS=true NOTRY=true BUG=398820 Review URL: https://codereview.chromium.org/423423002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@286483 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/browser/sync_file_system/drive_backend/leveldb_wrapper.cc188
-rw-r--r--chrome/browser/sync_file_system/drive_backend/leveldb_wrapper.h102
-rw-r--r--chrome/browser/sync_file_system/drive_backend/leveldb_wrapper_unittest.cc188
-rw-r--r--chrome/chrome_browser.gypi2
-rw-r--r--chrome/chrome_tests_unit.gypi1
5 files changed, 0 insertions, 481 deletions
diff --git a/chrome/browser/sync_file_system/drive_backend/leveldb_wrapper.cc b/chrome/browser/sync_file_system/drive_backend/leveldb_wrapper.cc
deleted file mode 100644
index d18325d..0000000
--- a/chrome/browser/sync_file_system/drive_backend/leveldb_wrapper.cc
+++ /dev/null
@@ -1,188 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/sync_file_system/drive_backend/leveldb_wrapper.h"
-
-#include <map>
-#include <set>
-#include <string>
-
-#include "base/logging.h"
-#include "third_party/leveldatabase/src/include/leveldb/db.h"
-#include "third_party/leveldatabase/src/include/leveldb/iterator.h"
-#include "third_party/leveldatabase/src/include/leveldb/slice.h"
-#include "third_party/leveldatabase/src/include/leveldb/status.h"
-#include "third_party/leveldatabase/src/include/leveldb/write_batch.h"
-
-namespace sync_file_system {
-namespace drive_backend {
-
-LevelDBWrapper::Iterator::Iterator(LevelDBWrapper* db)
- : db_(db),
- db_iterator_(db->db_->NewIterator(leveldb::ReadOptions())),
- map_iterator_(db->pending_.end()) {}
-
-LevelDBWrapper::Iterator::~Iterator() {}
-
-bool LevelDBWrapper::Iterator::Valid() {
- return map_iterator_ != db_->pending_.end() ||
- db_iterator_->Valid();
-}
-
-void LevelDBWrapper::Iterator::Seek(const std::string& target) {
- map_iterator_ = db_->pending_.lower_bound(target);
- db_iterator_->Seek(target);
- AdvanceIterators();
-}
-
-void LevelDBWrapper::Iterator::Next() {
- if (map_iterator_ == db_->pending_.end()) {
- if (db_iterator_->Valid())
- db_iterator_->Next();
- return;
- }
-
- if (db_iterator_->Valid()) {
- int comp = db_iterator_->key().compare(map_iterator_->first);
- if (comp <= 0)
- db_iterator_->Next();
- if (comp >= 0)
- ++map_iterator_;
- }
-
- AdvanceIterators();
-}
-
-leveldb::Slice LevelDBWrapper::Iterator::key() {
- DCHECK(Valid());
-
- if (!db_iterator_->Valid())
- return map_iterator_->first;
- if (map_iterator_ == db_->pending_.end())
- return db_iterator_->key();
-
- const leveldb::Slice db_key = db_iterator_->key();
- const leveldb::Slice map_key = map_iterator_->first;
- return (db_key.compare(map_key) < 0) ? db_key : map_key;
-}
-
-leveldb::Slice LevelDBWrapper::Iterator::value() {
- DCHECK(Valid());
-
- if (!db_iterator_->Valid())
- return map_iterator_->second.second;
- if (map_iterator_ == db_->pending_.end())
- return db_iterator_->value();
-
- const leveldb::Slice db_key = db_iterator_->key();
- const leveldb::Slice map_key = map_iterator_->first;
- if (db_key.compare(map_key) < 0)
- return db_iterator_->value();
-
- DCHECK(map_iterator_->second.first == PUT);
- return map_iterator_->second.second;
-}
-
-void LevelDBWrapper::Iterator::AdvanceIterators() {
- // Iterator is valid iff any of below holds:
- // - |db_itr.key| < |map_itr.key| OR |map_itr| == end()
- // - (|db_itr.key| >= |map_itr.key| OR !|db_itr|->IsValid())
- // AND |map_itr.operation| == PUT
-
- if (map_iterator_ == db_->pending_.end())
- return;
-
- while (map_iterator_ != db_->pending_.end() && db_iterator_->Valid()) {
- int cmp_key = db_iterator_->key().compare(map_iterator_->first);
- if (cmp_key < 0 || map_iterator_->second.first == PUT)
- return;
- // |db_itr.key| >= |map_itr.key| && |map_itr.operation| != PUT
- if (cmp_key == 0)
- db_iterator_->Next();
- ++map_iterator_;
- }
-
- if (db_iterator_->Valid())
- return;
-
- while (map_iterator_ != db_->pending_.end() &&
- map_iterator_->second.first == DELETE)
- ++map_iterator_;
-}
-
-// ---------------------------------------------------------------------------
-// LevelDBWrapper class
-// ---------------------------------------------------------------------------
-LevelDBWrapper::LevelDBWrapper(scoped_ptr<leveldb::DB> db)
- : db_(db.Pass()) {
- DCHECK(db_);
-}
-
-LevelDBWrapper::~LevelDBWrapper() {}
-
-void LevelDBWrapper::Put(const std::string& key,
- const std::string& value) {
- pending_[key] = Transaction(PUT, value);
-}
-
-void LevelDBWrapper::Delete(const std::string& key) {
- pending_[key] = Transaction(DELETE, std::string());
-}
-
-leveldb::Status LevelDBWrapper::Get(const std::string& key,
- std::string* value) {
- PendingOperationMap::iterator itr = pending_.find(key);
- if (itr == pending_.end())
- return db_->Get(leveldb::ReadOptions(), key, value);
-
- const Transaction& transaction = itr->second;
- switch (transaction.first) {
- case PUT:
- *value = transaction.second;
- return leveldb::Status();
- case DELETE:
- return leveldb::Status::NotFound(leveldb::Slice());
- }
- NOTREACHED();
- return leveldb::Status::NotSupported("Not supported operation.");
-}
-
-scoped_ptr<LevelDBWrapper::Iterator> LevelDBWrapper::NewIterator() {
- return make_scoped_ptr(new Iterator(this));
-}
-
-leveldb::Status LevelDBWrapper::Commit() {
- leveldb::WriteBatch batch;
- for (PendingOperationMap::iterator itr = pending_.begin();
- itr != pending_.end(); ++itr) {
- const leveldb::Slice key(itr->first);
- const Transaction& transaction = itr->second;
- switch (transaction.first) {
- case PUT:
- batch.Put(key, transaction.second);
- break;
- case DELETE:
- batch.Delete(key);
- break;
- }
- }
-
- leveldb::Status status = db_->Write(leveldb::WriteOptions(), &batch);
- // TODO(peria): Decide what to do depending on |status|.
- if (status.ok())
- Clear();
-
- return status;
-}
-
-void LevelDBWrapper::Clear() {
- pending_.clear();
-}
-
-leveldb::DB* LevelDBWrapper::GetLevelDBForTesting() {
- return db_.get();
-}
-
-} // namespace drive_backend
-} // namespace sync_file_system
diff --git a/chrome/browser/sync_file_system/drive_backend/leveldb_wrapper.h b/chrome/browser/sync_file_system/drive_backend/leveldb_wrapper.h
deleted file mode 100644
index 321bb1086..0000000
--- a/chrome/browser/sync_file_system/drive_backend/leveldb_wrapper.h
+++ /dev/null
@@ -1,102 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_LEVELDB_WRAPPER_H_
-#define CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_LEVELDB_WRAPPER_H_
-
-#include <map>
-#include <string>
-
-#include "base/macros.h"
-#include "base/memory/scoped_ptr.h"
-#include "third_party/leveldatabase/src/include/leveldb/slice.h"
-
-namespace leveldb {
-class DB;
-class Iterator;
-class Slice;
-class Status;
-class WriteBatch;
-}
-
-namespace sync_file_system {
-namespace drive_backend {
-
-class SliceComparator {
- public:
- bool operator()(const leveldb::Slice& a, const leveldb::Slice& b) const {
- return a.compare(b) < 0;
- }
-};
-
-// LevelDBWrapper class wraps leveldb::DB and leveldb::WriteBatch to provide
-// transparent access to pre-commit data.
-// Put() and Delete() update data on memory, and Get() can access to those data
-// and also data on disk. Those data on memory are written down on disk when
-// Commit() is called.
-class LevelDBWrapper {
- private:
- enum Operation {
- PUT,
- DELETE,
- };
- typedef std::pair<Operation, std::string> Transaction;
- typedef std::map<std::string, Transaction, SliceComparator>
- PendingOperationMap;
-
- public:
- class Iterator {
- public:
- explicit Iterator(LevelDBWrapper* db);
- ~Iterator();
-
- bool Valid();
- void Seek(const std::string& target);
- void Next();
- leveldb::Slice key();
- leveldb::Slice value();
-
- private:
- // Advances internal iterators to be valid.
- void AdvanceIterators();
-
- LevelDBWrapper* db_; // do not own
- scoped_ptr<leveldb::Iterator> db_iterator_;
- PendingOperationMap::iterator map_iterator_;
-
- DISALLOW_COPY_AND_ASSIGN(Iterator);
- };
-
- explicit LevelDBWrapper(scoped_ptr<leveldb::DB> db);
- ~LevelDBWrapper();
-
- // Wrapping methods of leveldb::WriteBatch
- void Put(const std::string& key, const std::string& value);
- void Delete(const std::string& key);
-
- // Wrapping methods of leveldb::DB
- leveldb::Status Get(const std::string& key, std::string* value);
- scoped_ptr<Iterator> NewIterator();
-
- // Commits pending transactions to |db_| and clears cached transactions.
- // Returns true if the commitment succeeds.
- leveldb::Status Commit();
-
- // Clears pending transactions.
- void Clear();
-
- leveldb::DB* GetLevelDBForTesting();
-
- private:
- scoped_ptr<leveldb::DB> db_;
-
- PendingOperationMap pending_;
-
- DISALLOW_COPY_AND_ASSIGN(LevelDBWrapper);
-};
-
-} // namespace drive_backend
-} // namespace sync_file_system
-
-#endif // CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_LEVELDB_WRAPPER_H_
diff --git a/chrome/browser/sync_file_system/drive_backend/leveldb_wrapper_unittest.cc b/chrome/browser/sync_file_system/drive_backend/leveldb_wrapper_unittest.cc
deleted file mode 100644
index 808d442..0000000
--- a/chrome/browser/sync_file_system/drive_backend/leveldb_wrapper_unittest.cc
+++ /dev/null
@@ -1,188 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/sync_file_system/drive_backend/leveldb_wrapper.h"
-
-#include <string>
-
-#include "base/files/scoped_temp_dir.h"
-#include "base/logging.h"
-#include "base/strings/string_number_conversions.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/leveldatabase/src/helpers/memenv/memenv.h"
-#include "third_party/leveldatabase/src/include/leveldb/db.h"
-#include "third_party/leveldatabase/src/include/leveldb/env.h"
-
-namespace sync_file_system {
-namespace drive_backend {
-
-struct TestData {
- const std::string key;
- const std::string value;
-};
-
-class LevelDBWrapperTest : public testing::Test {
- public:
- virtual ~LevelDBWrapperTest() {}
-
- virtual void SetUp() OVERRIDE {
- ASSERT_TRUE(database_dir_.CreateUniqueTempDir());
- in_memory_env_.reset(leveldb::NewMemEnv(leveldb::Env::Default()));
- InitializeLevelDB();
- }
-
- virtual void TearDown() OVERRIDE {
- db_.reset();
- in_memory_env_.reset();
- }
-
- void CreateDefaultDatabase() {
- leveldb::DB* db = db_->GetLevelDBForTesting();
-
- // Expected contents are
- // {"a": "1", "ab": "0", "bb": "3", "d": "4"}
- const char* keys[] = {"ab", "a", "d", "bb", "d"};
- for (size_t i = 0; i < arraysize(keys); ++i) {
- leveldb::Status status =
- db->Put(leveldb::WriteOptions(), keys[i], base::Int64ToString(i));
- ASSERT_TRUE(status.ok());
- }
- }
-
- LevelDBWrapper* GetDB() {
- return db_.get();
- }
-
- void CheckDBContents(const TestData expects[], size_t size) {
- DCHECK(db_);
-
- scoped_ptr<LevelDBWrapper::Iterator> itr = db_->NewIterator();
- // TODO(peria): Use itr->SeekToFirst(), if available.
- itr->Seek(std::string());
- for (size_t i = 0; i < size; ++i) {
- ASSERT_TRUE(itr->Valid());
- EXPECT_EQ(expects[i].key, itr->key().ToString());
- EXPECT_EQ(expects[i].value, itr->value().ToString());
- itr->Next();
- }
- EXPECT_FALSE(itr->Valid());
- }
-
- private:
- void InitializeLevelDB() {
- leveldb::DB* db = NULL;
- leveldb::Options options;
- options.create_if_missing = true;
- options.max_open_files = 0; // Use minimum.
- options.env = in_memory_env_.get();
- leveldb::Status status =
- leveldb::DB::Open(options, database_dir_.path().AsUTF8Unsafe(), &db);
- ASSERT_TRUE(status.ok());
-
- db_.reset(new LevelDBWrapper(make_scoped_ptr(db)));
- }
-
- base::ScopedTempDir database_dir_;
- scoped_ptr<leveldb::Env> in_memory_env_;
- scoped_ptr<LevelDBWrapper> db_;
-};
-
-TEST_F(LevelDBWrapperTest, IteratorTest) {
- CreateDefaultDatabase();
- scoped_ptr<LevelDBWrapper::Iterator> itr = GetDB()->NewIterator();
-
- itr->Seek("a");
- EXPECT_TRUE(itr->Valid());
- EXPECT_EQ("a", itr->key().ToString());
- EXPECT_EQ("1", itr->value().ToString());
-
- itr->Next();
- EXPECT_TRUE(itr->Valid());
- EXPECT_EQ("ab", itr->key().ToString());
- EXPECT_EQ("0", itr->value().ToString());
-
- itr->Seek("b");
- EXPECT_TRUE(itr->Valid());
- EXPECT_EQ("bb", itr->key().ToString());
- EXPECT_EQ("3", itr->value().ToString());
-
- itr->Next();
- EXPECT_TRUE(itr->Valid());
- EXPECT_EQ("d", itr->key().ToString());
- EXPECT_EQ("4", itr->value().ToString());
-
- itr->Next();
- EXPECT_FALSE(itr->Valid());
-}
-
-TEST_F(LevelDBWrapperTest, PutTest) {
- TestData merged_data[] = {{"a", "1"}, {"aa", "new0"}, {"ab", "0"},
- {"bb", "new2"}, {"c", "new1"}, {"d", "4"}};
- TestData orig_data[] = {{"a", "1"}, {"ab", "0"}, {"bb", "3"}, {"d", "4"}};
-
- CreateDefaultDatabase();
-
- // Add pending transactions.
- GetDB()->Put("aa", "new0");
- GetDB()->Put("c", "new1");
- GetDB()->Put("bb", "new2"); // Overwrite an entry.
-
- SCOPED_TRACE("PutTest_Pending");
- CheckDBContents(merged_data, arraysize(merged_data));
-
- // Remove all pending transactions.
- GetDB()->Clear();
-
- SCOPED_TRACE("PutTest_Clear");
- CheckDBContents(orig_data, arraysize(orig_data));
-
- // Add pending transactions again, with commiting.
- GetDB()->Put("aa", "new0");
- GetDB()->Put("c", "new1");
- GetDB()->Put("bb", "new2");
- GetDB()->Commit();
- GetDB()->Clear(); // Clear just in case.
-
- SCOPED_TRACE("PutTest_Commit");
- CheckDBContents(merged_data, arraysize(merged_data));
-}
-
-TEST_F(LevelDBWrapperTest, DeleteTest) {
- TestData merged_data[] = {{"a", "1"}, {"aa", "new0"}, {"bb", "new2"},
- {"d", "4"}};
- TestData orig_data[] = {{"a", "1"}, {"ab", "0"}, {"bb", "3"}, {"d", "4"}};
-
- CreateDefaultDatabase();
-
- // Add pending transactions.
- GetDB()->Put("aa", "new0");
- GetDB()->Put("c", "new1");
- GetDB()->Put("bb", "new2"); // Overwrite an entry.
- GetDB()->Delete("c"); // Remove a pending entry.
- GetDB()->Delete("ab"); // Remove a committed entry.
-
- SCOPED_TRACE("DeleteTest_Pending");
- CheckDBContents(merged_data, arraysize(merged_data));
-
- // Remove all pending transactions.
- GetDB()->Clear();
-
- SCOPED_TRACE("DeleteTest_Clear");
- CheckDBContents(orig_data, arraysize(orig_data));
-
- // Add pending transactions again, with commiting.
- GetDB()->Put("aa", "new0");
- GetDB()->Put("c", "new1");
- GetDB()->Put("bb", "new2");
- GetDB()->Delete("c");
- GetDB()->Delete("ab");
- GetDB()->Commit();
- GetDB()->Clear();
-
- SCOPED_TRACE("DeleteTest_Commit");
- CheckDBContents(merged_data, arraysize(merged_data));
-}
-
-} // namespace drive_backend
-} // namespace sync_file_system
diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi
index ebc4183..552575e 100644
--- a/chrome/chrome_browser.gypi
+++ b/chrome/chrome_browser.gypi
@@ -1569,8 +1569,6 @@
'browser/sync_file_system/drive_backend/drive_uploader_wrapper.h',
'browser/sync_file_system/drive_backend/folder_creator.cc',
'browser/sync_file_system/drive_backend/folder_creator.h',
- 'browser/sync_file_system/drive_backend/leveldb_wrapper.cc',
- 'browser/sync_file_system/drive_backend/leveldb_wrapper.h',
'browser/sync_file_system/drive_backend/list_changes_task.cc',
'browser/sync_file_system/drive_backend/list_changes_task.h',
'browser/sync_file_system/drive_backend/local_to_remote_syncer.cc',
diff --git a/chrome/chrome_tests_unit.gypi b/chrome/chrome_tests_unit.gypi
index 836f85d..741daf7 100644
--- a/chrome/chrome_tests_unit.gypi
+++ b/chrome/chrome_tests_unit.gypi
@@ -1397,7 +1397,6 @@
'browser/sync_file_system/drive_backend/fake_drive_uploader.h',
'browser/sync_file_system/drive_backend/fake_sync_worker.cc',
'browser/sync_file_system/drive_backend/fake_sync_worker.h',
- 'browser/sync_file_system/drive_backend/leveldb_wrapper_unittest.cc',
'browser/sync_file_system/drive_backend/list_changes_task_unittest.cc',
'browser/sync_file_system/drive_backend/local_to_remote_syncer_unittest.cc',
'browser/sync_file_system/drive_backend/metadata_database_index_on_disk_unittest.cc',