oceanbase/unittest/storage/memtable/test_memtable_mutator.cpp
wangzelin.wzl 93a1074b0c patch 4.0
2022-10-24 17:57:12 +08:00

150 lines
4.3 KiB
C++

/**
* Copyright (c) 2021 OceanBase
* OceanBase CE is licensed under Mulan PubL v2.
* You can use this software according to the terms and conditions of the Mulan PubL v2.
* You may obtain a copy of Mulan PubL v2 at:
* http://license.coscl.org.cn/MulanPubL-2.0
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PubL v2 for more details.
*/
#include "storage/memtable/ob_memtable_mutator.h"
#include "lib/allocator/page_arena.h"
#include "utils_rowkey_builder.h"
#include <gtest/gtest.h>
namespace oceanbase
{
namespace unittest
{
using namespace oceanbase::common;
using namespace oceanbase::memtable;
TEST(TestObMemtableMutator, smoke_test)
{
static const int64_t BUFFER_SIZE = 1L<<21;
static const int64_t INIT_POS_SIZE = 1L<<19;
ObMemtableMutatorWriter mmw;
ObMemtableMutatorIterator mmi;
int ret = OB_SUCCESS;
char *buffer = new char[BUFFER_SIZE];
memset(buffer, '$', INIT_POS_SIZE);
buffer[1] = '\0';
mmw.set_buffer(buffer + INIT_POS_SIZE, BUFFER_SIZE - INIT_POS_SIZE);
ObRowData new_row;
ObRowData old_row;
new_row.set(buffer, INIT_POS_SIZE);
RK rk1(
V("hello", 5),
V(NULL, 0),
I(1024),
N("3.14")
);
RK rk2(
V("world", 5),
V(NULL, 0),
I(1024),
N("3.14")
);
ret = mmw.append_kv(1001, rk1.get_rowkey(), 1, 1, new_row, old_row, storage::T_DML_INSERT, 1, 0, 1);
EXPECT_EQ(OB_SUCCESS, ret);
ret = mmw.append_kv(1002, rk2.get_rowkey(), 2, 2, new_row, old_row, storage::T_DML_UPDATE, 2, 0, 1);
EXPECT_EQ(OB_SUCCESS, ret);
ret = mmw.append_kv(1002, rk2.get_rowkey(), 2, 2, new_row, old_row, storage::T_DML_DELETE, 3, 0, 1);
EXPECT_EQ(OB_BUF_NOT_ENOUGH, ret);
int64_t res_len = 0;
ret = mmw.serialize(0, res_len);
EXPECT_EQ(OB_SUCCESS, ret);
EXPECT_LT(1024, res_len);
int64_t res_pos = 0;
ret = mmi.deserialize(buffer + INIT_POS_SIZE, res_len, res_pos);
EXPECT_EQ(OB_SUCCESS, ret);
ObRowData got_row;
uint64_t index_id = 0;
ObStoreRowkey rowkey;
int64_t schema_version = 0;
storage::ObRowDml dml_type = storage::T_DML_UNKNOWN;
uint32_t modify_count = 0;
uint32_t acc_checksum = 0;
int64_t memtable_version = 0;
ret = mmi.get_next_row(index_id, rowkey, schema_version, got_row, dml_type, modify_count, acc_checksum, memtable_version);
EXPECT_EQ(OB_SUCCESS, ret);
EXPECT_EQ(1001UL, index_id);
EXPECT_EQ(rk1.get_rowkey(), rowkey);
EXPECT_EQ(1, schema_version);
EXPECT_EQ(got_row, new_row);
EXPECT_EQ(storage::T_DML_INSERT, dml_type);
EXPECT_EQ(1U, modify_count);
ret = mmi.get_next_row(index_id, rowkey, schema_version, got_row, dml_type, modify_count, acc_checksum, memtable_version);
EXPECT_EQ(OB_SUCCESS, ret);
EXPECT_EQ(1002UL, index_id);
EXPECT_EQ(rk2.get_rowkey(), rowkey);
EXPECT_EQ(2, schema_version);
EXPECT_EQ(got_row, new_row);
EXPECT_EQ(storage::T_DML_UPDATE, dml_type);
EXPECT_EQ(2U, modify_count);
ret = mmi.get_next_row(index_id, rowkey, schema_version, got_row, dml_type, modify_count, acc_checksum, memtable_version);
EXPECT_EQ(OB_ITER_END, ret);
ObMemtableMutatorIterator mmi_row;
ObMemtableMutatorRow row;
res_pos = 0;
ret = mmi_row.deserialize(buffer + INIT_POS_SIZE, res_len, res_pos);
EXPECT_EQ(OB_SUCCESS, ret);
ret = mmi_row.get_next_row(row);
EXPECT_EQ(OB_SUCCESS, ret);
EXPECT_EQ(1001UL, row.table_id_);
EXPECT_EQ(rk1.get_rowkey(), row.rowkey_);
EXPECT_EQ(new_row, row.new_row_);
EXPECT_TRUE(ObDmlFlag::DF_INSERT == row.dml_flag_);
EXPECT_EQ(1U, row.update_seq_);
row.reset();
ret = mmi_row.get_next_row(row);
EXPECT_EQ(OB_SUCCESS, ret);
EXPECT_EQ(1002UL, row.table_id_);
EXPECT_EQ(rk2.get_rowkey(), row.rowkey_);
EXPECT_EQ(new_row, row.new_row_);
EXPECT_TRUE(ObDmlFlag::DF_UPDATE == row.dml_flag_);
EXPECT_EQ(2U, row.update_seq_);
row.reset();
EXPECT_TRUE(mmi_row.is_iter_end());
ret = mmi_row.get_next_row(row);
EXPECT_EQ(OB_ITER_END, ret);
delete[] buffer;
buffer = NULL;
}
}
}
int main(int argc, char **argv)
{
//oceanbase::common::ObLogger::get_logger().set_file_name("test_memtable_mutator.log", true);
oceanbase::common::ObLogger::get_logger().set_log_level("INFO");
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}