diff --git a/src/share/ob_debug_sync_point.h b/src/share/ob_debug_sync_point.h index 1fae1819e6..fa2003b24d 100644 --- a/src/share/ob_debug_sync_point.h +++ b/src/share/ob_debug_sync_point.h @@ -450,6 +450,7 @@ class ObString; ACT(AFTER_MIGRATION_REPORT_LS_META_TABLE,)\ ACT(BEFORE_RESTORE_HANDLE_FETCH_LOG_TASK,)\ ACT(BEFORE_DATA_TABLETS_MIGRATION_TASK,)\ + ACT(AFTER_LS_GC_DELETE_ALL_TABLETS,)\ ACT(MAX_DEBUG_SYNC_POINT,) DECLARE_ENUM(ObDebugSyncPoint, debug_sync_point, OB_DEBUG_SYNC_POINT_DEF); diff --git a/src/storage/backup/ob_backup_utils.cpp b/src/storage/backup/ob_backup_utils.cpp index 195ada5542..b2e53c1898 100644 --- a/src/storage/backup/ob_backup_utils.cpp +++ b/src/storage/backup/ob_backup_utils.cpp @@ -347,6 +347,9 @@ int ObBackupUtils::check_ls_valid_for_backup(const uint64_t tenant_id, const sha } else if (OB_ISNULL(ls = handle.get_ls())) { ret = OB_ERR_UNEXPECTED; LOG_WARN("log stream not exist", K(ret), K(ls_id)); + } else if (ls->is_stopped()) { + ret = OB_REPLICA_CANNOT_BACKUP; + LOG_WARN("ls has stopped, can not backup", K(ret), K(tenant_id), K(ls_id)); } else if (OB_FAIL(ls->get_ls_meta(ls_meta))) { LOG_WARN("failed to get ls meta", K(ret), K(tenant_id), K(ls_id)); } else if (OB_FAIL(ls_meta.check_valid_for_backup())) { @@ -1761,9 +1764,25 @@ int ObBackupTabletProvider::get_tablet_skipped_type_(const uint64_t tenant_id, c skipped_type = ObBackupSkippedType(ObBackupSkippedType::DELETED); } else if (1 == tablet_count) { if (tmp_ls_id == ls_id.id()) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("tablet not exist, but __all_tablet_to_ls still exist", - K(ret), K(tenant_id), K(ls_id), K(tablet_id)); + storage::ObLS *ls = NULL; + ObLSService *ls_service = NULL; + ObLSHandle handle; + if (OB_ISNULL(ls_service = MTL_WITH_CHECK_TENANT(ObLSService *, tenant_id))) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("log stream service is NULL", K(ret), K(tenant_id)); + } else if (OB_FAIL(ls_service->get_ls(ls_id, handle, ObLSGetMod::STORAGE_MOD))) { + LOG_WARN("failed to get log stream", K(ret), K(ls_id)); + } else if (OB_ISNULL(ls = handle.get_ls())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("log stream not exist", K(ret), K(ls_id)); + } else if (ls->is_stopped()) { + ret = OB_REPLICA_CANNOT_BACKUP; + LOG_WARN("ls has stopped, can not backup", K(ret), K(tenant_id), K(ls_id)); + } else { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("tablet not exist, but __all_tablet_to_ls still exist", + K(ret), K(tenant_id), K(ls_id), K(tablet_id)); + } } else { skipped_type = ObBackupSkippedType(ObBackupSkippedType::TRANSFER); LOG_INFO("tablet transfered, need change turn", K(ls_id)); diff --git a/src/storage/ls/ob_ls_tablet_service.cpp b/src/storage/ls/ob_ls_tablet_service.cpp index 43d04ef6d0..6658710b30 100644 --- a/src/storage/ls/ob_ls_tablet_service.cpp +++ b/src/storage/ls/ob_ls_tablet_service.cpp @@ -70,6 +70,7 @@ #include "observer/table_load/ob_table_load_coordinator.h" #include "observer/table_load/ob_table_load_service.h" #include "observer/table_load/ob_table_load_store.h" +#include "observer/ob_server_event_history_table_operator.h" using namespace oceanbase::share; using namespace oceanbase::common; @@ -240,6 +241,14 @@ int ObLSTabletService::prepare_for_safe_destroy() if (OB_FAIL(delete_all_tablets())) { LOG_WARN("fail to delete all tablets", K(ret)); } +#ifdef ERRSIM + if (!ls_->get_ls_id().is_sys_ls()) { + SERVER_EVENT_SYNC_ADD("ls_tablet_service", "after_delete_all_tablets", + "tenant_id", MTL_ID(), + "ls_id", ls_->get_ls_id().id()); + DEBUG_SYNC(AFTER_LS_GC_DELETE_ALL_TABLETS); + } +#endif return ret; }