From 8ad13af591c25d3a98c54ade358b779826a3975a Mon Sep 17 00:00:00 2001 From: tino247 Date: Wed, 26 Apr 2023 15:26:47 +0000 Subject: [PATCH] Fix schema related problems --- .../ob_multi_version_schema_service.cpp | 36 +++++++++++++------ src/share/schema/ob_server_schema_service.cpp | 18 +++++----- 2 files changed, 35 insertions(+), 19 deletions(-) diff --git a/src/share/schema/ob_multi_version_schema_service.cpp b/src/share/schema/ob_multi_version_schema_service.cpp index 48923273f..3764b0d01 100644 --- a/src/share/schema/ob_multi_version_schema_service.cpp +++ b/src/share/schema/ob_multi_version_schema_service.cpp @@ -2196,19 +2196,33 @@ int ObMultiVersionSchemaService::async_refresh_schema( && (!check_formal || ObSchemaService::is_formal_version(local_schema_version))) { // success break; - } else if (OB_ISNULL(GCTX.ob_service_)) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("observice is null", K(ret)); } else { - if (0 != retry_cnt % 20) { + if (0 == retry_cnt % 20) { // try refresh schema each 2s - } else if (OB_FAIL(GCTX.ob_service_->submit_async_refresh_schema_task( - tenant_id, schema_version))) { - if (OB_EAGAIN == ret || OB_SIZE_OVERFLOW == ret) { - ret = OB_SUCCESS; - } else { - LOG_WARN("fail to submit async refresh schema task", - K(ret), K(tenant_id), K(schema_version)); + { + bool is_dropped = false; + ObSchemaGetterGuard guard; + if (OB_FAIL(get_tenant_schema_guard(OB_SYS_TENANT_ID, guard))) { + LOG_WARN("fail to get schema guard", KR(ret)); + } else if (OB_FAIL(guard.check_if_tenant_has_been_dropped(tenant_id, is_dropped))) { + LOG_WARN("fail to check if tenant has been dropped", KR(ret), K(tenant_id)); + } else if (is_dropped) { + ret = OB_TENANT_HAS_BEEN_DROPPED; + LOG_WARN("tenant has been dropped", KR(ret), K(tenant_id)); + } + } + if (OB_FAIL(ret)) { + } else if (OB_ISNULL(GCTX.ob_service_)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("observice is null", K(ret)); + } else if (OB_FAIL(GCTX.ob_service_->submit_async_refresh_schema_task( + tenant_id, schema_version))) { + if (OB_EAGAIN == ret || OB_SIZE_OVERFLOW == ret) { + ret = OB_SUCCESS; + } else { + LOG_WARN("fail to submit async refresh schema task", + K(ret), K(tenant_id), K(schema_version)); + } } } if (OB_SUCC(ret)) { diff --git a/src/share/schema/ob_server_schema_service.cpp b/src/share/schema/ob_server_schema_service.cpp index 1b19807a8..c98c81563 100644 --- a/src/share/schema/ob_server_schema_service.cpp +++ b/src/share/schema/ob_server_schema_service.cpp @@ -236,10 +236,13 @@ int ObServerSchemaService::destroy_schema_struct(uint64_t tenant_id) LOG_INFO("reset tenant refresh_full mark", K(ret), K(tenant_id)); } - ObSchemaMgr **schema_mgr = NULL; + ObSchemaMgr *schema_mgr = NULL; ObSchemaMemMgr *mem_mgr = NULL; if (OB_SUCC(ret)) { ObSchemaMgr * const *tmp_mgr = schema_mgr_for_cache_map_.get(tenant_id); + if (OB_NOT_NULL(tmp_mgr)) { + schema_mgr = *tmp_mgr; + } if (OB_FAIL(mem_mgr_map_.get_refactored(tenant_id, mem_mgr))) { LOG_WARN("fail to get mem mgr", K(ret), K(tenant_id)); } else if (OB_FAIL(schema_mgr_for_cache_map_.erase_refactored(tenant_id))) { @@ -249,26 +252,25 @@ int ObServerSchemaService::destroy_schema_struct(uint64_t tenant_id) LOG_WARN("fail to get schema mgr for cache", K(ret)); } } else { - schema_mgr = const_cast(tmp_mgr); FLOG_INFO("[SCHEMA_RELEASE] erase tenant from schema_mgr_for_cache_map", K(ret), K(tenant_id)); } } if (OB_FAIL(ret)) { - } else if (OB_ISNULL(schema_mgr) || OB_ISNULL(*schema_mgr)) { + } else if (OB_ISNULL(schema_mgr)) { LOG_INFO("schema_mgr_for_cache has been released, just skip", K(ret), K(tenant_id)); } else if (OB_ISNULL(mem_mgr)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("mem_mgr is null", K(ret), K(tenant_id)); } else { FLOG_INFO("[SCHEMA_RELEASE] try release schema_mgr_for_cache", K(ret), K(tenant_id), - "schema_mgr_tenant_id", (*schema_mgr)->get_tenant_id(), - "schema_version", (*schema_mgr)->get_schema_version()); - (*schema_mgr)->~ObSchemaMgr(); - if (OB_FAIL(mem_mgr->free(static_cast(*schema_mgr)))) { + "schema_mgr_tenant_id", schema_mgr->get_tenant_id(), + "schema_version", schema_mgr->get_schema_version()); + schema_mgr->~ObSchemaMgr(); + if (OB_FAIL(mem_mgr->free(static_cast(schema_mgr)))) { LOG_ERROR("free schema mgr for cache failed", K(ret), K(tenant_id)); } else { - *schema_mgr = NULL; + schema_mgr = NULL; } } }