diff --git a/deps/oblib/src/lib/lock/ob_rwlock.cpp b/deps/oblib/src/lib/lock/ob_rwlock.cpp index 4189a9d008..c4ffd88088 100644 --- a/deps/oblib/src/lib/lock/ob_rwlock.cpp +++ b/deps/oblib/src/lib/lock/ob_rwlock.cpp @@ -11,6 +11,7 @@ */ #include "lib/lock/ob_rwlock.h" +#include "lib/allocator/ob_malloc.h" using namespace oceanbase; using namespace obsys; @@ -55,13 +56,14 @@ ObRWLock::ObRWLock(LockMode lockMode) pthread_rwlockattr_setkind_np(&attr, PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP); } pthread_rwlock_init(&rwlock_, &attr); - rlock_ = new ObRLock(&rwlock_); - wlock_ = new ObWLock(&rwlock_); + auto mattr = SET_USE_500("RWLock"); + rlock_ = OB_NEW(ObRLock, mattr, &rwlock_); + wlock_ = OB_NEW(ObWLock, mattr, &rwlock_); } ObRWLock::~ObRWLock() { pthread_rwlock_destroy(&rwlock_); - delete rlock_; - delete wlock_; + OB_DELETE(ObRLock, "unused", rlock_); + OB_DELETE(ObWLock, "unused", wlock_); } diff --git a/deps/oblib/src/lib/objectpool/ob_server_object_pool.h b/deps/oblib/src/lib/objectpool/ob_server_object_pool.h index 0c98b28eb4..9575242c63 100644 --- a/deps/oblib/src/lib/objectpool/ob_server_object_pool.h +++ b/deps/oblib/src/lib/objectpool/ob_server_object_pool.h @@ -283,19 +283,21 @@ public: * 因为是全局单例,所以是在程序启动时机完成了这些工作 * TODO: 改为按需分配 */ - ObServerObjectPool(const int64_t tenant_id, const bool regist, const bool is_mini_mode) - : tenant_id_(tenant_id), regist_(regist), is_mini_mode_(is_mini_mode), arena_num_(0), + ObServerObjectPool(const int64_t tenant_id, const bool regist, const bool is_mini_mode, + const int64_t cpu_count) + : tenant_id_(tenant_id), regist_(regist), is_mini_mode_(is_mini_mode), + cpu_count_(cpu_count), arena_num_(0), arena_(NULL), cnt_per_arena_(0), item_size_(0), buf_(nullptr), is_inited_(false) {} int init() { int ret = OB_SUCCESS; - const bool is_mini = (lib::is_mini_mode() || is_mini_mode_); - arena_num_ = static_cast(is_mini ? get_cpu_count()/2 : get_cpu_count()); + const bool is_mini = is_mini_mode_; + arena_num_ = min(64/*upper_bound*/, max(4/*lower_bound*/, static_cast(cpu_count_) * 2)); //If the assignment logic of buf_ below is not reached, buf_ will not be initialized buf_ = NULL; - cnt_per_arena_ = is_mini ? 16 : 128; + cnt_per_arena_ = is_mini ? 8 : 64; int64_t s = (sizeof(T) + sizeof(Meta)); // Each cached object header has a Meta field to store necessary information and linked list pointers item_size_ = upper_align(s, CACHE_ALIGN_SIZE); // Align according to the cache line to ensure that there will be no false sharing between objects ObMemAttr attr(tenant_id_, ObModIds::OB_SERVER_OBJECT_POOL); @@ -400,6 +402,7 @@ private: const int64_t tenant_id_; const bool regist_; const bool is_mini_mode_; + const int64_t cpu_count_; int32_t arena_num_; ObPoolArenaHead *arena_; int64_t cnt_per_arena_; @@ -413,7 +416,8 @@ inline ObServerObjectPool& get_server_object_pool() { class Wrapper { public: Wrapper() - : instance_(OB_SERVER_TENANT_ID, true/*regist*/, false/*is_mini_mode*/) + : instance_(OB_SERVER_TENANT_ID, true/*regist*/, lib::is_mini_mode(), + get_cpu_count()) { instance_.init(); // is_inited_ will be checked all invokes } diff --git a/deps/oblib/src/lib/oblog/ob_base_log_writer.cpp b/deps/oblib/src/lib/oblog/ob_base_log_writer.cpp index d2bc6a7c2c..11f30b5ee5 100644 --- a/deps/oblib/src/lib/oblog/ob_base_log_writer.cpp +++ b/deps/oblib/src/lib/oblog/ob_base_log_writer.cpp @@ -65,7 +65,8 @@ int ObBaseLogWriter::init( } else if (OB_UNLIKELY(!log_cfg.is_valid())) { ret = OB_INVALID_ARGUMENT; LOG_STDERR("Invalid argument.\n"); - } else if (NULL == (log_items_ = (ObIBaseLogItem**) malloc(sizeof(ObIBaseLogItem*) * log_cfg.max_buffer_item_cnt_))) { + } else if (NULL == (log_items_ = (ObIBaseLogItem**) ob_malloc(sizeof(ObIBaseLogItem*) * log_cfg.max_buffer_item_cnt_, + attr))) { ret = OB_ALLOCATE_MEMORY_FAILED; LOG_STDERR("Fail to allocate memory, max_buffer_item_cnt=%lu.\n", log_cfg.max_buffer_item_cnt_); } else if (0 != pthread_mutex_init(&thread_mutex_, NULL)) { @@ -183,7 +184,7 @@ void ObBaseLogWriter::destroy() is_inited_ = false; if (NULL != log_items_) { - free(log_items_); + ob_free(log_items_); log_items_ = NULL; } if (OB_NOT_NULL(log_write_cond_)) { diff --git a/deps/oblib/src/lib/thread/thread.cpp b/deps/oblib/src/lib/thread/thread.cpp index 0ab4beacb8..43119b1ae1 100644 --- a/deps/oblib/src/lib/thread/thread.cpp +++ b/deps/oblib/src/lib/thread/thread.cpp @@ -198,19 +198,19 @@ void Thread::wait() int ret = 0; if (pth_ != 0) { if (2 <= ATOMIC_AAF(&join_concurrency_, 1)) { - abort(); + ob_abort(); } if (0 != (ret = pthread_join(pth_, nullptr))) { LOG_ERROR("pthread_join failed", K(ret), K(errno)); #ifndef OB_USE_ASAN dump_pth(); - abort(); + ob_abort(); #endif } destroy_stack(); runnable_ = nullptr; if (1 <= ATOMIC_AAF(&join_concurrency_, -1)) { - abort(); + ob_abort(); } } } diff --git a/mittest/mtlenv/mock_tenant_module_env.h b/mittest/mtlenv/mock_tenant_module_env.h index 52e7ed739b..c5db1a84b2 100644 --- a/mittest/mtlenv/mock_tenant_module_env.h +++ b/mittest/mtlenv/mock_tenant_module_env.h @@ -63,6 +63,8 @@ #include "storage/ob_tenant_tablet_stat_mgr.h" #include "storage/tx/ob_trans_part_ctx.h" #include "storage/ob_file_system_router.h" +#include "storage/access/ob_table_scan_iterator.h" +#include "storage/lob/ob_lob_manager.h" #include "ob_mittest_utils.h" #include "storage/mock_disk_usage_report.h" #include "share/deadlock/ob_deadlock_detector_mgr.h" @@ -97,7 +99,7 @@ static int server_obj_pool_mtl_new(common::ObServerObjectPool *&pool) int ret = common::OB_SUCCESS; uint64_t tenant_id = MTL_ID(); pool = MTL_NEW(common::ObServerObjectPool, "TntSrvObjPool", tenant_id, false, - MTL_IS_MINI_MODE()); + MTL_IS_MINI_MODE(), MTL_CPU_COUNT()); if (OB_ISNULL(pool)) { ret = common::OB_ALLOCATE_MEMORY_FAILED; } else { @@ -673,6 +675,7 @@ int MockTenantModuleEnv::init() MTL_BIND2(mtl_new_default, ObMultiVersionGarbageCollector::mtl_init, mtl_start_default, mtl_stop_default, mtl_wait_default, mtl_destroy_default); MTL_BIND2(mtl_new_default, ObTableLockService::mtl_init, mtl_start_default, mtl_stop_default, mtl_wait_default, mtl_destroy_default); MTL_BIND2(server_obj_pool_mtl_new, nullptr, nullptr, nullptr, nullptr, server_obj_pool_mtl_destroy); + MTL_BIND2(server_obj_pool_mtl_new, nullptr, nullptr, nullptr, nullptr, server_obj_pool_mtl_destroy); } if (OB_FAIL(ret)) { diff --git a/mittest/mtlenv/storage/test_lob_manager.cpp b/mittest/mtlenv/storage/test_lob_manager.cpp index 70e9ea4ff1..58ae319fde 100644 --- a/mittest/mtlenv/storage/test_lob_manager.cpp +++ b/mittest/mtlenv/storage/test_lob_manager.cpp @@ -737,7 +737,6 @@ void TestLobManager::scan_lob_meta( } if (iter != NULL) { iter->reset(); - // common::sop_return(ObLobMetaScanIter, iter); } // ASSERT_EQ(0, out_data.length()); @@ -1744,7 +1743,7 @@ TEST_F(TestLobManager, inrow_bin_reverse_query) } } iter->reset(); - common::sop_return(ObLobQueryIter, iter); + OB_DELETE(ObLobQueryIter, "unused", iter); allocator.free(read_buf); } @@ -1775,7 +1774,7 @@ TEST_F(TestLobManager, inrow_bin_reverse_query) } } iter->reset(); - common::sop_return(ObLobQueryIter, iter); + OB_DELETE(ObLobQueryIter, "unused", iter); allocator.free(read_buf); } @@ -1843,7 +1842,7 @@ TEST_F(TestLobManager, inrow_utf8_reverse_query) } } iter->reset(); - common::sop_return(ObLobQueryIter, iter); + OB_DELETE(ObLobQueryIter, "unused", iter); allocator.free(read_buf); } diff --git a/src/observer/omt/ob_multi_tenant.cpp b/src/observer/omt/ob_multi_tenant.cpp index 9108405e47..4f04e5e050 100644 --- a/src/observer/omt/ob_multi_tenant.cpp +++ b/src/observer/omt/ob_multi_tenant.cpp @@ -80,6 +80,7 @@ #include "storage/tablelock/ob_table_lock_service.h" #include "storage/ob_file_system_router.h" #include "storage/compaction/ob_sstable_merge_info_mgr.h" // ObTenantSSTableMergeInfoMgr +#include "storage/access/ob_table_scan_iterator.h" #include "share/io/ob_io_manager.h" #include "rootserver/freeze/ob_major_freeze_service.h" #include "observer/omt/ob_tenant_config_mgr.h" @@ -292,7 +293,7 @@ static int server_obj_pool_mtl_new(common::ObServerObjectPool *&pool) int ret = common::OB_SUCCESS; uint64_t tenant_id = MTL_ID(); pool = MTL_NEW(common::ObServerObjectPool, "TntSrvObjPool", tenant_id, false/*regist*/, - MTL_IS_MINI_MODE()); + MTL_IS_MINI_MODE(), MTL_CPU_COUNT()); if (OB_ISNULL(pool)) { ret = common::OB_ALLOCATE_MEMORY_FAILED; } else { @@ -301,6 +302,14 @@ static int server_obj_pool_mtl_new(common::ObServerObjectPool *&pool) return ret; } +template +static void server_obj_pool_mtl_destroy(common::ObServerObjectPool *&pool) +{ + using Pool = common::ObServerObjectPool; + MTL_DELETE(Pool, "TntSrvObjPool", pool); + pool = nullptr; +} + static int start_mysql_queue(QueueThread *&qthread) { int ret = OB_SUCCESS; @@ -342,14 +351,6 @@ static int start_mysql_queue(QueueThread *&qthread) return ret; } -template -static void server_obj_pool_mtl_destroy(common::ObServerObjectPool *&pool) -{ - using Pool = common::ObServerObjectPool; - MTL_DELETE(Pool, "TntSrvObjPool", pool); - pool = nullptr; -} - int ObMultiTenant::init(ObAddr myaddr, ObMySQLProxy *sql_proxy, bool mtl_bind_flag) @@ -449,6 +450,7 @@ int ObMultiTenant::init(ObAddr myaddr, MTL_BIND2(mtl_new_default, ObPlanCache::mtl_init, nullptr, ObPlanCache::mtl_stop, nullptr, mtl_destroy_default); MTL_BIND2(mtl_new_default, ObPsCache::mtl_init, nullptr, ObPsCache::mtl_stop, nullptr, mtl_destroy_default); MTL_BIND2(server_obj_pool_mtl_new, nullptr, nullptr, nullptr, nullptr, server_obj_pool_mtl_destroy); + MTL_BIND2(server_obj_pool_mtl_new, nullptr, nullptr, nullptr, nullptr, server_obj_pool_mtl_destroy); MTL_BIND(ObDetectManager::mtl_init, ObDetectManager::mtl_destroy); if (GCONF._enable_new_sql_nio && GCONF._enable_tenant_sql_net_thread) { MTL_BIND2(nullptr, nullptr, start_mysql_queue, mtl_stop_default, @@ -974,7 +976,7 @@ int ObMultiTenant::update_tenant_unit_no_lock(const ObUnitInfoGetter::ObTenantCo LOG_WARN("fail to update mtl module thread_cnt", K(ret), K(tenant_id)); } else if (OB_FAIL(update_tenant_log_disk_size(tenant_id, unit.config_.log_disk_size()))) { LOG_WARN("fail to update tenant log disk size", K(ret), K(tenant_id)); - } else if (FALSE_IT(tenant->update_memory_size(unit.config_.memory_size()))) { + } else if (FALSE_IT(tenant->set_unit_memory_size(unit.config_.memory_size()))) { // unreachable } else { if (tenant->unit_min_cpu() != min_cpu) { diff --git a/src/observer/omt/ob_tenant.cpp b/src/observer/omt/ob_tenant.cpp index 13f2c58f5c..8d3968050c 100644 --- a/src/observer/omt/ob_tenant.cpp +++ b/src/observer/omt/ob_tenant.cpp @@ -569,8 +569,6 @@ ObTenant::ObTenant(const int64_t id, : ObTenantBase(id, true), meta_lock_(), tenant_meta_(), - unit_max_cpu_(0), - unit_min_cpu_(0), token_cnt_(0), total_worker_cnt_(0), gc_thread_(0), @@ -647,7 +645,7 @@ int ObTenant::init(const ObTenantMeta &meta) set_unit_min_cpu(meta.unit_.config_.min_cpu()); set_unit_max_cpu(meta.unit_.config_.max_cpu()); const int64_t memory_size = static_cast(tenant_meta_.unit_.config_.memory_size()); - update_memory_size(memory_size); + set_unit_memory_size(memory_size); constexpr static int64_t MINI_MEM_UPPER = 1L<<30; // 1G update_mini_mode(memory_size <= MINI_MEM_UPPER); diff --git a/src/observer/omt/ob_tenant.h b/src/observer/omt/ob_tenant.h index ef96421ad9..dc5e7c5a81 100644 --- a/src/observer/omt/ob_tenant.h +++ b/src/observer/omt/ob_tenant.h @@ -422,9 +422,7 @@ public: share::ObUnitInfoGetter::ObUnitStatus get_unit_status(); void set_unit_max_cpu(double cpu); - OB_INLINE double unit_max_cpu() const { return unit_max_cpu_; } void set_unit_min_cpu(double cpu); - OB_INLINE double unit_min_cpu() const { return unit_min_cpu_; } OB_INLINE int64_t total_worker_cnt() const { return total_worker_cnt_; } int64_t min_worker_cnt() const; int64_t max_worker_cnt() const; @@ -550,10 +548,6 @@ protected: ObTenantMeta tenant_meta_; protected: - // max/min cpu read from unit - double unit_max_cpu_; - double unit_min_cpu_; - // number of active workers the tenant has owned. Only active // workers can make progress. int64_t token_cnt_ CACHE_ALIGNED; diff --git a/src/share/config/ob_config.cpp b/src/share/config/ob_config.cpp index a77c341576..3c87171814 100644 --- a/src/share/config/ob_config.cpp +++ b/src/share/config/ob_config.cpp @@ -23,6 +23,8 @@ namespace oceanbase { namespace common { +ObMemAttr g_config_mem_attr = SET_USE_500("ConfigChecker"); + const char *log_archive_config_keywords[] = { "MANDATORY", @@ -67,7 +69,8 @@ ObConfigItem::ObConfigItem() ObConfigItem::~ObConfigItem() { if (NULL != ck_) { - delete ck_; + ObConfigChecker *ck = const_cast(ck_); + OB_DELETE(ObConfigChecker, "unused", ck); } } @@ -343,9 +346,9 @@ bool ObConfigIntegralItem::parse_range(const char *range) parse(p_left + 1, valid); if (valid) { if (*p_left == '(') { - add_checker(new(std::nothrow) ObConfigGreaterThan(p_left + 1)); + add_checker(OB_NEW(ObConfigGreaterThan, g_config_mem_attr, p_left + 1)); } else if (*p_left == '[') { - add_checker(new(std::nothrow) ObConfigGreaterEqual(p_left + 1)); + add_checker(OB_NEW(ObConfigGreaterEqual, g_config_mem_attr, p_left + 1)); } } } @@ -354,9 +357,9 @@ bool ObConfigIntegralItem::parse_range(const char *range) parse(p_middle + 1, valid); if (valid) { if (')' == ch_right) { - add_checker(new(std::nothrow) ObConfigLessThan(p_middle + 1)); + add_checker(OB_NEW(ObConfigLessThan, g_config_mem_attr, p_middle + 1)); } else if (']' == ch_right) { - add_checker(new(std::nothrow) ObConfigLessEqual(p_middle + 1)); + add_checker(OB_NEW(ObConfigLessEqual, g_config_mem_attr, p_middle + 1)); } } } @@ -470,18 +473,18 @@ bool ObConfigDoubleItem::parse_range(const char *range) parse(p_left + 1, valid); if (valid) { if (*p_left == '(') { - add_checker(new(std::nothrow) ObConfigGreaterThan(p_left + 1)); + add_checker(OB_NEW(ObConfigGreaterThan, g_config_mem_attr, p_left + 1)); } else if (*p_left == '[') { - add_checker(new(std::nothrow) ObConfigGreaterEqual(p_left + 1)); + add_checker(OB_NEW(ObConfigGreaterEqual, g_config_mem_attr, p_left + 1)); } } parse(p_middle + 1, valid); if (valid) { if (')' == ch_right) { - add_checker(new(std::nothrow) ObConfigLessThan(p_middle + 1)); + add_checker(OB_NEW(ObConfigLessThan, g_config_mem_attr, p_middle + 1)); } else if (']' == ch_right) { - add_checker(new(std::nothrow) ObConfigLessEqual(p_middle + 1)); + add_checker(OB_NEW(ObConfigLessEqual, g_config_mem_attr, p_middle + 1)); } } bool_ret = true; diff --git a/src/share/config/ob_config.h b/src/share/config/ob_config.h index 61a1e1f586..8822a72c07 100644 --- a/src/share/config/ob_config.h +++ b/src/share/config/ob_config.h @@ -49,6 +49,7 @@ enum ObConfigItemType{ OB_CONF_ITEM_TYPE_VERSION = 11, }; +extern ObMemAttr g_config_mem_attr; class ObConfigItem { public: @@ -62,7 +63,7 @@ public: const ObParameterAttr attr = ObParameterAttr()); void add_checker(const ObConfigChecker *new_ck) { - ck_ = new(std::nothrow) ObConfigConsChecker(ck_, new_ck); + ck_ = OB_NEW(ObConfigConsChecker, g_config_mem_attr, ck_, new_ck); } bool check() const { diff --git a/src/share/config/ob_config_helper.cpp b/src/share/config/ob_config_helper.cpp index 1b4eb79d78..34de9841e4 100644 --- a/src/share/config/ob_config_helper.cpp +++ b/src/share/config/ob_config_helper.cpp @@ -46,10 +46,12 @@ bool ObConfigIpChecker::check(const ObConfigItem &t) const ObConfigConsChecker:: ~ObConfigConsChecker() { if (NULL != left_) { - delete left_; + ObConfigChecker *left = const_cast(left_); + OB_DELETE(ObConfigChecker, "unused", left); } if (NULL != right_) { - delete right_; + ObConfigChecker *right = const_cast(right_); + OB_DELETE(ObConfigChecker, "unused", right); } } bool ObConfigConsChecker::check(const ObConfigItem &t) const diff --git a/src/share/ob_lob_access_utils.cpp b/src/share/ob_lob_access_utils.cpp index 75cc899192..6d5c55354b 100644 --- a/src/share/ob_lob_access_utils.cpp +++ b/src/share/ob_lob_access_utils.cpp @@ -45,7 +45,7 @@ void ObLobTextIterCtx::reuse() iter_count_ = 0; if (OB_NOT_NULL(lob_query_iter_)) { lob_query_iter_->reset(); - sop_return(ObLobQueryIter, lob_query_iter_); + OB_DELETE(ObLobQueryIter, "unused", lob_query_iter_); lob_query_iter_ = NULL; } } @@ -57,7 +57,7 @@ ObTextStringIter::~ObTextStringIter() if (is_outrow_ && OB_NOT_NULL(ctx_)) { if (OB_NOT_NULL(ctx_->lob_query_iter_)) { ctx_->lob_query_iter_->reset(); - common::sop_return(ObLobQueryIter, ctx_->lob_query_iter_); + OB_DELETE(ObLobQueryIter, "unused", ctx_->lob_query_iter_); ctx_->lob_query_iter_ = NULL; } } @@ -530,7 +530,7 @@ int ObTextStringIter::get_next_block_inner(ObString &str) if (ret == OB_ITER_END) { state_ = TEXTSTRING_ITER_END; // iter finished ctx_->lob_query_iter_->reset(); - common::sop_return(ObLobQueryIter, ctx_->lob_query_iter_); + OB_DELETE(ObLobQueryIter, "unused", ctx_->lob_query_iter_); ctx_->lob_query_iter_ = NULL; ret = OB_SUCCESS; } else { diff --git a/src/share/parameter/ob_parameter_macro.h b/src/share/parameter/ob_parameter_macro.h index f2ef631005..b353593f5d 100644 --- a/src/share/parameter/ob_parameter_macro.h +++ b/src/share/parameter/ob_parameter_macro.h @@ -84,7 +84,7 @@ access_specifier: : common::ObConfig ## param ## Item( \ local_container(), scope, #name, def, args) \ { \ - add_checker(new (std::nothrow) checker()); \ + add_checker(OB_NEW(checker, g_config_mem_attr)); \ } \ template \ ObConfig ## param ## Item ## _ ## name& operator=(T value) \ diff --git a/src/share/rc/ob_tenant_base.cpp b/src/share/rc/ob_tenant_base.cpp index 6e191662a9..70783aebba 100644 --- a/src/share/rc/ob_tenant_base.cpp +++ b/src/share/rc/ob_tenant_base.cpp @@ -54,10 +54,12 @@ ObTenantBase::ObTenantBase(const uint64_t id, bool enable_tenant_ctx_check) created_(false), mtl_init_ctx_(nullptr), tenant_role_value_(share::ObTenantRole::Role::PRIMARY_TENANT), + unit_max_cpu_(0), + unit_min_cpu_(0), + unit_memory_size_(0), cgroups_(nullptr), enable_tenant_ctx_check_(enable_tenant_ctx_check), thread_count_(0), - memory_size_(0), mini_mode_(false) { } @@ -374,7 +376,7 @@ int64_t ObTenantBase::get_max_session_num(const int64_t rl_max_session_num) max_session_num = rl_max_session_num; } else { /* As test, one session occupies 100K bytes*/ - max_session_num = max(100, (memory_size_ * 5 / 100) / (100<<10)); + max_session_num = max(100, (unit_memory_size_ * 5 / 100) / (100<<10)); } return max_session_num; } diff --git a/src/share/rc/ob_tenant_base.h b/src/share/rc/ob_tenant_base.h index 39fab76156..81194ff35a 100644 --- a/src/share/rc/ob_tenant_base.h +++ b/src/share/rc/ob_tenant_base.h @@ -74,6 +74,7 @@ namespace storage { class ObTabletGCService; } class ObLobManager; + class ObTableScanIterator; } namespace transaction { class ObTenantWeakReadService; // 租户弱一致性读服务 @@ -177,9 +178,11 @@ namespace detector // 实例的初始化和销毁逻辑由MTL_BIND接口指定。 // 使用MTL接口可以获取实例。 using ObPartTransCtxObjPool = common::ObServerObjectPool; +using ObTableScanIteratorObjPool = common::ObServerObjectPool; #define MTL_MEMBERS \ MTL_LIST( \ ObPartTransCtxObjPool*, \ + ObTableScanIteratorObjPool*, \ common::ObTenantIOManager*, \ storage::ObStorageLogger*, \ blocksstable::ObSharedMacroBlockMgr*, \ @@ -276,6 +279,7 @@ using ObPartTransCtxObjPool = common::ObServerObjectPoolunregister_module_thread_dynamic(th) #define MTL_IS_MINI_MODE() share::ObTenantEnv::get_tenant()->is_mini_mode() +#define MTL_CPU_COUNT() share::ObTenantEnv::get_tenant()->unit_max_cpu() // 注意MTL_BIND调用需要在租户创建之前,否则会导致租户创建时无法调用到绑定的函数。 #define MTL_BIND(INIT, DESTROY) \ @@ -379,13 +383,15 @@ public: } int update_thread_cnt(double tenant_unit_cpu); - int64_t update_memory_size(int64_t memory_size) + double unit_max_cpu() const { return unit_max_cpu_; } + double unit_min_cpu() const { return unit_min_cpu_; } + int64_t set_unit_memory_size(int64_t memory_size) { - int64_t orig_size = memory_size_; - memory_size_ = memory_size; + int64_t orig_size = unit_memory_size_; + unit_memory_size_ = memory_size; return orig_size; } - int64_t get_memory_size() { return memory_size_; } + int64_t unit_memory_size() const { return unit_memory_size_; } bool update_mini_mode(bool mini_mode) { bool orig_mode = mini_mode_; @@ -505,6 +511,10 @@ protected: bool created_; share::ObTenantModuleInitCtx *mtl_init_ctx_; share::ObTenantRole::Role tenant_role_value_; + // max/min cpu read from unit + double unit_max_cpu_; + double unit_min_cpu_; + int64_t unit_memory_size_; private: common::hash::ObHashSet tg_set_; @@ -515,7 +525,6 @@ private: ObCgroupCtrl *cgroups_; bool enable_tenant_ctx_check_; int64_t thread_count_; - int64_t memory_size_; bool mini_mode_; }; diff --git a/src/share/schema/ob_schema_mgr_cache.cpp b/src/share/schema/ob_schema_mgr_cache.cpp index 432ececa9c..d1148419d9 100644 --- a/src/share/schema/ob_schema_mgr_cache.cpp +++ b/src/share/schema/ob_schema_mgr_cache.cpp @@ -149,13 +149,15 @@ int ObSchemaMgrCache::init(int64_t init_cached_num, Mode mode) } else { max_cached_num_ = init_cached_num; mode_ = mode; - // only alloc once in the while process, so it is suitable to use new operator - schema_mgr_items_ = new (std::nothrow) ObSchemaMgrItem[MAX_SCHEMA_SLOT_NUM]; - if (NULL == schema_mgr_items_) { + auto attr = SET_USE_500("SchemaMgrCache", ObCtxIds::SCHEMA_SERVICE); + void *ptr = ob_malloc(sizeof(ObSchemaMgrItem[MAX_SCHEMA_SLOT_NUM]), attr); + if (NULL == ptr) { ret = OB_ALLOCATE_MEMORY_FAILED; LOG_ERROR("alloc mem failed", K(ret)); } else { + schema_mgr_items_ = (ObSchemaMgrItem*)ptr; for (int64_t i = 0; i < MAX_SCHEMA_SLOT_NUM; ++i) { + new (&schema_mgr_items_[i])ObSchemaMgrItem(); ObSchemaMgrItem &schema_mgr_item = schema_mgr_items_[i]; schema_mgr_item.schema_mgr_ = NULL; schema_mgr_item.ref_cnt_ = 0; diff --git a/src/storage/lob/ob_lob_manager.cpp b/src/storage/lob/ob_lob_manager.cpp index e0449628b1..b4c1aea907 100644 --- a/src/storage/lob/ob_lob_manager.cpp +++ b/src/storage/lob/ob_lob_manager.cpp @@ -620,7 +620,7 @@ int ObLobManager::query_inrow_get_iter( ret = OB_SIZE_OVERFLOW; LOG_WARN("data length is not enough.", K(ret), K(byte_offset), K(param.len_)); } else { - ObLobQueryIter* iter = common::sop_borrow(ObLobQueryIter); + ObLobQueryIter* iter = OB_NEW(ObLobQueryIter, ObMemAttr(MTL_ID(), "LobQueryIter")); if (OB_ISNULL(iter)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("alloc lob meta scan iterator fail", K(ret)); @@ -660,7 +660,7 @@ int ObLobManager::query( LOG_WARN("fail to get inrow query iter", K(ret)); if (OB_NOT_NULL(result)) { result->reset(); - common::sop_return(ObLobQueryIter, result); + OB_DELETE(ObLobQueryIter, "unused", result); result = nullptr; } } @@ -676,7 +676,7 @@ int ObLobManager::query( LOG_WARN("fail to get inrow query iter", K(ret)); if (OB_NOT_NULL(result)) { result->reset(); - common::sop_return(ObLobQueryIter, result); + OB_DELETE(ObLobQueryIter, "unused", result); result = nullptr; } } @@ -688,7 +688,7 @@ int ObLobManager::query( common::ObAddr dst_addr; ObLobCtx lob_ctx = lob_ctx_; param.lob_data_ = reinterpret_cast(lob_common->buffer_); - ObLobQueryIter* iter = common::sop_borrow(ObLobQueryIter); + ObLobQueryIter* iter = OB_NEW(ObLobQueryIter, ObMemAttr(MTL_ID(), "LobQueryIter")); if (OB_ISNULL(iter)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("alloc lob meta scan iterator fail", K(ret)); @@ -707,7 +707,7 @@ int ObLobManager::query( result = iter; } else if (OB_NOT_NULL(iter)) { iter->reset(); - common::sop_return(ObLobQueryIter, iter); + OB_DELETE(ObLobQueryIter, "unused", iter); } } } @@ -866,11 +866,11 @@ int ObLobManager::compare(ObLobAccessParam& param_left, } if (OB_NOT_NULL(iter_left)) { iter_left->reset(); - common::sop_return(ObLobQueryIter, iter_left); + OB_DELETE(ObLobQueryIter, "unused", iter_left); } if (OB_NOT_NULL(iter_right)) { iter_right->reset(); - common::sop_return(ObLobQueryIter, iter_right); + OB_DELETE(ObLobQueryIter, "unused", iter_right); } return ret; } @@ -1456,7 +1456,7 @@ int ObLobManager::append( } if (OB_NOT_NULL(iter)) { iter->reset(); - common::sop_return(ObLobQueryIter, iter); + OB_DELETE(ObLobQueryIter, "unused", iter); } } } @@ -2137,7 +2137,7 @@ int ObLobManager::write_inrow(ObLobAccessParam& param, ObLobLocatorV2& lob, uint } if (OB_NOT_NULL(iter)) { iter->reset(); - common::sop_return(ObLobQueryIter, iter); + OB_DELETE(ObLobQueryIter, "unused", iter); } } } @@ -2387,7 +2387,7 @@ int ObLobManager::write_outrow(ObLobAccessParam& param, ObLobLocatorV2& lob, uin } if (OB_NOT_NULL(iter)) { iter->reset(); - common::sop_return(ObLobQueryIter, iter); + OB_DELETE(ObLobQueryIter, "unused", iter); } } } @@ -2506,7 +2506,7 @@ int ObLobManager::write(ObLobAccessParam& param, ObString& data) } if (OB_NOT_NULL(iter)) { iter->reset(); - common::sop_return(ObLobQueryIter, iter); + OB_DELETE(ObLobQueryIter, "unused", iter); } } } diff --git a/src/storage/ob_storage_rpc.cpp b/src/storage/ob_storage_rpc.cpp index 39116b35d5..4b005079d4 100644 --- a/src/storage/ob_storage_rpc.cpp +++ b/src/storage/ob_storage_rpc.cpp @@ -1749,7 +1749,7 @@ int ObLobQueryP::process_read() } if (OB_NOT_NULL(iter)) { iter->reset(); - common::sop_return(ObLobQueryIter, iter); + OB_DELETE(ObLobQueryIter, "unused", iter); } } return ret; diff --git a/src/storage/tx_storage/ob_access_service.cpp b/src/storage/tx_storage/ob_access_service.cpp index 21704dd1ce..efadd657ad 100644 --- a/src/storage/tx_storage/ob_access_service.cpp +++ b/src/storage/tx_storage/ob_access_service.cpp @@ -244,7 +244,7 @@ int ObAccessService::table_scan( ret = OB_ERR_UNEXPECTED; LOG_ERROR("The result_ is already pointed to an valid object", K(ret), K(vparam), KPC(result), K(lbt())); - } else if (OB_ISNULL(iter = common::sop_borrow(ObTableScanIterator))) { + } else if (OB_ISNULL(iter = mtl_sop_borrow(ObTableScanIterator))) { ret = OB_ERR_UNEXPECTED; LOG_WARN("alloc table scan iterator fail", K(ret)); } else if (FALSE_IT(result = iter)) { @@ -1022,7 +1022,7 @@ int ObAccessService::revert_scan_iter(ObNewRowIterator *iter) if (OB_FAIL(table_scan_iter->check_ls_offline_after_read())) { LOG_WARN("discover ls offline after table scan", K(ret), KPC(table_scan_iter)); } - sop_return(ObTableScanIterator, table_scan_iter); + mtl_sop_return(ObTableScanIterator, table_scan_iter); } else { iter->~ObNewRowIterator(); } diff --git a/unittest/storage/tx/it/tx_node.cpp b/unittest/storage/tx/it/tx_node.cpp index c1ae4fb238..ff144f2d49 100644 --- a/unittest/storage/tx/it/tx_node.cpp +++ b/unittest/storage/tx/it/tx_node.cpp @@ -80,7 +80,7 @@ ObTxNode::ObTxNode(const int64_t ls_id, ls_id_(ls_id), tenant_id_(1001), tenant_(tenant_id_), - fake_part_trans_ctx_pool_(1001, false, false), + fake_part_trans_ctx_pool_(1001, false, false, 4), memtable_(NULL), msg_consumer_(ObString("TxNode"), &msg_queue_,