diff options
author | earthdok@chromium.org <earthdok@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-07-30 11:36:44 +0000 |
---|---|---|
committer | earthdok@chromium.org <earthdok@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-07-30 11:36:44 +0000 |
commit | b3e1607da7aee4ce3de286379d2a45f99acd2256 (patch) | |
tree | 3b5ff673c45143038b08dbd5190530516c929673 | |
parent | f311c233e1c2cb66205eb777d6b40b16ea36e58b (diff) | |
download | chromium_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.cc | 188 | ||||
-rw-r--r-- | chrome/browser/sync_file_system/drive_backend/leveldb_wrapper.h | 102 | ||||
-rw-r--r-- | chrome/browser/sync_file_system/drive_backend/leveldb_wrapper_unittest.cc | 188 | ||||
-rw-r--r-- | chrome/chrome_browser.gypi | 2 | ||||
-rw-r--r-- | chrome/chrome_tests_unit.gypi | 1 |
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', |