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() {
// update the value.
map_iterator_->second = deletion;
++(db_->num_deletes_);
AdvanceIterators();
}
......@@ -142,19 +144,20 @@ void LevelDBWrapper::Iterator::AdvanceIterators() {
// LevelDBWrapper class
// ---------------------------------------------------------------------------
LevelDBWrapper::LevelDBWrapper(scoped_ptr<leveldb::DB> db)
: db_(db.Pass()) {
: db_(db.Pass()), num_puts_(0), num_deletes_(0) {
DCHECK(db_);
}
LevelDBWrapper::~LevelDBWrapper() {}
void LevelDBWrapper::Put(const std::string& key,
const std::string& value) {
void LevelDBWrapper::Put(const std::string& key, const std::string& value) {
pending_[key] = Transaction(PUT_OPERATION, value);
++num_puts_;
}
void LevelDBWrapper::Delete(const std::string& key) {
pending_[key] = Transaction(DELETE_OPERATION, std::string());
++num_deletes_;
}
leveldb::Status LevelDBWrapper::Get(const std::string& key,
......@@ -205,6 +208,8 @@ leveldb::Status LevelDBWrapper::Commit() {
void LevelDBWrapper::Clear() {
pending_.clear();
num_puts_ = 0;
num_deletes_ = 0;
}
leveldb::DB* LevelDBWrapper::GetLevelDB() {
......
......@@ -89,6 +89,12 @@ class LevelDBWrapper {
// Clears pending transactions.
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
// usages of drive_backend::MigrateDatabaseFromVxToVy() under
// drive_backend_v1/.
......@@ -98,6 +104,8 @@ class LevelDBWrapper {
scoped_ptr<leveldb::DB> db_;
PendingOperationMap pending_;
int64 num_puts_;
int64 num_deletes_;
DISALLOW_COPY_AND_ASSIGN(LevelDBWrapper);
};
......
......@@ -128,6 +128,9 @@ TEST_F(LevelDBWrapperTest, IteratorTest) {
EXPECT_TRUE(itr->Valid());
EXPECT_EQ("ab", itr->key().ToString());
EXPECT_EQ("0", itr->value().ToString());
EXPECT_EQ(0, GetDB()->num_puts());
EXPECT_EQ(1, GetDB()->num_deletes());
}
TEST_F(LevelDBWrapperTest, Iterator2Test) {
......@@ -151,6 +154,9 @@ TEST_F(LevelDBWrapperTest, Iterator2Test) {
EXPECT_EQ(3, loop_counter);
EXPECT_EQ("c", prev_key);
EXPECT_EQ("3", prev_value);
EXPECT_EQ(3, GetDB()->num_puts());
EXPECT_EQ(0, GetDB()->num_deletes());
}
TEST_F(LevelDBWrapperTest, PutTest) {
......@@ -168,8 +174,10 @@ TEST_F(LevelDBWrapperTest, PutTest) {
SCOPED_TRACE("PutTest_Pending");
CheckDBContents(merged_data, arraysize(merged_data));
EXPECT_EQ(3, GetDB()->num_puts());
// Remove all pending transactions.
GetDB()->Clear();
EXPECT_EQ(0, GetDB()->num_puts());
SCOPED_TRACE("PutTest_Clear");
CheckDBContents(orig_data, arraysize(orig_data));
......@@ -178,7 +186,9 @@ TEST_F(LevelDBWrapperTest, PutTest) {
GetDB()->Put("aa", "new0");
GetDB()->Put("c", "new1");
GetDB()->Put("bb", "new2");
EXPECT_EQ(3, GetDB()->num_puts());
GetDB()->Commit();
EXPECT_EQ(0, GetDB()->num_puts());
GetDB()->Clear(); // Clear just in case.
SCOPED_TRACE("PutTest_Commit");
......@@ -199,6 +209,9 @@ TEST_F(LevelDBWrapperTest, DeleteTest) {
GetDB()->Delete("c"); // Remove a pending entry.
GetDB()->Delete("ab"); // Remove a committed entry.
EXPECT_EQ(3, GetDB()->num_puts());
EXPECT_EQ(2, GetDB()->num_deletes());
SCOPED_TRACE("DeleteTest_Pending");
CheckDBContents(merged_data, arraysize(merged_data));
......@@ -217,6 +230,9 @@ TEST_F(LevelDBWrapperTest, DeleteTest) {
GetDB()->Commit();
GetDB()->Clear();
EXPECT_EQ(0, GetDB()->num_puts());
EXPECT_EQ(0, GetDB()->num_deletes());
SCOPED_TRACE("DeleteTest_Commit");
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