150 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			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();
 | |
| }
 | 
