Commit 00bdf806 authored by peria@chromium.org's avatar peria@chromium.org

[SyncFS] Introduce counters in LevelDBWrapper to count the number

of pending transactions for PUT/DELETE operations independently.
It means that both counters counts the operation for the entry, if an entry is put and deleted.


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

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

Cr-Commit-Position: refs/heads/master@{#289595}
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@289595 0039d316-1c4b-4281-b951-d872f2087c98
parent 5aa95acb
...@@ -78,6 +78,8 @@ void LevelDBWrapper::Iterator::Delete() { ...@@ -78,6 +78,8 @@ void LevelDBWrapper::Iterator::Delete() {
// update the value. // update the value.
map_iterator_->second = deletion; map_iterator_->second = deletion;
++(db_->num_deletes_);
AdvanceIterators(); AdvanceIterators();
} }
...@@ -142,19 +144,20 @@ void LevelDBWrapper::Iterator::AdvanceIterators() { ...@@ -142,19 +144,20 @@ void LevelDBWrapper::Iterator::AdvanceIterators() {
// LevelDBWrapper class // LevelDBWrapper class
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
LevelDBWrapper::LevelDBWrapper(scoped_ptr<leveldb::DB> db) LevelDBWrapper::LevelDBWrapper(scoped_ptr<leveldb::DB> db)
: db_(db.Pass()) { : db_(db.Pass()), num_puts_(0), num_deletes_(0) {
DCHECK(db_); DCHECK(db_);
} }
LevelDBWrapper::~LevelDBWrapper() {} LevelDBWrapper::~LevelDBWrapper() {}
void LevelDBWrapper::Put(const std::string& key, void LevelDBWrapper::Put(const std::string& key, const std::string& value) {
const std::string& value) {
pending_[key] = Transaction(PUT_OPERATION, value); pending_[key] = Transaction(PUT_OPERATION, value);
++num_puts_;
} }
void LevelDBWrapper::Delete(const std::string& key) { void LevelDBWrapper::Delete(const std::string& key) {
pending_[key] = Transaction(DELETE_OPERATION, std::string()); pending_[key] = Transaction(DELETE_OPERATION, std::string());
++num_deletes_;
} }
leveldb::Status LevelDBWrapper::Get(const std::string& key, leveldb::Status LevelDBWrapper::Get(const std::string& key,
...@@ -205,6 +208,8 @@ leveldb::Status LevelDBWrapper::Commit() { ...@@ -205,6 +208,8 @@ leveldb::Status LevelDBWrapper::Commit() {
void LevelDBWrapper::Clear() { void LevelDBWrapper::Clear() {
pending_.clear(); pending_.clear();
num_puts_ = 0;
num_deletes_ = 0;
} }
leveldb::DB* LevelDBWrapper::GetLevelDB() { leveldb::DB* LevelDBWrapper::GetLevelDB() {
......
...@@ -89,6 +89,12 @@ class LevelDBWrapper { ...@@ -89,6 +89,12 @@ class LevelDBWrapper {
// Clears pending transactions. // Clears pending transactions.
void Clear(); void Clear();
// Returns the number of pending PUT/DELETE operations.
// Each counter counts operations independently, so operations on a key
// may be counted more than once.
int64 num_puts() { return num_puts_; }
int64 num_deletes() { return num_deletes_; }
// TODO(peria): Rename this method to GetLevelDBForTesting, after removing // TODO(peria): Rename this method to GetLevelDBForTesting, after removing
// usages of drive_backend::MigrateDatabaseFromVxToVy() under // usages of drive_backend::MigrateDatabaseFromVxToVy() under
// drive_backend_v1/. // drive_backend_v1/.
...@@ -98,6 +104,8 @@ class LevelDBWrapper { ...@@ -98,6 +104,8 @@ class LevelDBWrapper {
scoped_ptr<leveldb::DB> db_; scoped_ptr<leveldb::DB> db_;
PendingOperationMap pending_; PendingOperationMap pending_;
int64 num_puts_;
int64 num_deletes_;
DISALLOW_COPY_AND_ASSIGN(LevelDBWrapper); DISALLOW_COPY_AND_ASSIGN(LevelDBWrapper);
}; };
......
...@@ -128,6 +128,9 @@ TEST_F(LevelDBWrapperTest, IteratorTest) { ...@@ -128,6 +128,9 @@ TEST_F(LevelDBWrapperTest, IteratorTest) {
EXPECT_TRUE(itr->Valid()); EXPECT_TRUE(itr->Valid());
EXPECT_EQ("ab", itr->key().ToString()); EXPECT_EQ("ab", itr->key().ToString());
EXPECT_EQ("0", itr->value().ToString()); EXPECT_EQ("0", itr->value().ToString());
EXPECT_EQ(0, GetDB()->num_puts());
EXPECT_EQ(1, GetDB()->num_deletes());
} }
TEST_F(LevelDBWrapperTest, Iterator2Test) { TEST_F(LevelDBWrapperTest, Iterator2Test) {
...@@ -151,6 +154,9 @@ TEST_F(LevelDBWrapperTest, Iterator2Test) { ...@@ -151,6 +154,9 @@ TEST_F(LevelDBWrapperTest, Iterator2Test) {
EXPECT_EQ(3, loop_counter); EXPECT_EQ(3, loop_counter);
EXPECT_EQ("c", prev_key); EXPECT_EQ("c", prev_key);
EXPECT_EQ("3", prev_value); EXPECT_EQ("3", prev_value);
EXPECT_EQ(3, GetDB()->num_puts());
EXPECT_EQ(0, GetDB()->num_deletes());
} }
TEST_F(LevelDBWrapperTest, PutTest) { TEST_F(LevelDBWrapperTest, PutTest) {
...@@ -168,8 +174,10 @@ TEST_F(LevelDBWrapperTest, PutTest) { ...@@ -168,8 +174,10 @@ TEST_F(LevelDBWrapperTest, PutTest) {
SCOPED_TRACE("PutTest_Pending"); SCOPED_TRACE("PutTest_Pending");
CheckDBContents(merged_data, arraysize(merged_data)); CheckDBContents(merged_data, arraysize(merged_data));
EXPECT_EQ(3, GetDB()->num_puts());
// Remove all pending transactions. // Remove all pending transactions.
GetDB()->Clear(); GetDB()->Clear();
EXPECT_EQ(0, GetDB()->num_puts());
SCOPED_TRACE("PutTest_Clear"); SCOPED_TRACE("PutTest_Clear");
CheckDBContents(orig_data, arraysize(orig_data)); CheckDBContents(orig_data, arraysize(orig_data));
...@@ -178,7 +186,9 @@ TEST_F(LevelDBWrapperTest, PutTest) { ...@@ -178,7 +186,9 @@ TEST_F(LevelDBWrapperTest, PutTest) {
GetDB()->Put("aa", "new0"); GetDB()->Put("aa", "new0");
GetDB()->Put("c", "new1"); GetDB()->Put("c", "new1");
GetDB()->Put("bb", "new2"); GetDB()->Put("bb", "new2");
EXPECT_EQ(3, GetDB()->num_puts());
GetDB()->Commit(); GetDB()->Commit();
EXPECT_EQ(0, GetDB()->num_puts());
GetDB()->Clear(); // Clear just in case. GetDB()->Clear(); // Clear just in case.
SCOPED_TRACE("PutTest_Commit"); SCOPED_TRACE("PutTest_Commit");
...@@ -199,6 +209,9 @@ TEST_F(LevelDBWrapperTest, DeleteTest) { ...@@ -199,6 +209,9 @@ TEST_F(LevelDBWrapperTest, DeleteTest) {
GetDB()->Delete("c"); // Remove a pending entry. GetDB()->Delete("c"); // Remove a pending entry.
GetDB()->Delete("ab"); // Remove a committed entry. GetDB()->Delete("ab"); // Remove a committed entry.
EXPECT_EQ(3, GetDB()->num_puts());
EXPECT_EQ(2, GetDB()->num_deletes());
SCOPED_TRACE("DeleteTest_Pending"); SCOPED_TRACE("DeleteTest_Pending");
CheckDBContents(merged_data, arraysize(merged_data)); CheckDBContents(merged_data, arraysize(merged_data));
...@@ -217,6 +230,9 @@ TEST_F(LevelDBWrapperTest, DeleteTest) { ...@@ -217,6 +230,9 @@ TEST_F(LevelDBWrapperTest, DeleteTest) {
GetDB()->Commit(); GetDB()->Commit();
GetDB()->Clear(); GetDB()->Clear();
EXPECT_EQ(0, GetDB()->num_puts());
EXPECT_EQ(0, GetDB()->num_deletes());
SCOPED_TRACE("DeleteTest_Commit"); SCOPED_TRACE("DeleteTest_Commit");
CheckDBContents(merged_data, arraysize(merged_data)); CheckDBContents(merged_data, arraysize(merged_data));
} }
......
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