diff --git a/src/storage/ddl/ob_tablet_ddl_kv_mgr.cpp b/src/storage/ddl/ob_tablet_ddl_kv_mgr.cpp index 15852f16aa..cb3b686394 100644 --- a/src/storage/ddl/ob_tablet_ddl_kv_mgr.cpp +++ b/src/storage/ddl/ob_tablet_ddl_kv_mgr.cpp @@ -96,7 +96,8 @@ int ObTabletDDLKvMgr::ddl_start(const ObITable::TableKey &table_key, { int ret = OB_SUCCESS; bool is_brand_new = false; - TCWLockGuard guard(lock_); + SCN saved_start_scn; + int64_t saved_snapshot_version = 0; if (OB_UNLIKELY(!is_inited_)) { ret = OB_NOT_INIT; LOG_WARN("not init", K(ret), K(is_inited_)); @@ -107,31 +108,39 @@ int ObTabletDDLKvMgr::ddl_start(const ObITable::TableKey &table_key, } else if (table_key.get_tablet_id() != tablet_id_) { ret = OB_ERR_SYS; LOG_WARN("tablet id not same", K(ret), K(table_key), K(tablet_id_)); - } else if (start_scn_.is_valid_and_not_min()) { - if (execution_id >= execution_id_ && start_scn >= start_scn_) { - LOG_INFO("execution id changed, need cleanup", K(ls_id_), K(tablet_id_), K(execution_id_), K(execution_id), K(start_scn_), K(start_scn)); - cleanup_unlock(); - is_brand_new = true; - } else { - if (!checkpoint_scn.is_valid_and_not_min()) { - // only return error code when not start from checkpoint. - ret = OB_TASK_EXPIRED; - } - LOG_INFO("ddl start ignored", K(ls_id_), K(tablet_id_), K(execution_id_), K(execution_id), K(start_scn_), K(start_scn)); - } } else { - is_brand_new = true; - } - if (OB_SUCC(ret) && is_brand_new) { - table_key_ = table_key; - cluster_version_ = cluster_version; - execution_id_ = execution_id; - start_scn_ = start_scn; - max_freeze_scn_ = SCN::max(start_scn, checkpoint_scn); + TCWLockGuard guard(lock_); + if (start_scn_.is_valid_and_not_min()) { + if (execution_id >= execution_id_ && start_scn >= start_scn_) { + LOG_INFO("execution id changed, need cleanup", K(ls_id_), K(tablet_id_), K(execution_id_), K(execution_id), K(start_scn_), K(start_scn)); + cleanup_unlock(); + is_brand_new = true; + } else { + if (!checkpoint_scn.is_valid_and_not_min()) { + // only return error code when not start from checkpoint. + ret = OB_TASK_EXPIRED; + } + LOG_INFO("ddl start ignored", K(ls_id_), K(tablet_id_), K(execution_id_), K(execution_id), K(start_scn_), K(start_scn)); + } + } else { + is_brand_new = true; + } + if (OB_SUCC(ret) && is_brand_new) { + table_key_ = table_key; + cluster_version_ = cluster_version; + execution_id_ = execution_id; + start_scn_ = start_scn; + max_freeze_scn_ = SCN::max(start_scn, checkpoint_scn); + } + if (OB_SUCC(ret)) { + // save variables under lock + saved_start_scn = start_scn_; + saved_snapshot_version = table_key_.get_snapshot_version(); + } } if (OB_SUCC(ret) && !checkpoint_scn.is_valid_and_not_min()) { // remove ddl sstable if exists and flush ddl start log ts and snapshot version into tablet meta - if (OB_FAIL(update_tablet(start_scn_, table_key_.get_snapshot_version(), start_scn_))) { + if (OB_FAIL(update_tablet(saved_start_scn, saved_snapshot_version, saved_start_scn))) { LOG_WARN("clean up ddl sstable failed", K(ret), K(ls_id_), K(tablet_id_)); } }