From 82f4a136bb675d0e6d81881d12536dbf09ca06d8 Mon Sep 17 00:00:00 2001 From: gaopy3 Date: Fri, 1 Nov 2024 06:47:33 +0000 Subject: [PATCH] make the behavior of ob_realloc consistent with standard realloc when memory allocation fails --- .../src/lib/alloc/ob_tenant_ctx_allocator.cpp | 25 ++++++++++--------- deps/oblib/src/lib/alloc/object_set.cpp | 9 ++++--- deps/oblib/src/lib/charset/ob_ctype_uca.cc | 10 +++++--- 3 files changed, 25 insertions(+), 19 deletions(-) diff --git a/deps/oblib/src/lib/alloc/ob_tenant_ctx_allocator.cpp b/deps/oblib/src/lib/alloc/ob_tenant_ctx_allocator.cpp index b8f783132..99cfe081a 100644 --- a/deps/oblib/src/lib/alloc/ob_tenant_ctx_allocator.cpp +++ b/deps/oblib/src/lib/alloc/ob_tenant_ctx_allocator.cpp @@ -478,7 +478,8 @@ void* ObTenantCtxAllocator::common_realloc(const void *ptr, const int64_t size, LIB_LOG_RET(ERROR, OB_INVALID_ARGUMENT, "OB_MOD_DO_NOT_USE_ME REALLOC", K(size)); } - AObject *obj = NULL; + AObject *obj = NULL; // original object + AObject *nobj = NULL; // newly allocated object bool sample_allowed = false; bool is_errsim = false; if (NULL != ptr) { @@ -489,7 +490,7 @@ void* ObTenantCtxAllocator::common_realloc(const void *ptr, const int64_t size, const ObErrsimModuleType type = THIS_WORKER.get_module_type(); if (is_errsim_module(ta.get_tenant_id(), type.type_)) { //errsim alloc memory failed. - obj = nullptr; + nobj = nullptr; is_errsim = true; } #endif @@ -501,17 +502,13 @@ void* ObTenantCtxAllocator::common_realloc(const void *ptr, const int64_t size, if (OB_UNLIKELY(OB_FAIL(ret) || is_errsim)) { AllocFailedCtx &afc = g_alloc_failed_ctx(); afc.reason_ = AllocFailedReason::ERRSIM_INJECTION; - if (OB_NOT_NULL(obj)) { - allocator.free_object(obj); - obj = NULL; - } } else { BASIC_TIME_GUARD(time_guard, "ObMalloc"); DEFER(ObMallocTimeMonitor::get_instance().record_malloc_time(time_guard, size, inner_attr)); sample_allowed = ObMallocSampleLimiter::malloc_sample_allowed(size, inner_attr); inner_attr.alloc_extra_info_ = sample_allowed; - obj = allocator.realloc_object(obj, size, inner_attr); - if(OB_ISNULL(obj)) { + nobj = allocator.realloc_object(obj, size, inner_attr); + if(OB_ISNULL(nobj)) { int64_t total_size = 0; if (g_alloc_failed_ctx().need_wash_block()) { total_size += ta.sync_wash(); @@ -521,14 +518,18 @@ void* ObTenantCtxAllocator::common_realloc(const void *ptr, const int64_t size, BASIC_TIME_GUARD_CLICK("WASH_CHUNK_END"); } if (total_size > 0) { - obj = allocator.realloc_object(obj, size, inner_attr); + nobj = allocator.realloc_object(obj, size, inner_attr); } } } - if (obj != NULL) { - on_alloc(*obj, inner_attr); - nptr = obj->data_; + if (OB_UNLIKELY(NULL == nobj && NULL != obj)) { + SANITY_UNPOISON(obj->data_, obj->alloc_bytes_); + } + + if (OB_NOT_NULL(nobj)) { + on_alloc(*nobj, inner_attr); + nptr = nobj->data_; } else if (TC_REACH_TIME_INTERVAL(1 * 1000 * 1000)) { #ifdef FATAL_ERROR_HANG if (REACH_TIME_INTERVAL(60 * 1000 * 1000)) { diff --git a/deps/oblib/src/lib/alloc/object_set.cpp b/deps/oblib/src/lib/alloc/object_set.cpp index be0793a1a..11e46b635 100644 --- a/deps/oblib/src/lib/alloc/object_set.cpp +++ b/deps/oblib/src/lib/alloc/object_set.cpp @@ -106,11 +106,12 @@ AObject *ObjectSet::realloc_object( abort_unless(obj->is_valid()); uint64_t copy_size = MIN(obj->alloc_bytes_, size); new_obj = alloc_object(size, attr); - if (NULL != new_obj && copy_size != 0) { - memmove(new_obj->data_, obj->data_, copy_size); + if (NULL != new_obj) { + if (copy_size != 0) { + memmove(new_obj->data_, obj->data_, copy_size); + } + do_free_object(obj); } - - do_free_object(obj); } return new_obj; diff --git a/deps/oblib/src/lib/charset/ob_ctype_uca.cc b/deps/oblib/src/lib/charset/ob_ctype_uca.cc index 90c4a9ada..f5e4d64b0 100644 --- a/deps/oblib/src/lib/charset/ob_ctype_uca.cc +++ b/deps/oblib/src/lib/charset/ob_ctype_uca.cc @@ -1456,10 +1456,14 @@ static int ob_coll_rule_expand(ob_wc_t *wc, size_t limit, ob_wc_t code) { } static void ob_coll_rule_reset(ObCollRule *r) { memset(r, 0, sizeof(*r)); } static int ob_coll_rules_realloc(ObCollRules *rules, size_t n) { - if (rules->nrules < rules->mrules || - (rules->rule = static_cast(rules->loader->mem_realloc( - rules->rule, sizeof(ObCollRule) * (rules->mrules = n + 128))))) + ObCollRule *new_rule = nullptr; + if (rules->nrules < rules->mrules) return 0; + if ((new_rule = static_cast(rules->loader->mem_realloc( + rules->rule, sizeof(ObCollRule) * (rules->mrules = n + 128))))) { + rules->rule = new_rule; + return 0; + } return -1; } static int ob_coll_rules_add(ObCollRules *rules, ObCollRule *rule) {