From 3a38b701c49b76796e089c13728f7b37671e8f97 Mon Sep 17 00:00:00 2001 From: obdev Date: Fri, 9 Feb 2024 14:19:50 +0000 Subject: [PATCH] [CP] [GIS] fix srs_guard reuse --- deps/oblib/src/lib/geo/ob_geo_func_envelope.cpp | 3 ++- src/observer/omt/ob_tenant_srs.cpp | 9 ++++++++- src/observer/omt/ob_tenant_srs.h | 1 + 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/deps/oblib/src/lib/geo/ob_geo_func_envelope.cpp b/deps/oblib/src/lib/geo/ob_geo_func_envelope.cpp index 60e6aacc5b..a5aeea02b1 100644 --- a/deps/oblib/src/lib/geo/ob_geo_func_envelope.cpp +++ b/deps/oblib/src/lib/geo/ob_geo_func_envelope.cpp @@ -79,7 +79,8 @@ private: sub_g->set_data(wkb_nosrid); sub_g->set_srid(g->get_srid()); } - if (OB_FAIL(eval_envelope_collection(sub_g, context, tmp_result))) { + if (OB_FAIL(ret)) { + } else if (OB_FAIL(eval_envelope_collection(sub_g, context, tmp_result))) { LOG_WARN("failed to eval sub geo from collection", K(sub_type), K(ret)); } else { if (result.is_empty() && !tmp_result.is_empty()) { diff --git a/src/observer/omt/ob_tenant_srs.cpp b/src/observer/omt/ob_tenant_srs.cpp index 4949b63b1c..b64dd2d890 100644 --- a/src/observer/omt/ob_tenant_srs.cpp +++ b/src/observer/omt/ob_tenant_srs.cpp @@ -138,7 +138,10 @@ int ObSrsCacheGuard::get_srs_item(uint64_t srs_id, const ObSrsItem *&srs_item) int ObTenantSrs::get_tenant_srs_guard(ObSrsCacheGuard &srs_guard) { int ret = OB_SUCCESS; - if (OB_FAIL(try_get_last_snapshot(srs_guard))) { + if (!srs_guard.empty()) { + // do nothing + LOG_TRACE("guard isn't empty"); + } else if (OB_FAIL(try_get_last_snapshot(srs_guard))) { if (ret == OB_ERR_EMPTY_QUERY) { ret = OB_ERR_SRS_EMPTY; LOG_WARN("srs table might be empty", K(ret), K(MTL_ID())); @@ -304,12 +307,16 @@ void ObTenantSrs::recycle_last_snapshots() last_sys_snapshot_->~ObSrsCacheSnapShot(); allocator_.free(last_sys_snapshot_); last_sys_snapshot_ = NULL; + } else if (OB_NOT_NULL(last_sys_snapshot_)) { + LOG_INFO("unexpected srs snapshot ref count", K(last_sys_snapshot_->get_ref_count())); } if (OB_NOT_NULL(last_user_snapshot_) && last_user_snapshot_->get_ref_count() <= 0) { last_user_snapshot_->~ObSrsCacheSnapShot(); allocator_.free(last_user_snapshot_); last_user_snapshot_ = NULL; + } else if (OB_NOT_NULL(last_user_snapshot_)) { + LOG_INFO("unexpected srs snapshot ref count", K(last_user_snapshot_->get_ref_count())); } } diff --git a/src/observer/omt/ob_tenant_srs.h b/src/observer/omt/ob_tenant_srs.h index 192b6d3ec3..d1e21fe4a0 100644 --- a/src/observer/omt/ob_tenant_srs.h +++ b/src/observer/omt/ob_tenant_srs.h @@ -84,6 +84,7 @@ public: virtual ~ObSrsCacheGuard(); int get_srs_item(uint64_t srs_id, const common::ObSrsItem *&srs_item); void set_srs_snapshot(ObSrsCacheSnapShot *srs_cache) { srs_cache_ = srs_cache; } + inline bool empty() { return srs_cache_ == nullptr; } private: ObSrsCacheSnapShot *srs_cache_; };