Files
oceanbase/src/rootserver/ob_lob_meta_builder.cpp
wangzelin.wzl 93a1074b0c patch 4.0
2022-10-24 17:57:12 +08:00

172 lines
6.9 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 USING_LOG_PREFIX RS
#include "ob_lob_meta_builder.h"
#include "share/schema/ob_table_schema.h"
#include "share/ob_index_builder_util.h"
namespace oceanbase
{
using namespace common;
using namespace obrpc;
using namespace share;
using namespace share::schema;
namespace rootserver
{
ObLobMetaBuilder::ObLobMetaBuilder(ObDDLService &ddl_service)
: ddl_service_(ddl_service)
{
}
ObLobMetaBuilder::~ObLobMetaBuilder()
{
}
int ObLobMetaBuilder::generate_aux_lob_meta_schema(
ObSchemaService *schema_service,
const share::schema::ObTableSchema &data_schema,
share::schema::ObTableSchema &aux_lob_meta_schema,
bool need_generate_id)
{
int ret = OB_SUCCESS;
if (!ddl_service_.is_inited() || NULL == schema_service) {
ret = OB_INNER_STAT_ERROR;
LOG_WARN("ddl_service not init", "ddl_service inited", ddl_service_.is_inited(), K(ret));
} else if (!data_schema.is_valid()) {
ret = OB_INVALID_ARGUMENT;
LOG_WARN("invalid argument", K(data_schema), K(ret));
} else {
uint64_t new_table_id = OB_INVALID_ID;
const int64_t buf_size = 64;
char buf[buf_size];
MEMSET(buf, 0, buf_size);
int64_t pos = 0;
if (OB_FAIL(generate_schema(data_schema, aux_lob_meta_schema))) {
LOG_WARN("generate_schema for aux vp table failed", K(data_schema), K(ret));
} else if (OB_FAIL(schema_service->fetch_new_table_id(data_schema.get_tenant_id(), new_table_id))) {
LOG_WARN("failed to fetch_new_table_id", "tenant_id", data_schema.get_tenant_id(), K(ret));
} else if (OB_FAIL(generate_lob_meta_table_name(new_table_id, buf, buf_size, pos))) {
LOG_WARN("failed to generate_lob_meta_table_name", K(ret), K(new_table_id));
} else {
ObString aux_lob_meta_table_name(pos, buf);
aux_lob_meta_schema.set_table_id(new_table_id);
aux_lob_meta_schema.set_table_type(AUX_LOB_META);
if (OB_FAIL(aux_lob_meta_schema.set_table_name(aux_lob_meta_table_name))) {
LOG_WARN("set_table_name failed", K(aux_lob_meta_table_name), K(ret));
} else {
// column
int64_t column_count = aux_lob_meta_schema.get_column_count();
for (int64_t i = 0; OB_SUCC(ret) && i < column_count; ++i) {
ObColumnSchemaV2 *column = NULL;
if (NULL == (column = aux_lob_meta_schema.get_column_schema_by_idx(i))) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("column is null", K(ret));
} else {
column->set_tenant_id(aux_lob_meta_schema.get_tenant_id());
column->set_table_id(aux_lob_meta_schema.get_table_id());
}
}
}
}
if (OB_FAIL(ret)) {
} else if (data_schema.get_part_level() > 0 &&
OB_FAIL(aux_lob_meta_schema.assign_partition_schema(data_schema))) {
LOG_WARN("fail to assign partition schema", K(aux_lob_meta_schema), K(ret));
} else if (need_generate_id) {
if (OB_FAIL(ddl_service_.generate_object_id_for_partition_schema(aux_lob_meta_schema))) {
LOG_WARN("fail to fetch new object id", K(aux_lob_meta_schema), K(ret));
} else if (OB_FAIL(ddl_service_.generate_tablet_id(aux_lob_meta_schema))) {
LOG_WARN("fail to fetch new tablet id", K(aux_lob_meta_schema), K(ret));
}
}
}
return ret;
}
int ObLobMetaBuilder::generate_schema(
const share::schema::ObTableSchema &data_schema,
share::schema::ObTableSchema &aux_lob_meta_schema)
{
int ret = OB_SUCCESS;
if (OB_SUCC(ret)) {
// reuse inner lob table create schema
if (OB_FAIL(ObInnerTableSchema::all_column_aux_lob_meta_schema(aux_lob_meta_schema))) {
LOG_WARN("get lob meta schema failed", K(data_schema), K(ret));
} else if (OB_FAIL(set_basic_infos(data_schema, aux_lob_meta_schema))) {
LOG_WARN("set_basic_infos failed", K(data_schema), K(ret));
}
}
return ret;
}
int ObLobMetaBuilder::set_basic_infos(
const share::schema::ObTableSchema &data_schema,
share::schema::ObTableSchema &aux_lob_meta_schema)
{
int ret = OB_SUCCESS;
aux_lob_meta_schema.set_table_type(AUX_LOB_META);
aux_lob_meta_schema.set_data_table_id(data_schema.get_table_id());
// priority same with data table schema
aux_lob_meta_schema.set_tenant_id(data_schema.get_tenant_id());
aux_lob_meta_schema.set_database_id(data_schema.get_database_id());
aux_lob_meta_schema.set_tablegroup_id(data_schema.get_tablegroup_id());
aux_lob_meta_schema.set_load_type(data_schema.get_load_type());
aux_lob_meta_schema.set_def_type(data_schema.get_def_type());
aux_lob_meta_schema.set_charset_type(data_schema.get_charset_type());
aux_lob_meta_schema.set_collation_type(data_schema.get_collation_type());
aux_lob_meta_schema.set_row_store_type(data_schema.get_row_store_type());
aux_lob_meta_schema.set_store_format(data_schema.get_store_format());
aux_lob_meta_schema.set_part_level(data_schema.get_part_level());
if (data_schema.get_max_used_column_id() > aux_lob_meta_schema.get_max_used_column_id()) {
aux_lob_meta_schema.set_max_used_column_id(data_schema.get_max_used_column_id());
}
aux_lob_meta_schema.set_autoinc_column_id(0);
aux_lob_meta_schema.set_progressive_merge_num(data_schema.get_progressive_merge_num());
// keep the initial value for table_mode, do not get table mode from data_schema which may be hidden table
// aux_lob_meta_schema.set_table_mode(data_schema.get_table_mode());
aux_lob_meta_schema.set_block_size(data_schema.get_block_size());
aux_lob_meta_schema.set_pctfree(data_schema.get_pctfree());
aux_lob_meta_schema.set_storage_format_version(data_schema.get_storage_format_version());
aux_lob_meta_schema.set_progressive_merge_round(data_schema.get_progressive_merge_round());
if (OB_FAIL(aux_lob_meta_schema.set_compress_func_name(data_schema.get_compress_func_name()))) {
LOG_WARN("set_compress_func_name failed", K(data_schema));
}
return ret;
}
int ObLobMetaBuilder::generate_lob_meta_table_name(
const uint64_t new_table_id,
char *buf,
const int64_t buf_size,
int64_t &pos)
{
int ret = OB_SUCCESS;
// ObString aux_lob_meta_table_name构成:
// __AUX_LOB_META_<table_id>_
if (OB_ISNULL(buf) || buf_size <= 0 || pos < 0) {
ret = OB_INVALID_ARGUMENT;
LOG_WARN("invalid args", K(ret), KP(buf), K(buf_size), K(pos));
} else if ((pos = snprintf(buf, buf_size, "__AUX_LOB_META_%lu_", new_table_id)) >= buf_size || pos < 0) {
ret = common::OB_BUF_NOT_ENOUGH;
LOG_WARN("buf is not large enough", K(ret), K(buf_size), K(new_table_id));
}
return ret;
}
}//end namespace rootserver
}//end namespace oceanbase