diff --git a/src/rootserver/ddl_task/ob_ddl_task.cpp b/src/rootserver/ddl_task/ob_ddl_task.cpp index 98fc15cb84..ea65eca935 100644 --- a/src/rootserver/ddl_task/ob_ddl_task.cpp +++ b/src/rootserver/ddl_task/ob_ddl_task.cpp @@ -3122,6 +3122,33 @@ int ObDDLTaskRecordOperator::update_parent_task_message( } else if (OB_FAIL(task.update_task_message(proxy))) { LOG_WARN("fail to update task message", K(ret), K(parent_task_id)); } + } else if (DDL_CREATE_MULTIVALUE_INDEX == task_record.ddl_type_) { + SMART_VAR(ObFtsIndexBuildTask, task) { + if (OB_FAIL(task.init(task_record))) { + LOG_WARN("fail to init ObFtsIndexBuildTask", K(ret), K(task_record)); + } else if (UPDATE_CREATE_INDEX_ID == update_type) { + if (index_schema.is_rowkey_doc_id()) { + task.set_rowkey_doc_aux_table_id(target_table_id); + task.set_rowkey_doc_aux_task_id(target_task_id); + task.set_rowkey_doc_task_submitted(true); + } else if (index_schema.is_doc_id_rowkey()) { + task.set_doc_rowkey_aux_table_id(target_table_id); + task.set_doc_rowkey_aux_task_id(target_task_id); + task.set_doc_rowkey_task_submitted(true); + } else if (index_schema.is_multivalue_index_aux()) { + task.set_fts_index_aux_table_id(target_table_id); + task.set_fts_index_aux_task_id(target_task_id); + task.set_fts_index_aux_task_submitted(true); + } + } else if (UPDATE_DROP_INDEX_TASK_ID == update_type) { + task.set_drop_index_task_id(target_task_id); + task.set_drop_index_task_submitted(true); + } + } + if (OB_FAIL(ret)) { + } else if (OB_FAIL(task.update_task_message(proxy))) { + LOG_WARN("fail to update task message", K(ret), K(parent_task_id)); + } } else { // TODO: other ddl type need to be update parent task message, now skip. } diff --git a/src/rootserver/ddl_task/ob_fts_index_build_task.cpp b/src/rootserver/ddl_task/ob_fts_index_build_task.cpp index 802bacc47f..1c6bf7a9be 100644 --- a/src/rootserver/ddl_task/ob_fts_index_build_task.cpp +++ b/src/rootserver/ddl_task/ob_fts_index_build_task.cpp @@ -112,7 +112,14 @@ int ObFtsIndexBuildTask::init( tenant_id_ = tenant_id; task_id_ = task_id; schema_version_ = schema_version; - parallelism_ = std::max(parallelism, 1L); + // temporaty disabled parallel post-build index + // do sample failed when enable + // ref: issue workItemId=2024092400104554530 + // todo yunyi, jinzhu + if (parallelism > 0) { + FLOG_INFO("post-create multivalue index or fts index, prune parallel", K(parallelism), K(task_type_)); + } + parallelism_ = 1; // std::max(parallelism, 1L); consumer_group_id_ = consumer_group_id; parent_task_id_ = parent_task_id; if (snapshot_version > 0) { @@ -1655,7 +1662,8 @@ int ObFtsIndexBuildTask::submit_drop_fts_index_task() drop_index_arg.session_id_ = data_table_schema->get_session_id(); drop_index_arg.table_name_ = data_table_schema->get_table_name(); drop_index_arg.database_name_ = database_schema->get_database_name_str(); - drop_index_arg.is_parent_task_dropping_fts_index_ = true; // if want to drop only one index, is_parent_task_dropping_fts_index_ should be false, else should be true. + drop_index_arg.is_parent_task_dropping_fts_index_ = is_fts_task(); // if want to drop only one index, is_parent_task_dropping_fts_index_ should be false, else should be true. + drop_index_arg.is_parent_task_dropping_multivalue_index_ = !is_fts_task(); if (OB_FAIL(ObDDLUtil::get_ddl_rpc_timeout(data_table_schema->get_all_part_num() + data_table_schema->get_all_part_num(), ddl_rpc_timeout))) { LOG_WARN("failed to get ddl rpc timeout", KR(ret)); } else if (OB_FAIL(DDL_SIM(tenant_id_, task_id_, DROP_INDEX_RPC_FAILED))) { @@ -1682,9 +1690,6 @@ int ObFtsIndexBuildTask::wait_drop_index_finish(bool &is_finish) LOG_WARN("task status not match", K(ret), K(task_status_)); } else if (-1 == drop_index_task_id_) { is_finish = true; - } else if (!is_rowkey_doc_succ_ && !is_doc_rowkey_succ_ && !is_fts_doc_word_succ_ && !is_domain_aux_succ_) { - is_finish = true; - LOG_WARN("all aux table not create success, needn't submit task", K(ret), K(is_fts_task()), K(*this)); } else { HEAP_VAR(ObDDLErrorMessageTableOperator::ObBuildDDLErrorMessage, error_message) { const int64_t target_object_id = -1; @@ -1710,6 +1715,7 @@ int ObFtsIndexBuildTask::wait_drop_index_finish(bool &is_finish) ret = error_message.ret_code_; drop_index_task_submitted_ = false; // retry } else { + LOG_INFO("wait drop index task finish", K(*this), K(error_message)); is_finish = true; } } diff --git a/src/rootserver/ob_index_builder.cpp b/src/rootserver/ob_index_builder.cpp index 1dddb9cb99..a743e9dab0 100644 --- a/src/rootserver/ob_index_builder.cpp +++ b/src/rootserver/ob_index_builder.cpp @@ -768,9 +768,10 @@ int ObIndexBuilder::submit_rebuild_index_task( return ret; } -int ObIndexBuilder::recognize_fts_index_schemas( +int ObIndexBuilder::recognize_fts_or_multivalue_index_schemas( const common::ObIArray &index_schemas, - const bool is_parent_task_dropping_fts_index, + const bool is_parent_task_dropping_fts, + const bool is_parent_task_dropping_multivalue, int64_t &index_ith, int64_t &aux_doc_word_ith, int64_t &aux_rowkey_doc_ith, @@ -786,7 +787,8 @@ int ObIndexBuilder::recognize_fts_index_schemas( aux_doc_rowkey_ith = -1; aux_multivalue_ith = -1; - if (OB_UNLIKELY(!is_parent_task_dropping_fts_index && 1 != index_schemas.count() && 4 != index_schemas.count() && 3 != index_schemas.count())) { + if (OB_UNLIKELY(!(is_parent_task_dropping_fts || is_parent_task_dropping_multivalue) + && 1 != index_schemas.count() && 4 != index_schemas.count() && 3 != index_schemas.count())) { ret = OB_INVALID_ARGUMENT; LOG_WARN("invalid arguments", K(ret), K(index_schemas)); } else { @@ -870,8 +872,9 @@ int ObIndexBuilder::submit_drop_index_task(ObMySQLTransaction &trans, !arg.is_vec_inner_drop_ && index_schemas.count() != VEC_INDEX_COUNT)) { ret = OB_INVALID_ARGUMENT; LOG_WARN("invalid index schema count", K(ret), K(index_schemas)); - } else if (index_schemas.at(0).is_fts_index() && OB_FAIL(recognize_fts_index_schemas(index_schemas, arg.is_parent_task_dropping_fts_index_, index_ith, aux_doc_word_ith, - aux_rowkey_doc_ith, fts_domain_index_ith, aux_doc_rowkey_ith, aux_multivalue_ith))) { + } else if (index_schemas.at(0).is_fts_index() + && OB_FAIL(recognize_fts_or_multivalue_index_schemas(index_schemas, arg.is_parent_task_dropping_fts_index_, arg.is_parent_task_dropping_multivalue_index_, + index_ith, aux_doc_word_ith, aux_rowkey_doc_ith, fts_domain_index_ith, aux_doc_rowkey_ith, aux_multivalue_ith))) { LOG_WARN("fail to recognize index and aux table from schema array", K(ret)); } else if (index_schemas.at(0).is_vec_index() && OB_FAIL(recognize_vec_index_schemas(index_schemas, arg.is_vec_inner_drop_, index_ith, vec_rowkey_vid_ith, vec_vid_rowkey_ith, vec_domain_index_ith, vec_index_id_ith, vec_snapshot_data_ith))) { diff --git a/src/rootserver/ob_index_builder.h b/src/rootserver/ob_index_builder.h index 12766f9967..10d3c402b0 100644 --- a/src/rootserver/ob_index_builder.h +++ b/src/rootserver/ob_index_builder.h @@ -121,9 +121,10 @@ private: int64_t &domain_index_ith, int64_t &index_id_ith, int64_t &snapshot_data_ith); - int recognize_fts_index_schemas( + int recognize_fts_or_multivalue_index_schemas( const common::ObIArray &index_schemas, - const bool is_parent_task_dropping_fts_index, + const bool is_parent_task_dropping_fts, + const bool is_parent_task_dropping_multivalue, int64_t &index_ith, int64_t &aux_doc_word_ith, int64_t &aux_rowkey_doc_ith, diff --git a/src/sql/code_generator/ob_dml_cg_service.cpp b/src/sql/code_generator/ob_dml_cg_service.cpp index 08f2fb7096..a4e07f62be 100644 --- a/src/sql/code_generator/ob_dml_cg_service.cpp +++ b/src/sql/code_generator/ob_dml_cg_service.cpp @@ -1135,7 +1135,8 @@ int ObDmlCgService::generate_scan_ctdef(ObLogInsert &op, scan_ctdef.vec_vid_idx_ = tsc_col_ids.count() - 1; } } else if (OB_FAIL(scan_ctdef.access_column_ids_.push_back(base_cid))) { - LOG_WARN("fail to add column id", K(ret)); + LOG_WARN("fail to add column id", K(ret), K(need_doc_id), K(need_vec_vid), K(scan_ctdef.access_column_ids_), + K(item->get_column_name()), K(item->get_alias_column_name()), K(item->get_column_id())); } } } diff --git a/src/sql/das/ob_domain_index_lookup_op.cpp b/src/sql/das/ob_domain_index_lookup_op.cpp index e1cc155942..2088a4b08d 100644 --- a/src/sql/das/ob_domain_index_lookup_op.cpp +++ b/src/sql/das/ob_domain_index_lookup_op.cpp @@ -392,10 +392,9 @@ int ObMulValueIndexLookupOp::revert_iter() { int ret = OB_SUCCESS; if (nullptr != aux_lookup_iter_) { - aux_lookup_iter_->reset(); - aux_lookup_iter_->~ObNewRowIterator(); - if (nullptr != allocator_) { - allocator_->free(aux_lookup_iter_); + ObITabletScan &tsc_service = get_tsc_service(); + if (OB_FAIL(tsc_service.revert_scan_iter(aux_lookup_iter_))) { + LOG_WARN("revert scan iterator failed", K(ret)); } aux_lookup_iter_ = nullptr; } @@ -406,7 +405,7 @@ int ObMulValueIndexLookupOp::revert_iter() aux_sorter_.clean_up(); aux_sorter_.~ObExternalSort(); - if (OB_FAIL(ObDomainIndexLookupOp::revert_iter())) { + if (OB_SUCC(ret) && OB_FAIL(ObDomainIndexLookupOp::revert_iter())) { LOG_WARN("failed to revert multivalue index lookup op iter", K(ret)); } return ret; @@ -865,9 +864,7 @@ int ObMulValueIndexLookupOp::fetch_rowkey_from_aux() int ObMulValueIndexLookupOp::reuse_scan_iter(bool need_switch_param) { int ret = OB_SUCCESS; - ObITabletScan &tsc_service = get_tsc_service(); - doc_id_scan_param_.need_switch_param_ = need_switch_param; // reset var for multi value aux_last_rowkey_.reset(); @@ -875,11 +872,17 @@ int ObMulValueIndexLookupOp::reuse_scan_iter(bool need_switch_param) if (OB_FAIL(ObDomainIndexLookupOp::reuse_scan_iter())) { LOG_WARN("failed to reuse scan iter", K(ret)); - } else if (OB_FAIL(tsc_service.reuse_scan_iter(doc_id_scan_param_.need_switch_param_, rowkey_iter_))) { + } else if (OB_FAIL(tsc_service.reuse_scan_iter(need_switch_param, rowkey_iter_))) { LOG_WARN("failed to reuse scan iter", K(ret)); - } else if (nullptr != get_aux_lookup_iter()) { - doc_id_scan_param_.key_ranges_.reuse(); - doc_id_scan_param_.ss_key_ranges_.reuse(); + } else if (OB_NOT_NULL(aux_lookup_iter_)) { + const ObTabletID &scan_tablet_id = doc_id_scan_param_.tablet_id_; + doc_id_scan_param_.need_switch_param_ = scan_tablet_id.is_valid() && scan_tablet_id != doc_id_idx_tablet_id_; + if (OB_FAIL(tsc_service.reuse_scan_iter(doc_id_scan_param_.need_switch_param_, aux_lookup_iter_))) { + LOG_WARN("failed to reuse scan iter", K(ret)); + } else { + doc_id_scan_param_.key_ranges_.reuse(); + doc_id_scan_param_.ss_key_ranges_.reuse(); + } } return ret; } diff --git a/src/sql/engine/table/ob_table_scan_op.cpp b/src/sql/engine/table/ob_table_scan_op.cpp index fd63791468..61e1df2d4f 100644 --- a/src/sql/engine/table/ob_table_scan_op.cpp +++ b/src/sql/engine/table/ob_table_scan_op.cpp @@ -3572,7 +3572,7 @@ int ObTableScanOp::inner_get_next_multivalue_index_row() } else if (OB_FAIL(multivalue_get_pure_data(domain_index_.alloc_, data, data_len, rowkey_start, rowkey_end, record_num, is_save_rowkey))) { LOG_WARN("get pure data failed", K(ret)); - } else if (record_num == 0 && is_unique_index && rowkey_start == 1) { + } else if (record_num == 0 && is_unique_index) { need_ignore_null = true; } else { uint32_t obj_idx = 0;