diff --git a/src/logservice/libobcdc/src/ob_log_schema_getter.cpp b/src/logservice/libobcdc/src/ob_log_schema_getter.cpp index 889e12fd02..01f070743b 100644 --- a/src/logservice/libobcdc/src/ob_log_schema_getter.cpp +++ b/src/logservice/libobcdc/src/ob_log_schema_getter.cpp @@ -929,8 +929,10 @@ int ObLogSchemaGetter::get_tenant_refreshed_schema_version(const uint64_t tenant return ret; } -int ObLogSchemaGetter::check_if_tenant_is_dropping_or_dropped(const uint64_t tenant_id, - bool &is_tenant_dropping_or_dropped) +int ObLogSchemaGetter::check_if_tenant_is_dropping_or_dropped( + const uint64_t tenant_id, + bool &is_tenant_dropping_or_dropped, + TenantSchemaInfo &tenant_schema_info) { int ret = OB_SUCCESS; ObSchemaGetterGuard guard; @@ -951,6 +953,11 @@ int ObLogSchemaGetter::check_if_tenant_is_dropping_or_dropped(const uint64_t ten } } else { is_tenant_dropping_or_dropped = tenant_schema->is_dropping(); + tenant_schema_info.reset( + tenant_id, + tenant_schema->get_schema_version(), + tenant_schema->get_tenant_name(), + tenant_schema->is_restore()); } return ret; diff --git a/src/logservice/libobcdc/src/ob_log_schema_getter.h b/src/logservice/libobcdc/src/ob_log_schema_getter.h index 91be7a9fff..601a0403ca 100644 --- a/src/logservice/libobcdc/src/ob_log_schema_getter.h +++ b/src/logservice/libobcdc/src/ob_log_schema_getter.h @@ -475,8 +475,10 @@ public: /// /// @retval OB_SUCCESS success /// @retval other error code fail - virtual int check_if_tenant_is_dropping_or_dropped(const uint64_t tenant_id, - bool &is_tenant_dropping_or_dropped) = 0; + virtual int check_if_tenant_is_dropping_or_dropped( + const uint64_t tenant_id, + bool &is_tenant_dropping_or_dropped, + TenantSchemaInfo &tenant_schema_info) = 0; //// NOTE: Note that all subsequent additions to the interface should consider the return value case when the tenant does not exist. //// I: requires the schema module to return a specific error code OB_TENANT_HAS_BEEN_DROPPED when a tenant does not exist. libobcdc encounters this error code and only this error code will determine that the tenant has been deleted and exit the retry loop @@ -619,8 +621,10 @@ public: } int get_tenant_refreshed_schema_version(const uint64_t tenant_id, int64_t &version); - int check_if_tenant_is_dropping_or_dropped(const uint64_t tenant_id, - bool &is_tenant_dropping_or_dropped); + int check_if_tenant_is_dropping_or_dropped( + const uint64_t tenant_id, + bool &is_tenant_dropping_or_dropped, + TenantSchemaInfo &tenant_schema_info); public: int init(common::ObMySQLProxy &mysql_proxy, diff --git a/src/logservice/libobcdc/src/ob_log_systable_helper.cpp b/src/logservice/libobcdc/src/ob_log_systable_helper.cpp index 61b4187b89..790c91f4d8 100644 --- a/src/logservice/libobcdc/src/ob_log_systable_helper.cpp +++ b/src/logservice/libobcdc/src/ob_log_systable_helper.cpp @@ -195,8 +195,9 @@ int QueryAllTenantStrategy::build_sql_statement( "SELECT DISTINCT TENANT_ID, TENANT_NAME FROM %s", OB_DBA_OB_ACCESS_POINT_TNAME))) { LOG_ERROR("build_sql_statement failed for query all_tenant_info in tenant_sync_mode", KR(ret), K(pos), KCSTRING(sql_buf)); } + // should not filter tenant by status because schema_service may launch sql to all tenant } else if (OB_FAIL(databuff_printf(sql_buf, mul_statement_buf_len, pos, - "SELECT DISTINCT TENANT_ID, TENANT_NAME FROM %s WHERE TENANT_TYPE != 'META' AND STATUS = 'NORMAL'", OB_DBA_OB_TENANTS_TNAME))) { + "SELECT DISTINCT TENANT_ID, TENANT_NAME FROM %s WHERE TENANT_TYPE != 'META'", OB_DBA_OB_TENANTS_TNAME))) { LOG_ERROR("build_sql_statement failed for query all_tenant_info", KR(ret), K(pos), KCSTRING(sql_buf)); } diff --git a/src/logservice/libobcdc/src/ob_log_tenant_mgr.cpp b/src/logservice/libobcdc/src/ob_log_tenant_mgr.cpp index f2990e2c0e..33c1084a3a 100644 --- a/src/logservice/libobcdc/src/ob_log_tenant_mgr.cpp +++ b/src/logservice/libobcdc/src/ob_log_tenant_mgr.cpp @@ -1263,7 +1263,7 @@ int ObLogTenantMgr::add_all_tenants(const int64_t start_tstamp_ns, const char *tenant_name = (OB_SYS_TENANT_ID == tenant_id) ? "sys" : nullptr; if (OB_SYS_TENANT_ID == tenant_id && enable_filter_sys_tenant) { - ISTAT("[FILTE] sys tenant is filtered", K(tenant_id), K(enable_filter_sys_tenant)); + ISTAT("[ADD_TENANT][FILTE][REASON: enable_filter_sys_tenant=true]", K(tenant_id), K(enable_filter_sys_tenant)); } else { if (OB_FAIL(add_tenant(tenant_id, is_new_created_tenant, is_new_tenant_by_restore, start_tstamp_ns, sys_schema_version, schema_guard, tenant_name, timeout, add_tenant_succ))) { @@ -1333,8 +1333,8 @@ int ObLogTenantMgr::get_tenant_ids_( // get available tenant id list else if (OB_FAIL(sys_schema_guard.get_available_tenant_ids(tenant_id_list, timeout))) { LOG_ERROR("get_available_tenant_ids fail", KR(ret), K(tenant_id_list), K(timeout)); - } else if (OB_FAIL(filter_dropped_tenant_(tenant_id_list))) { - LOG_ERROR("filter_dropped_tenant_ fail", KR(ret), K(tenant_id_list), K(timeout)); + } else if (OB_FAIL(filter_by_current_tenant_status_(tenant_id_list))) { + LOG_ERROR("filter_by_current_tenant_status_ fail", KR(ret), K(tenant_id_list), K(timeout)); } else if (OB_FAIL(ls_getter_.init(tenant_id_list, start_tstamp_ns))) { LOG_ERROR("ObLogLsGetter init fail", KR(ret), K(tenant_id_list), K(start_tstamp_ns)); } @@ -1789,36 +1789,49 @@ bool ObLogTenantMgr::GlobalHeartbeatUpdateFunc::operator()(const TenantID &tid, return bool_ret; } -int ObLogTenantMgr::filter_dropped_tenant_(common::ObIArray &tenant_id_list) +int ObLogTenantMgr::filter_by_current_tenant_status_(common::ObIArray &tenant_id_list) { int ret = OB_SUCCESS; IObLogSchemaGetter *schema_getter = TCTX.schema_getter_; + IObLogTableMatcher *tb_matcher = TCTX.tb_matcher_; common::ObArray tmp_tenant_id_list; if (OB_FAIL(tmp_tenant_id_list.assign(tenant_id_list))) { ret = OB_ERR_UNEXPECTED; LOG_ERROR("tenant_id_list assign fail", KR(ret), K(tenant_id_list), K(tmp_tenant_id_list)); } else if (FALSE_IT(tenant_id_list.reset())) { - } else if (OB_ISNULL(schema_getter)) { + } else if (OB_ISNULL(schema_getter) || OB_ISNULL(tb_matcher)) { ret = OB_INVALID_ARGUMENT; - LOG_ERROR("invalid arguments", KR(ret), K(schema_getter)); + LOG_ERROR("invalid arguments", KR(ret), K(schema_getter), K(tb_matcher)); } else { ARRAY_FOREACH_N(tmp_tenant_id_list, idx, count) { const uint64_t tenant_id = tmp_tenant_id_list.at(idx); + TenantSchemaInfo tenant_schema_info; bool is_tenant_dropping_or_dropped = false; + bool matched = true; - if (OB_FAIL(schema_getter->check_if_tenant_is_dropping_or_dropped(tenant_id, is_tenant_dropping_or_dropped))) { + if (is_meta_tenant(tenant_id)) { + LOG_INFO("[ADD_TENANT][FILTE][REASON: META_TENANT_NOT_SYNC]", K(tenant_id)); + } else if (OB_FAIL(schema_getter->check_if_tenant_is_dropping_or_dropped(tenant_id, is_tenant_dropping_or_dropped, tenant_schema_info))) { LOG_ERROR("check_if_tenant_is_dropping_or_dropped fail", KR(ret), K(tenant_id), K(is_tenant_dropping_or_dropped)); - } else if (is_tenant_dropping_or_dropped) { - LOG_INFO("tenant is dropping or has been dropped", K(tenant_id), K(is_tenant_dropping_or_dropped)); + } else if (OB_UNLIKELY(is_tenant_dropping_or_dropped)) { + LOG_INFO("[ADD_TENANT][FILTE][REASON: TENANT_DROPPING_OR_DROPPED]", K(tenant_id)); + } else if (OB_UNLIKELY(! tenant_schema_info.is_valid())) { + LOG_WARN("[ADD_TENANT][FILTE][REASON: TENANT_CURRENT_SCHEMA_INVALID]", K(tenant_schema_info)); + } else if (OB_UNLIKELY(tenant_schema_info.is_restore_)) { + LOG_INFO("[ADD_TENANT][FILTE][REASON: TENANT_IN_RESTORE_OR_CREATING_STANDBY_STATUS]", K(tenant_schema_info)); + } else if (OB_SYS_TENANT_ID != tenant_id && OB_FAIL(tb_matcher->tenant_match(tenant_schema_info.name_, matched))) { + LOG_ERROR("match tenant with whitelist failed", KR(ret), K(tenant_schema_info)); + } else if (! matched) { + LOG_INFO("[ADD_TENANT][FILTE][REASON: TENANT_NOT_MATCH_WHITE_LIST]", K(tenant_schema_info)); } else if (OB_FAIL(tenant_id_list.push_back(tenant_id))) { LOG_ERROR("tenant_id_list push_back fail", KR(ret), K(tenant_id)); } else { } } - LOG_INFO("filter dropped tenant finished", "origin_tenant_id_list", tmp_tenant_id_list, - "filtered_tenant_id_list", tenant_id_list); + LOG_INFO("[ADD_TENANT][FILTER_BY_CUR_TENANT_STATUS]", "origin_tenant_id_list", tmp_tenant_id_list, + "tenant_id_list_after_filter", tenant_id_list); } return ret; diff --git a/src/logservice/libobcdc/src/ob_log_tenant_mgr.h b/src/logservice/libobcdc/src/ob_log_tenant_mgr.h index 5c281b55a3..790271ede3 100644 --- a/src/logservice/libobcdc/src/ob_log_tenant_mgr.h +++ b/src/logservice/libobcdc/src/ob_log_tenant_mgr.h @@ -416,7 +416,7 @@ private: int64_t &start_commit_version); int get_min_add_tenant_start_ddl_commit_version_(int64_t &commit_version); void try_del_tenant_start_ddl_info_(const uint64_t tenant_id); - int filter_dropped_tenant_(common::ObIArray &tenant_id_list); + int filter_by_current_tenant_status_(common::ObIArray &tenant_id_list); private: bool inited_; RefreshMode refresh_mode_;