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();
 | 
						|
}
 |