@@ -179,6 +179,7 @@ int ObDropVecIndexTask::obtain_snapshot(const share::ObDDLTaskStatus next_task_s
179179{
180180 int ret = OB_SUCCESS ;
181181 bool state_finished = false ;
182+ bool is_snapshot_table_exist = true ;
182183 ObDDLTaskStatus old_status = task_status_;
183184 if (OB_UNLIKELY (!is_inited_)) {
184185 ret = OB_NOT_INIT ;
@@ -195,13 +196,34 @@ int ObDropVecIndexTask::obtain_snapshot(const share::ObDDLTaskStatus next_task_s
195196 if (OB_FAIL (switch_status (next_task_status, true , ret))) {
196197 LOG_WARN (" fail to switch task status" , K (ret), K (next_task_status));
197198 }
198- } else if (OB_FAIL (ObDDLUtil::obtain_snapshot (next_task_status, vec_index_snapshot_data_.table_id_ ,
199- vec_index_snapshot_data_.table_id_ , snapshot_version_,
200- this ))) {
201- LOG_WARN (" fail to obtain_snapshot" , K (ret), K (snapshot_version_));
202- } else {
203- state_finished = true ;
199+ } else if (OB_FAIL (check_snapshot_table_exist (is_snapshot_table_exist))) {
200+ LOG_WARN (" fail to check snapshot table exist" , K (ret));
201+ }
202+
203+ // skip and success,switch to DROP_AUX_INDEX_TABLE
204+ if (OB_SUCC (ret) && !state_finished) {
205+ if (!is_snapshot_table_exist) { // snapshot table not exist, skip obtain snapshot
206+ if (OB_FAIL (switch_status (ObDDLTaskStatus::DROP_AUX_INDEX_TABLE , true , ret))) {
207+ LOG_WARN (" fail to switch task status when skip obtain snapshot" , K (ret));
208+ } else {
209+ state_finished = true ;
210+ }
211+ } else if (OB_FAIL (ObDDLUtil::obtain_snapshot (next_task_status,
212+ vec_index_snapshot_data_.table_id_ ,
213+ vec_index_snapshot_data_.table_id_ ,
214+ snapshot_version_,
215+ this ))) {
216+ LOG_WARN (" fail to obtain_snapshot" , K (ret), K (snapshot_version_));
217+ } else if (snapshot_version_ <= 0 ) {
218+ ret = OB_ERR_UNEXPECTED ;
219+ LOG_WARN (" snapshot version is invalid" , K (ret), K (snapshot_version_));
220+ } else if (OB_FAIL (update_task_message ())) {
221+ LOG_WARN (" fail to snapshot_version_ to __all_ddl_task_status" , K (ret));
222+ } else {
223+ state_finished = true ;
224+ }
204225 }
226+
205227#ifdef ERRSIM
206228 if (OB_SUCC (ret)) {
207229 ret = OB_E (common::EventTable::EN_VEC_INDEX_OBTAIN_SNAPSHOT_ERR ) OB_SUCCESS ;
@@ -210,6 +232,7 @@ int ObDropVecIndexTask::obtain_snapshot(const share::ObDDLTaskStatus next_task_s
210232 }
211233 }
212234#endif
235+
213236 if (state_finished && OB_SUCC (ret)) {
214237 LOG_INFO (" success to obtain_snapshot" , K (ret));
215238 } else if (next_task_status == task_status_) { // resume old task status and retry
@@ -225,17 +248,23 @@ int ObDropVecIndexTask::obtain_snapshot(const share::ObDDLTaskStatus next_task_s
225248int ObDropVecIndexTask::drop_lob_meta_row (const ObDDLTaskStatus next_task_status)
226249{
227250 int ret = OB_SUCCESS ;
228- bool is_build_replica_end = false ;
251+ bool is_build_replica_end = false ;
252+ bool is_exist = true ;
253+ DEBUG_SYNC (DROP_VECTOR_INDEX_BEFORE_DELETE_LOB_META );
229254 if (OB_UNLIKELY (!is_inited_)) {
230255 ret = OB_NOT_INIT ;
231256 LOG_WARN (" ObDropVecIndexTask is not inited" , K (ret));
232257 } else if (ObDDLTaskStatus::DROP_LOB_META_ROW != task_status_) {
233258 ret = OB_TASK_EXPIRED ;
234259 LOG_WARN (" task status not match" , K (ret), K (task_status_));
235260 } else if (OB_UNLIKELY (snapshot_version_ <= 0 )) {
236- is_build_replica_end = true ; // switch to fail.
237- ret = OB_ERR_UNEXPECTED ;
238- LOG_WARN (" unexpected snapshot" , K (ret), KPC (this ));
261+ is_build_replica_end = true ;
262+ LOG_INFO (" finish drop lob meta and release snapshot" , K (ret));
263+ } else if (vec_index_snapshot_data_.is_valid () && !del_lob_meta_row_task_submitted_ && OB_FAIL (check_snapshot_table_exist (is_exist))) {
264+ LOG_WARN (" fail to check snapshot table exist" , K (ret));
265+ } else if (!is_exist) {
266+ is_build_replica_end = true ;
267+ LOG_INFO (" snapshot table not exist, skip drop lob meta row" , K (ret));
239268 } else if (vec_index_snapshot_data_.is_valid () && !del_lob_meta_row_task_submitted_ && OB_FAIL (send_build_single_replica_request ())) {
240269 LOG_WARN (" fail to send build single replica request" , K (ret));
241270 } else if (vec_index_snapshot_data_.is_valid () && del_lob_meta_row_task_submitted_ && OB_FAIL (check_build_single_replica (is_build_replica_end))) {
@@ -244,7 +273,12 @@ int ObDropVecIndexTask::drop_lob_meta_row(const ObDDLTaskStatus next_task_status
244273 is_build_replica_end = true ;
245274 }
246275 if (is_build_replica_end) {
247- ret = OB_SUCC (ret) ? delte_lob_meta_job_ret_code_ : ret;
276+ DEBUG_SYNC (DROP_VECTOR_INDEX_AFTER_DELETE_LOB_META );
277+ // Only consume async job return code when the delete-lob-meta job was actually submitted.
278+ // For skip paths (e.g. snapshot table not exist), keep current ret to allow state transition.
279+ if (OB_SUCC (ret) && del_lob_meta_row_task_submitted_) {
280+ ret = delte_lob_meta_job_ret_code_;
281+ }
248282#ifdef ERRSIM
249283 if (OB_SUCC (ret)) {
250284 ret = OB_E (common::EventTable::EN_VEC_INDEX_DROP_LOB_META_ROW_ERR ) OB_SUCCESS ;
@@ -256,7 +290,7 @@ int ObDropVecIndexTask::drop_lob_meta_row(const ObDDLTaskStatus next_task_status
256290 if (OB_FAIL (ret)) {
257291 LOG_WARN (" fail in delete lob meta row" , K (ret));
258292 } else if (OB_FAIL (finish ())) {
259- LOG_WARN (" fail in release snapshot" , K (ret));
293+ LOG_WARN (" fail to release snapshot" , K (ret));
260294 } else if (OB_FAIL (switch_status (next_task_status, true /* enable_flt*/ , ret))) {
261295 LOG_WARN (" fail to switch task status" , K (ret), K (next_task_status));
262296 } else {
@@ -805,8 +839,14 @@ int ObDropVecIndexTask::create_drop_index_task(
805839 } else if (OB_FAIL (guard.get_table_schema (tenant_id_, index_schema->get_data_table_id (), data_table_schema))) {
806840 LOG_WARN (" fail to get data table schema" , K (ret), K (index_schema->get_data_table_id ()));
807841 } else if (OB_UNLIKELY (nullptr == database_schema || nullptr == data_table_schema)) {
808- ret = OB_ERR_UNEXPECTED ;
809- LOG_WARN (" unexpected error, schema is nullptr" , K (ret), KP (database_schema), KP (data_table_schema));
842+ if (OB_ISNULL (data_table_schema) && drop_index_arg_.is_hidden_ ) {
843+ task_id = -1 ;
844+ LOG_INFO (" hidden data_table maybe removed when offline ddl is failed, skip drop" ,
845+ K (ret), K (index_tid), K (index_name));
846+ } else {
847+ ret = OB_ERR_UNEXPECTED ;
848+ LOG_WARN (" unexpected error, schema is nullptr" , K (ret), KP (database_schema), KP (data_table_schema));
849+ }
810850 } else if (is_domain_index && OB_FAIL (drop_index_sql.assign (drop_index_arg_.ddl_stmt_str_ ))) {
811851 LOG_WARN (" assign user drop index sql failed" , K (ret));
812852 } else {
@@ -912,6 +952,14 @@ int ObDropVecIndexTask::finish()
912952 } else if (snapshot_version_ > 0 && OB_FAIL (release_snapshot (snapshot_version_))) {
913953 LOG_WARN (" release snapshot failed" , K (ret));
914954 }
955+ #ifdef ERRSIM
956+ if (OB_SUCC (ret)) {
957+ ret = OB_E (common::EventTable::EN_VEC_INDEX_HNSW_RELEASE_SNAPSHOT_ERR ) OB_SUCCESS ;
958+ if (OB_FAIL (ret)) {
959+ LOG_WARN (" [ERRSIM] fail to finish after release snapshot" , K (ret), K (snapshot_version_));
960+ }
961+ }
962+ #endif
915963 return ret;
916964}
917965
@@ -928,7 +976,7 @@ int ObDropVecIndexTask::exit_all_dags_and_clean()
928976 if (REACH_COUNT_INTERVAL (1000L )) {
929977 LOG_INFO (" wait all delete lob meta row data dag exit" , K (dst_tenant_id_), K (task_id_));
930978 }
931- } else if (OB_FAIL (finish ())) {
979+ } else if (OB_FAIL (finish ())) { // try release hold snapshot
932980 LOG_WARN (" finish tans failed" , K (ret));
933981 } else if (OB_FAIL (cleanup ())) {
934982 LOG_WARN (" cleanup failed" , K (ret));
@@ -946,6 +994,8 @@ int ObDropVecIndexTask::cleanup_impl()
946994 } else if (OB_ISNULL (GCTX .sql_proxy_ )) {
947995 ret = OB_INVALID_ARGUMENT ;
948996 LOG_WARN (" invalid argument" , KR (ret), KP (GCTX .sql_proxy_ ));
997+ } else if (OB_FAIL (finish ())) { // try release hold snapshot
998+ LOG_WARN (" finish tans failed" , K (ret));
949999 } else if (OB_FAIL (report_error_code (unused_str))) {
9501000 LOG_WARN (" report error code failed" , K (ret));
9511001 } else if (OB_FAIL (ObDDLTaskRecordOperator::delete_record (*GCTX .sql_proxy_ , tenant_id_, task_id_))) {
@@ -1030,6 +1080,27 @@ int ObDropVecIndexTask::check_build_single_replica(bool &is_end)
10301080 return ret;
10311081}
10321082
1083+ // check whether all leaders have completed the task
1084+ int ObDropVecIndexTask::check_snapshot_table_exist (bool &is_exist)
1085+ {
1086+ int ret = OB_SUCCESS ;
1087+ const ObTableSchema *snapshot_table_schema = nullptr ;
1088+ const int64_t table_id = vec_index_snapshot_data_.table_id_ ;
1089+ ObSchemaGetterGuard schema_guard;
1090+ if (OB_ISNULL (GCTX .schema_service_ )) {
1091+ ret = OB_INVALID_ARGUMENT ;
1092+ LOG_WARN (" invalid argument" , KR (ret), KP (GCTX .schema_service_ ));
1093+ } else if (OB_FAIL (GCTX .schema_service_ ->get_tenant_schema_guard (tenant_id_, schema_guard))) {
1094+ LOG_WARN (" fail to get tenant schema guard" , K (ret), K (tenant_id_));
1095+ } else if (OB_FAIL (schema_guard.get_table_schema (tenant_id_, table_id, snapshot_table_schema))) {
1096+ LOG_WARN (" get table schema failed" , K (ret), K (table_id));
1097+ } else if (OB_ISNULL (snapshot_table_schema)) {
1098+ is_exist = false ;
1099+ LOG_WARN (" snapshot table is not exist" , K (table_id));
1100+ }
1101+ return ret;
1102+ }
1103+
10331104// update sstable complement status for all leaders
10341105int ObDropVecIndexTask::update_drop_lob_meta_row_job_status (const common::ObTabletID &tablet_id,
10351106 const ObAddr &addr,
0 commit comments