[vector index] fix add vector index with existing index name

This commit is contained in:
obdev 2024-09-18 06:08:22 +00:00 committed by ob-robot
parent 4b255c81eb
commit 5f44951995
3 changed files with 61 additions and 17 deletions

View File

@ -872,23 +872,29 @@ int ObIndexBuilder::do_create_local_index(
bool rowkey_vid_exist = false;
if (OB_FAIL(ret)) {
} else if (share::schema::is_vec_index(my_arg.index_type_)) {
const ObTableSchema *rowkey_vid_schema = nullptr;
if (OB_FAIL(tmp_arg.assign(my_arg))) {
LOG_WARN("fail to assign arg", K(ret));
} else if (!tmp_arg.is_valid()) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("fail to copy create index arg", K(ret));
} else if (!create_index_arg.is_rebuild_index_ &&
FALSE_IT(tmp_arg.index_type_ = INDEX_TYPE_VEC_ROWKEY_VID_LOCAL)) {
} else if (OB_FAIL(ObVecIndexBuilderUtil::generate_vec_index_name(&allocator, tmp_arg.index_type_, tmp_arg.index_name_, tmp_arg.index_name_))) {
LOG_WARN("failed to adjust vec index name", K(ret));
} else if (OB_FAIL(ddl_service_.check_aux_index_schema_exist_(tenant_id,
tmp_arg,
schema_guard,
&new_table_schema,
rowkey_vid_exist,
rowkey_vid_schema))) {
LOG_WARN("fail to check rowkey vid schema existence", K(ret));
if (OB_FAIL(ObVectorIndexUtil::check_table_exist(new_table_schema, my_arg.index_name_))) { // index_name should be domain index name, like 'idx1'
if (OB_ERR_TABLE_EXIST != ret) {
LOG_WARN("Failed to check vec table exist", K(ret), K(my_arg.index_name_));
}
} else {
const ObTableSchema *rowkey_vid_schema = nullptr;
if (OB_FAIL(tmp_arg.assign(my_arg))) {
LOG_WARN("fail to assign arg", K(ret));
} else if (!tmp_arg.is_valid()) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("fail to copy create index arg", K(ret));
} else if (!create_index_arg.is_rebuild_index_ &&
FALSE_IT(tmp_arg.index_type_ = INDEX_TYPE_VEC_ROWKEY_VID_LOCAL)) {
} else if (OB_FAIL(ObVecIndexBuilderUtil::generate_vec_index_name(&allocator, tmp_arg.index_type_, tmp_arg.index_name_, tmp_arg.index_name_))) {
LOG_WARN("failed to adjust vec index name", K(ret));
} else if (OB_FAIL(ddl_service_.check_aux_index_schema_exist_(tenant_id,
tmp_arg,
schema_guard,
&new_table_schema,
rowkey_vid_exist,
rowkey_vid_schema))) {
LOG_WARN("fail to check rowkey vid schema existence", K(ret));
}
}
}
if (OB_FAIL(ret)) {

View File

@ -831,5 +831,40 @@ int ObVectorIndexUtil::generate_index_schema_from_exist_table(
return ret;
}
int ObVectorIndexUtil::check_table_exist(
const ObTableSchema &data_table_schema,
const ObString &domain_index_name)
{
int ret = OB_SUCCESS;
ObMultiVersionSchemaService &schema_service = ObMultiVersionSchemaService::get_instance();
bool is_exist = false;
const int64_t tenant_id = data_table_schema.get_tenant_id();
const int64_t database_id = data_table_schema.get_database_id();
const int64_t data_table_id = data_table_schema.get_table_id();
ObString index_table_name;
ObArenaAllocator allocator(ObModIds::OB_SCHEMA);
if (OB_INVALID_TENANT_ID == tenant_id || OB_INVALID_ID == database_id || OB_INVALID_ID == data_table_id ||
domain_index_name.empty()) {
ret = OB_INVALID_ARGUMENT;
LOG_WARN("invalid argument", K(ret), K(tenant_id), K(database_id), K(data_table_id), K(domain_index_name));
} else if (OB_FAIL(ObTableSchema::build_index_table_name(
allocator, data_table_id, domain_index_name, index_table_name))) {
LOG_WARN("build_index_table_name failed", K(ret), K(data_table_id), K(domain_index_name));
} else if (OB_FAIL(schema_service.check_table_exist(tenant_id,
database_id,
index_table_name,
true, /* is_index_table */
OB_INVALID_VERSION, /* latest version */
is_exist))) {
LOG_WARN("failed to check is table exist", K(ret));
} else if (is_exist) {
ret = OB_ERR_TABLE_EXIST;
LOG_WARN("table is exist, cannot create it twice", K(ret),
K(tenant_id), K(database_id), K(domain_index_name));
}
return ret;
}
}
}

View File

@ -103,6 +103,9 @@ public:
static bool has_multi_index_on_same_column(
ObIArray<uint64_t> &vec_index_cols,
const uint64_t col_id);
static int check_table_exist(
const ObTableSchema &data_table_schema,
const ObString &domain_index_name);
};
// For vector index snapshot write data