Summary: Move in-place-update related tests from db_test.cc to db_inplace_update_test.cc Test Plan: db_test db_inplace_update_test Reviewers: igor, anthony, IslamAbdelRahman, sdong Reviewed By: sdong Subscribers: dhruba Differential Revision: https://reviews.facebook.net/D42657main
parent
03467bdd4d
commit
7462286d33
@ -0,0 +1,171 @@ |
|||||||
|
// Copyright (c) 2013, Facebook, Inc. All rights reserved.
|
||||||
|
// This source code is licensed under the BSD-style license found in the
|
||||||
|
// LICENSE file in the root directory of this source tree. An additional grant
|
||||||
|
// of patent rights can be found in the PATENTS file in the same directory.
|
||||||
|
//
|
||||||
|
// Copyright (c) 2011 The LevelDB Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
|
// found in the LICENSE file. See the AUTHORS file for names of contributors.
|
||||||
|
#include "port/stack_trace.h" |
||||||
|
#include "util/db_test_util.h" |
||||||
|
|
||||||
|
namespace rocksdb { |
||||||
|
|
||||||
|
class DBTestInPlaceUpdate : public DBTestBase { |
||||||
|
public: |
||||||
|
DBTestInPlaceUpdate() : DBTestBase("/db_inplace_update_test") {} |
||||||
|
}; |
||||||
|
|
||||||
|
TEST_F(DBTestInPlaceUpdate, InPlaceUpdate) { |
||||||
|
do { |
||||||
|
Options options; |
||||||
|
options.create_if_missing = true; |
||||||
|
options.inplace_update_support = true; |
||||||
|
options.env = env_; |
||||||
|
options.write_buffer_size = 100000; |
||||||
|
options = CurrentOptions(options); |
||||||
|
CreateAndReopenWithCF({"pikachu"}, options); |
||||||
|
|
||||||
|
// Update key with values of smaller size
|
||||||
|
int numValues = 10; |
||||||
|
for (int i = numValues; i > 0; i--) { |
||||||
|
std::string value = DummyString(i, 'a'); |
||||||
|
ASSERT_OK(Put(1, "key", value)); |
||||||
|
ASSERT_EQ(value, Get(1, "key")); |
||||||
|
} |
||||||
|
|
||||||
|
// Only 1 instance for that key.
|
||||||
|
validateNumberOfEntries(1, 1); |
||||||
|
} while (ChangeCompactOptions()); |
||||||
|
} |
||||||
|
|
||||||
|
TEST_F(DBTestInPlaceUpdate, InPlaceUpdateLargeNewValue) { |
||||||
|
do { |
||||||
|
Options options; |
||||||
|
options.create_if_missing = true; |
||||||
|
options.inplace_update_support = true; |
||||||
|
options.env = env_; |
||||||
|
options.write_buffer_size = 100000; |
||||||
|
options = CurrentOptions(options); |
||||||
|
CreateAndReopenWithCF({"pikachu"}, options); |
||||||
|
|
||||||
|
// Update key with values of larger size
|
||||||
|
int numValues = 10; |
||||||
|
for (int i = 0; i < numValues; i++) { |
||||||
|
std::string value = DummyString(i, 'a'); |
||||||
|
ASSERT_OK(Put(1, "key", value)); |
||||||
|
ASSERT_EQ(value, Get(1, "key")); |
||||||
|
} |
||||||
|
|
||||||
|
// All 10 updates exist in the internal iterator
|
||||||
|
validateNumberOfEntries(numValues, 1); |
||||||
|
} while (ChangeCompactOptions()); |
||||||
|
} |
||||||
|
|
||||||
|
TEST_F(DBTestInPlaceUpdate, InPlaceUpdateCallbackSmallerSize) { |
||||||
|
do { |
||||||
|
Options options; |
||||||
|
options.create_if_missing = true; |
||||||
|
options.inplace_update_support = true; |
||||||
|
|
||||||
|
options.env = env_; |
||||||
|
options.write_buffer_size = 100000; |
||||||
|
options.inplace_callback = |
||||||
|
rocksdb::DBTestInPlaceUpdate::updateInPlaceSmallerSize; |
||||||
|
options = CurrentOptions(options); |
||||||
|
CreateAndReopenWithCF({"pikachu"}, options); |
||||||
|
|
||||||
|
// Update key with values of smaller size
|
||||||
|
int numValues = 10; |
||||||
|
ASSERT_OK(Put(1, "key", DummyString(numValues, 'a'))); |
||||||
|
ASSERT_EQ(DummyString(numValues, 'c'), Get(1, "key")); |
||||||
|
|
||||||
|
for (int i = numValues; i > 0; i--) { |
||||||
|
ASSERT_OK(Put(1, "key", DummyString(i, 'a'))); |
||||||
|
ASSERT_EQ(DummyString(i - 1, 'b'), Get(1, "key")); |
||||||
|
} |
||||||
|
|
||||||
|
// Only 1 instance for that key.
|
||||||
|
validateNumberOfEntries(1, 1); |
||||||
|
} while (ChangeCompactOptions()); |
||||||
|
} |
||||||
|
|
||||||
|
TEST_F(DBTestInPlaceUpdate, InPlaceUpdateCallbackSmallerVarintSize) { |
||||||
|
do { |
||||||
|
Options options; |
||||||
|
options.create_if_missing = true; |
||||||
|
options.inplace_update_support = true; |
||||||
|
|
||||||
|
options.env = env_; |
||||||
|
options.write_buffer_size = 100000; |
||||||
|
options.inplace_callback = |
||||||
|
rocksdb::DBTestInPlaceUpdate::updateInPlaceSmallerVarintSize; |
||||||
|
options = CurrentOptions(options); |
||||||
|
CreateAndReopenWithCF({"pikachu"}, options); |
||||||
|
|
||||||
|
// Update key with values of smaller varint size
|
||||||
|
int numValues = 265; |
||||||
|
ASSERT_OK(Put(1, "key", DummyString(numValues, 'a'))); |
||||||
|
ASSERT_EQ(DummyString(numValues, 'c'), Get(1, "key")); |
||||||
|
|
||||||
|
for (int i = numValues; i > 0; i--) { |
||||||
|
ASSERT_OK(Put(1, "key", DummyString(i, 'a'))); |
||||||
|
ASSERT_EQ(DummyString(1, 'b'), Get(1, "key")); |
||||||
|
} |
||||||
|
|
||||||
|
// Only 1 instance for that key.
|
||||||
|
validateNumberOfEntries(1, 1); |
||||||
|
} while (ChangeCompactOptions()); |
||||||
|
} |
||||||
|
|
||||||
|
TEST_F(DBTestInPlaceUpdate, InPlaceUpdateCallbackLargeNewValue) { |
||||||
|
do { |
||||||
|
Options options; |
||||||
|
options.create_if_missing = true; |
||||||
|
options.inplace_update_support = true; |
||||||
|
|
||||||
|
options.env = env_; |
||||||
|
options.write_buffer_size = 100000; |
||||||
|
options.inplace_callback = |
||||||
|
rocksdb::DBTestInPlaceUpdate::updateInPlaceLargerSize; |
||||||
|
options = CurrentOptions(options); |
||||||
|
CreateAndReopenWithCF({"pikachu"}, options); |
||||||
|
|
||||||
|
// Update key with values of larger size
|
||||||
|
int numValues = 10; |
||||||
|
for (int i = 0; i < numValues; i++) { |
||||||
|
ASSERT_OK(Put(1, "key", DummyString(i, 'a'))); |
||||||
|
ASSERT_EQ(DummyString(i, 'c'), Get(1, "key")); |
||||||
|
} |
||||||
|
|
||||||
|
// No inplace updates. All updates are puts with new seq number
|
||||||
|
// All 10 updates exist in the internal iterator
|
||||||
|
validateNumberOfEntries(numValues, 1); |
||||||
|
} while (ChangeCompactOptions()); |
||||||
|
} |
||||||
|
|
||||||
|
TEST_F(DBTestInPlaceUpdate, InPlaceUpdateCallbackNoAction) { |
||||||
|
do { |
||||||
|
Options options; |
||||||
|
options.create_if_missing = true; |
||||||
|
options.inplace_update_support = true; |
||||||
|
|
||||||
|
options.env = env_; |
||||||
|
options.write_buffer_size = 100000; |
||||||
|
options.inplace_callback = |
||||||
|
rocksdb::DBTestInPlaceUpdate::updateInPlaceNoAction; |
||||||
|
options = CurrentOptions(options); |
||||||
|
CreateAndReopenWithCF({"pikachu"}, options); |
||||||
|
|
||||||
|
// Callback function requests no actions from db
|
||||||
|
ASSERT_OK(Put(1, "key", DummyString(1, 'a'))); |
||||||
|
ASSERT_EQ(Get(1, "key"), "NOT_FOUND"); |
||||||
|
} while (ChangeCompactOptions()); |
||||||
|
} |
||||||
|
} // namespace rocksdb
|
||||||
|
|
||||||
|
int main(int argc, char** argv) { |
||||||
|
rocksdb::port::InstallStackTraceHandler(); |
||||||
|
::testing::InitGoogleTest(&argc, argv); |
||||||
|
return RUN_ALL_TESTS(); |
||||||
|
} |
Loading…
Reference in new issue