oceanbase/unittest/storage/test_lob_common.h

429 lines
17 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.
*/
#define protected public
#define private public
#include "test_dml_common.h"
namespace oceanbase
{
namespace storage
{
class TestLobCommon
{
public:
static int create_data_tablet(
const uint64_t tenant_id,
const share::ObLSID &ls_id,
const common::ObTabletID &tablet_id,
const common::ObTabletID &lob_meta_tablet_id,
const common::ObTabletID &lob_piece_tablet_id);
static void build_data_table_schema(
const uint64_t tenant_id,
share::schema::ObTableSchema &table_schema);
static void build_lob_meta_table_schema(
const uint64_t tenant_id,
share::schema::ObTableSchema &table_schema);
static int build_lob_meta_table_scan_param(
const uint64_t tenant_id,
ObTxDesc *tx_desc,
const share::schema::ObTableParam &table_param,
ObTableScanParam &scan_param);
static void build_lob_piece_table_schema(
const uint64_t tenant_id,
share::schema::ObTableSchema &table_schema);
protected:
static int build_lob_tablet_arg(
const uint64_t tenant_id,
const share::ObLSID &ls_id,
const common::ObTabletID &data_tablet_id,
const common::ObTabletID &lob_meta_tablet_id,
const common::ObTabletID &lob_piece_tablet_id,
obrpc::ObBatchCreateTabletArg &arg);
public:
static const uint64_t TX_LOB_EXPIRE_TIME_US = 120 * 1000 * 1000; // 120s
static const int64_t TEST_LOB_LS_ID = 2;
static const uint64_t TEST_LOB_TABLE_ID = 50;
static const uint64_t TEST_LOB_META_TABLE_ID = 51;
static const uint64_t TEST_LOB_PIECE_TABLE_ID = 52;
};
int TestLobCommon::create_data_tablet(
const uint64_t tenant_id,
const share::ObLSID &ls_id,
const common::ObTabletID &tablet_id,
const common::ObTabletID &lob_meta_tablet_id,
const common::ObTabletID &lob_piece_tablet_id)
{
int ret = OB_SUCCESS;
ObLSHandle ls_handle;
obrpc::ObBatchCreateTabletArg arg;
if (OB_FAIL(TestDmlCommon::create_ls(tenant_id, ls_id, ls_handle))) {
STORAGE_LOG(WARN, "failed to create ls", K(ret), K(tenant_id), K(ls_id));
} else if (OB_FAIL(build_lob_tablet_arg(tenant_id, ls_id, tablet_id, lob_meta_tablet_id, lob_piece_tablet_id, arg))) {
STORAGE_LOG(WARN, "failed to build lob tablets arg", K(ret),
K(tenant_id), K(ls_id), K(tablet_id));
} else {
transaction::ObMulSourceDataNotifyArg trans_flags;
trans_flags.tx_id_ = 123;
trans_flags.scn_ = share::SCN::invalid_scn();
trans_flags.for_replay_ = false;
ObLS *ls = ls_handle.get_ls();
if (OB_FAIL(ls->get_tablet_svr()->on_prepare_create_tablets(arg, trans_flags))) {
STORAGE_LOG(WARN, "failed to prepare create tablets", K(ret), K(arg));
} else if (FALSE_IT(trans_flags.scn_ = share::SCN::minus(share::SCN::max_scn(), 100))) {
} else if (OB_FAIL(ls->get_tablet_svr()->on_redo_create_tablets(arg, trans_flags))) {
STORAGE_LOG(WARN, "failed to redo create tablets", K(ret), K(arg));
} else if (FALSE_IT(trans_flags.scn_ = share::SCN::plus(trans_flags.scn_, 1))) {
} else if (OB_FAIL(ls->get_tablet_svr()->on_tx_end_create_tablets(arg, trans_flags))) {
STORAGE_LOG(WARN, "failed to tx end create tablets", K(ret), K(arg));
} else if (FALSE_IT(trans_flags.scn_ = share::SCN::plus(trans_flags.scn_, 1))) {
} else if (OB_FAIL(ls->get_tablet_svr()->on_commit_create_tablets(arg, trans_flags))) {
STORAGE_LOG(WARN, "failed to commit create tablets", K(ret), K(arg));
}
}
return ret;
}
void TestLobCommon::build_data_table_schema(
const uint64_t tenant_id,
share::schema::ObTableSchema &table_schema)
{
const uint64_t table_id = TEST_LOB_TABLE_ID;
const int64_t micro_block_size = 16 * 1024;
table_schema.reset();
table_schema.set_table_name("test_lob_common");
table_schema.set_tenant_id(tenant_id);
table_schema.set_tablegroup_id(1);
table_schema.set_database_id(1);
table_schema.set_table_id(table_id);
table_schema.set_schema_version(share::OB_CORE_SCHEMA_VERSION + 1);
table_schema.set_rowkey_column_num(1);
table_schema.set_max_used_column_id(ObObjType::ObExtendType - 1);
table_schema.set_block_size(micro_block_size);
table_schema.set_compress_func_name("none");
table_schema.set_row_store_type(ObRowStoreType::ENCODING_ROW_STORE);
table_schema.set_storage_format_version(ObStorageFormatVersion::OB_STORAGE_FORMAT_VERSION_V4);
#define ADD_COLUMN(column_id, column_name, data_type, collation_type, is_row_key) \
{ \
ObColumnSchemaV2 column; \
column.set_tenant_id(tenant_id); \
column.set_column_id(column_id); \
column.set_column_name(column_name); \
column.set_data_type(data_type); \
column.set_collation_type(collation_type); \
if (is_row_key) { \
column.set_rowkey_position(1); \
} \
table_schema.add_column(column); \
}
// table schema
// a(bigint) b(bigint) c(bigint) d(longtext) e(varchar)
ADD_COLUMN(OB_APP_MIN_COLUMN_ID + 0, "a", ObIntType, CS_TYPE_UTF8MB4_GENERAL_CI, true);
ADD_COLUMN(OB_APP_MIN_COLUMN_ID + 1, "b", ObIntType, CS_TYPE_UTF8MB4_GENERAL_CI, false);
ADD_COLUMN(OB_APP_MIN_COLUMN_ID + 2, "c", ObIntType, CS_TYPE_UTF8MB4_GENERAL_CI, false);
ADD_COLUMN(OB_APP_MIN_COLUMN_ID + 3, "d", ObLongTextType, CS_TYPE_UTF8MB4_BIN, false);
ADD_COLUMN(OB_APP_MIN_COLUMN_ID + 4, "e", ObVarcharType, CS_TYPE_UTF8MB4_BIN, false);
#undef ADD_COLUMN
}
void TestLobCommon::build_lob_meta_table_schema(
const uint64_t tenant_id,
share::schema::ObTableSchema &table_schema)
{
const uint64_t data_table_id = TEST_LOB_TABLE_ID;
const uint64_t lob_meta_table_id = TEST_LOB_META_TABLE_ID;
const int64_t micro_block_size = 16 * 1024;
table_schema.reset();
table_schema.set_table_name("test_lob_meta_common");
table_schema.set_tenant_id(tenant_id);
table_schema.set_tablegroup_id(1);
table_schema.set_database_id(1);
table_schema.set_data_table_id(data_table_id);
table_schema.set_table_id(lob_meta_table_id);
table_schema.set_table_type(AUX_LOB_META);
table_schema.set_schema_version(share::OB_CORE_SCHEMA_VERSION + 1);
table_schema.set_rowkey_column_num(2);
table_schema.set_max_used_column_id(ObObjType::ObExtendType - 1);
table_schema.set_block_size(micro_block_size);
table_schema.set_compress_func_name("none");
table_schema.set_row_store_type(ObRowStoreType::ENCODING_ROW_STORE);
table_schema.set_storage_format_version(ObStorageFormatVersion::OB_STORAGE_FORMAT_VERSION_V4);
// add lob_id
{
ObColumnSchemaV2 lob_id_col;
lob_id_col.set_tenant_id(tenant_id);
lob_id_col.set_column_id(common::OB_APP_MIN_COLUMN_ID);
lob_id_col.set_column_name("lob_id");
lob_id_col.set_rowkey_position(1);
lob_id_col.set_data_type(ObVarcharType);
lob_id_col.set_collation_type(CS_TYPE_BINARY);
lob_id_col.set_data_length(sizeof(ObLobId));
table_schema.add_column(lob_id_col);
}
// seq_id
{
ObColumnSchemaV2 seq_id_col;
seq_id_col.set_tenant_id(tenant_id);
seq_id_col.set_column_id(common::OB_APP_MIN_COLUMN_ID + 1);
seq_id_col.set_column_name("seq_id");
seq_id_col.set_rowkey_position(2); // set
seq_id_col.set_data_type(ObVarcharType);
seq_id_col.set_collation_type(CS_TYPE_BINARY);
seq_id_col.set_data_length(8192);
table_schema.add_column(seq_id_col);
}
// bin_len
{
ObColumnSchemaV2 bin_len_col;
bin_len_col.set_tenant_id(tenant_id);
bin_len_col.set_column_id(common::OB_APP_MIN_COLUMN_ID + 2);
bin_len_col.set_column_name("binary_len");
bin_len_col.set_data_type(ObUInt32Type);
bin_len_col.set_collation_type(CS_TYPE_UTF8MB4_GENERAL_CI);
table_schema.add_column(bin_len_col);
}
// char_len
{
ObColumnSchemaV2 char_len_col;
char_len_col.set_tenant_id(tenant_id);
char_len_col.set_column_id(common::OB_APP_MIN_COLUMN_ID + 3);
char_len_col.set_column_name("char_len");
char_len_col.set_data_type(ObUInt32Type);
char_len_col.set_collation_type(CS_TYPE_UTF8MB4_GENERAL_CI);
table_schema.add_column(char_len_col);
}
// piece_id
{
ObColumnSchemaV2 piece_id_col;
piece_id_col.set_tenant_id(tenant_id);
piece_id_col.set_column_id(common::OB_APP_MIN_COLUMN_ID + 4);
piece_id_col.set_column_name("piece_id");
piece_id_col.set_data_type(ObUInt64Type);
piece_id_col.set_collation_type(CS_TYPE_UTF8MB4_GENERAL_CI);
table_schema.add_column(piece_id_col);
}
// seq_id
{
ObColumnSchemaV2 lob_data_col;
lob_data_col.set_tenant_id(tenant_id);
lob_data_col.set_column_id(common::OB_APP_MIN_COLUMN_ID + 5);
lob_data_col.set_column_name("lob_data");
lob_data_col.set_data_type(ObVarcharType);
lob_data_col.set_collation_type(CS_TYPE_BINARY);
lob_data_col.set_data_length(256*1024); // TODO 16k is too big?
table_schema.add_column(lob_data_col);
}
}
void TestLobCommon::build_lob_piece_table_schema(
const uint64_t tenant_id,
share::schema::ObTableSchema &table_schema)
{
const uint64_t data_table_id = TEST_LOB_TABLE_ID;
const uint64_t lob_piece_table_id = TEST_LOB_PIECE_TABLE_ID;
const int64_t micro_block_size = 16 * 1024;
table_schema.reset();
table_schema.set_table_name("test_lob_piece_common");
table_schema.set_tenant_id(tenant_id);
table_schema.set_tablegroup_id(1);
table_schema.set_database_id(1);
table_schema.set_data_table_id(data_table_id);
table_schema.set_table_id(lob_piece_table_id);
table_schema.set_table_type(AUX_LOB_PIECE);
table_schema.set_schema_version(share::OB_CORE_SCHEMA_VERSION + 1);
table_schema.set_rowkey_column_num(1);
table_schema.set_max_used_column_id(ObObjType::ObExtendType - 1);
table_schema.set_block_size(micro_block_size);
table_schema.set_compress_func_name("none");
table_schema.set_row_store_type(ObRowStoreType::ENCODING_ROW_STORE);
table_schema.set_storage_format_version(ObStorageFormatVersion::OB_STORAGE_FORMAT_VERSION_V4);
// add piece_id
{
ObColumnSchemaV2 piece_id_col;
piece_id_col.set_tenant_id(tenant_id);
piece_id_col.set_column_id(common::OB_APP_MIN_COLUMN_ID);
piece_id_col.set_column_name("piece_id");
piece_id_col.set_rowkey_position(1);
piece_id_col.set_order_in_rowkey(ObOrderType::ASC);
piece_id_col.set_data_type(ObUInt64Type);
piece_id_col.set_collation_type(CS_TYPE_UTF8MB4_GENERAL_CI);
table_schema.add_column(piece_id_col);
}
// len
{
ObColumnSchemaV2 len_col;
len_col.set_tenant_id(tenant_id);
len_col.set_column_id(common::OB_APP_MIN_COLUMN_ID + 1);
len_col.set_column_name("len");
len_col.set_data_type(ObUInt32Type);
len_col.set_collation_type(CS_TYPE_UTF8MB4_GENERAL_CI);
table_schema.add_column(len_col);
}
// Macro_id
{
ObColumnSchemaV2 lob_data_col;
lob_data_col.set_tenant_id(tenant_id);
lob_data_col.set_column_id(common::OB_APP_MIN_COLUMN_ID + 2);
lob_data_col.set_column_name("macro_id");
// data_len_col.set_rowkey_position(1);
// lob_data_col.set_order_in_rowkey(ObOrderType::ASC);
// lob_data_col.set_data_length(100);
lob_data_col.set_data_type(ObVarcharType);
lob_data_col.set_collation_type(CS_TYPE_BINARY);
lob_data_col.set_data_length(100); // TODO sizeof(MacroBlockId)
table_schema.add_column(lob_data_col);
}
}
int TestLobCommon::build_lob_tablet_arg(
const uint64_t tenant_id,
const share::ObLSID &ls_id,
const common::ObTabletID &data_tablet_id,
const common::ObTabletID &lob_meta_tablet_id,
const common::ObTabletID &lob_piece_tablet_id,
obrpc::ObBatchCreateTabletArg &arg)
{
int ret = OB_SUCCESS;
ObCreateTabletInfo tablet_info;
ObArray<common::ObTabletID> tablet_id_array;
ObArray<int64_t> tablet_schema_index_array;
share::schema::ObTableSchema table_schema;
build_data_table_schema(tenant_id, table_schema);
share::schema::ObTableSchema lob_meta_schema;
build_lob_meta_table_schema(tenant_id, lob_meta_schema);
share::schema::ObTableSchema lob_piece_schema;
build_lob_piece_table_schema(tenant_id, lob_piece_schema);
arg.reset();
if (OB_FAIL(tablet_id_array.push_back(data_tablet_id))) {
STORAGE_LOG(WARN, "failed to push tablet id into array", K(ret), K(data_tablet_id));
} else if (OB_FAIL(tablet_id_array.push_back(lob_meta_tablet_id))) {
STORAGE_LOG(WARN, "failed to push lob meta tablet id into array", K(ret), K(lob_meta_tablet_id));
} else if (OB_FAIL(tablet_id_array.push_back(lob_piece_tablet_id))) {
STORAGE_LOG(WARN, "failed to push lob meta tablet id into array", K(ret), K(lob_meta_tablet_id));
} else if (OB_FAIL(tablet_schema_index_array.push_back(0))) {
STORAGE_LOG(WARN, "failed to push index into array", K(ret));
} else if (OB_FAIL(tablet_schema_index_array.push_back(1))) {
STORAGE_LOG(WARN, "failed to push index into array", K(ret));
} else if (OB_FAIL(tablet_schema_index_array.push_back(2))) {
STORAGE_LOG(WARN, "failed to push index into array", K(ret));
} else if (OB_FAIL(tablet_info.init(tablet_id_array, data_tablet_id, tablet_schema_index_array,
lib::get_compat_mode(), false/*is_create_bind_hidden_tablets*/))) {
STORAGE_LOG(WARN, "failed to init tablet info", K(ret), K(tablet_id_array),
K(data_tablet_id), K(tablet_schema_index_array));
} else if (OB_FAIL(arg.init_create_tablet(ls_id, share::SCN::min_scn(), false/*need_check_tablet_cnt*/))) {
STORAGE_LOG(WARN, "failed to init create tablet", K(ret), K(tenant_id), K(ls_id));
} else if (OB_FAIL(arg.table_schemas_.push_back(table_schema))) {
STORAGE_LOG(WARN, "failed to push back table schema", K(ret), K(table_schema));
} else if (OB_FAIL(arg.table_schemas_.push_back(lob_meta_schema))) {
STORAGE_LOG(WARN, "failed to push back lob meta table schema", K(ret), K(lob_meta_schema));
} else if (OB_FAIL(arg.table_schemas_.push_back(lob_piece_schema))) {
STORAGE_LOG(WARN, "failed to push back lob meta table schema", K(ret), K(lob_piece_schema));
} else if (OB_FAIL(arg.tablets_.push_back(tablet_info))) {
STORAGE_LOG(WARN, "failed to push back tablet info", K(ret), K(tablet_info));
}
if (OB_FAIL(ret)) {
arg.reset();
}
return ret;
}
int TestLobCommon::build_lob_meta_table_scan_param(
const uint64_t tenant_id,
ObTxDesc *tx_desc,
const share::schema::ObTableParam &table_param,
ObTableScanParam &scan_param)
{
int ret = OB_SUCCESS;
int64_t expire_time = ObTimeUtility::current_time() + TX_LOB_EXPIRE_TIME_US;
const uint64_t table_id = TEST_LOB_META_TABLE_ID;
for (int i = 0; i < ObLobMetaUtil::LOB_META_COLUMN_CNT; i++) {
scan_param.column_ids_.push_back(OB_APP_MIN_COLUMN_ID + i);
}
//scan_param.pkey_.part_id_ = share::ObLSID::SYS_LS_ID;
//scan_param.pkey_.table_id_ = table_id;
//scan_param.pkey_.assit_id_ = 0;
scan_param.ls_id_ = TestDmlCommon::TEST_LS_ID;
scan_param.tablet_id_ = TEST_LOB_META_TABLE_ID;
scan_param.trans_desc_ = tx_desc;
scan_param.table_param_ = &table_param;
//scan_param.ref_table_id_ = table_id; // main table id
scan_param.index_id_ = table_id; // table id
scan_param.is_get_ = false;
scan_param.timeout_ = expire_time;
ObQueryFlag query_flag(ObQueryFlag::Forward, // scan_order
false, // daily_merge
false, // optimize
false, // sys scan
false, // full_row
false, // index_back
false, // query_stat
ObQueryFlag::MysqlMode, // sql_mode
true // read_latest
);
scan_param.scan_flag_.flag_ = query_flag.flag_;
scan_param.reserved_cell_count_ = scan_param.column_ids_.count();
scan_param.allocator_ = &CURRENT_CONTEXT->get_arena_allocator();
scan_param.for_update_ = false;
scan_param.for_update_wait_timeout_ = expire_time;
scan_param.sql_mode_ = SMO_DEFAULT;
scan_param.scan_allocator_ = &CURRENT_CONTEXT->get_arena_allocator();
scan_param.frozen_version_ = -1;
scan_param.force_refresh_lc_ = false;
scan_param.output_exprs_ = nullptr;
scan_param.aggregate_exprs_ = nullptr;
scan_param.op_ = nullptr;
scan_param.row2exprs_projector_ = nullptr;
scan_param.schema_version_ = share::OB_CORE_SCHEMA_VERSION + 1;
scan_param.limit_param_.limit_ = -1;
scan_param.limit_param_.offset_ = 0;
scan_param.need_scn_ = false;
scan_param.pd_storage_flag_ = false;
scan_param.fb_snapshot_.reset();
ObNewRange range;
range.table_id_ = table_id;
range.start_key_.set_min_row();
range.end_key_.set_max_row();
scan_param.key_ranges_.push_back(range);
return ret;
}
} // storage
} // oceanbase