check mds mem leak by ENABLE_DEBUG_LOG
This commit is contained in:
		| @ -124,7 +124,7 @@ int ObPartTransCtx::init(const uint64_t tenant_id, | ||||
|       TRANS_LOG(WARN, "init log cbs failed", KR(ret), K(trans_id), K(ls_id)); | ||||
|     } else if (OB_FAIL(ctx_tx_data_.init(trans_expired_time, ls_ctx_mgr, trans_id))) { | ||||
|       TRANS_LOG(WARN, "init ctx tx data failed",K(ret), K(trans_id), K(ls_id)); | ||||
|     } else if (OB_FAIL(mds_cache_.init(tenant_id))) { | ||||
|     } else if (OB_FAIL(mds_cache_.init(tenant_id, ls_id, trans_id))) { | ||||
|       TRANS_LOG(WARN, "init mds cache failed", K(ret), K(trans_id), K(ls_id)); | ||||
|     } | ||||
|   } | ||||
|  | ||||
| @ -18,14 +18,17 @@ namespace oceanbase | ||||
| namespace transaction | ||||
| { | ||||
|  | ||||
| int ObTxMDSCache::init(int64_t tenant_id) | ||||
| int ObTxMDSCache::init(const int64_t tenant_id, const share::ObLSID ls_id, const ObTransID tx_id) | ||||
| { | ||||
|   int ret = OB_SUCCESS; | ||||
|  | ||||
|   ObMemAttr attr(tenant_id, "MdsMemHash"); | ||||
|   if (OB_FAIL(mem_stat_hash_.create(16, attr, attr))) { | ||||
|     TRANS_LOG(WARN, "create mds mem stat failed", K(ret), K(tenant_id)); | ||||
|   } | ||||
| #ifdef  ENABLE_DEBUG_LOG | ||||
|   tenant_id_ = tenant_id; | ||||
|   ls_id_ = ls_id; | ||||
|   tx_id_ = tx_id; | ||||
|   record_mem_ret_ = OB_SUCCESS; | ||||
|  | ||||
| #endif | ||||
|  | ||||
|   return ret; | ||||
| } | ||||
| @ -38,7 +41,13 @@ void ObTxMDSCache::reset() | ||||
|   submitted_iterator_ = mds_list_.end(); // ObTxBufferNodeList::iterator(); | ||||
|   need_retry_submit_mds_ = false; | ||||
|   max_register_no_ = 0; | ||||
| #ifdef  ENABLE_DEBUG_LOG | ||||
|   tenant_id_ = 0; | ||||
|   ls_id_.reset(); | ||||
|   tx_id_.reset(); | ||||
|   mem_stat_hash_.destroy(); | ||||
|   record_mem_ret_ = OB_SUCCESS; | ||||
| #endif | ||||
| } | ||||
|  | ||||
| void ObTxMDSCache::destroy() | ||||
| @ -52,7 +61,14 @@ void ObTxMDSCache::destroy() | ||||
|     } | ||||
|     tmp_node.get_buffer_ctx_node().destroy_ctx(); | ||||
|   } | ||||
|  | ||||
| #ifdef ENABLE_DEBUG_LOG | ||||
|   tenant_id_ = 0; | ||||
|   ls_id_.reset(); | ||||
|   tx_id_.reset(); | ||||
|   mem_stat_hash_.destroy(); | ||||
|   record_mem_ret_ = OB_SUCCESS; | ||||
| #endif | ||||
| } | ||||
|  | ||||
| int ObTxMDSCache::alloc_mds_node(const ObPartTransCtx *tx_ctx, | ||||
| @ -84,22 +100,36 @@ int ObTxMDSCache::alloc_mds_node(const ObPartTransCtx *tx_ctx, | ||||
|     data.assign_ptr(reinterpret_cast<char *>(ptr), buf_len); | ||||
|   } | ||||
|  | ||||
| #ifdef ENABLE_DEBUG_LOG | ||||
|   if (!mem_stat_hash_.created()) { | ||||
|     ObMemAttr attr(tenant_id_, "MdsMemHash"); | ||||
|     if (OB_TMP_FAIL(mem_stat_hash_.create(16, attr, attr))) { | ||||
|       record_mem_ret_ = tmp_ret; | ||||
|       TRANS_LOG(WARN, "create mds mem stat failed", K(ret), K(tmp_ret), K(tenant_id_), K(ls_id_), | ||||
|                 K(tx_id_), K(record_mem_ret_)); | ||||
|     } | ||||
|   } | ||||
|   if (OB_SUCCESS == tmp_ret) { | ||||
|     if (OB_TMP_FAIL(mem_stat_hash_.get_refactored(cur_register_no, tmp_mem_stat))) { | ||||
|       if (OB_HASH_NOT_EXIST != tmp_ret) { | ||||
|         TRANS_LOG(ERROR, "get tmp_mem_stat from mem_stat_hash failed", K(ret), K(tmp_ret), | ||||
|                 K(cur_register_no), K(tmp_mem_stat), KPC(tx_ctx)); | ||||
|                   K(cur_register_no), K(tmp_mem_stat), K(tenant_id_), K(ls_id_), K(tx_id_), | ||||
|                   K(record_mem_ret_)); | ||||
|       } | ||||
|       tmp_mem_stat.reset(); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   if (OB_SUCCESS == tmp_ret || OB_HASH_NOT_EXIST == tmp_ret) { | ||||
|     tmp_mem_stat.alloc_cnt_++; | ||||
|     if (OB_TMP_FAIL(mem_stat_hash_.set_refactored(cur_register_no, tmp_mem_stat, 1))) { | ||||
|       TRANS_LOG(ERROR, "insert mem_stat_ into hash table failed", K(ret), K(tmp_ret), | ||||
|                 K(cur_register_no), K(tmp_mem_stat),KPC(tx_ctx) ); | ||||
|       record_mem_ret_ = tmp_ret; | ||||
|       TRANS_LOG(WARN, "insert mem_stat_ into hash table failed", K(ret), K(tmp_ret), | ||||
|                 K(cur_register_no), K(tmp_mem_stat), K(tenant_id_), K(ls_id_), K(tx_id_), | ||||
|                 K(record_mem_ret_)); | ||||
|     } | ||||
|  | ||||
|   } | ||||
| #endif | ||||
|  | ||||
|   return ret; | ||||
| } | ||||
| @ -119,9 +149,17 @@ void ObTxMDSCache::free_mds_node(common::ObString &data, uint64_t register_no) | ||||
|  | ||||
|   MultiTxDataFactory::free(data.ptr()); | ||||
|  | ||||
| #ifdef ENABLE_DEBUG_LOG | ||||
|   if (OB_TMP_FAIL(mem_stat_hash_.get_refactored(cur_register_no, tmp_mem_stat))) { | ||||
|     TRANS_LOG_RET(ERROR, tmp_ret, "get tmp_mem_stat from mem_stat_hash failed", K(ret), K(tmp_ret), | ||||
|                   K(cur_register_no), K(tmp_mem_stat)); | ||||
|     if (record_mem_ret_ != OB_SUCCESS) { | ||||
|       TRANS_LOG_RET(WARN, tmp_ret, "get tmp_mem_stat from mem_stat_hash failed", K(ret), K(tmp_ret), | ||||
|                     K(cur_register_no), K(tmp_mem_stat), K(tenant_id_), K(ls_id_), K(tx_id_), | ||||
|                     K(record_mem_ret_)); | ||||
|     } else { | ||||
|       TRANS_LOG_RET(ERROR, tmp_ret, "get tmp_mem_stat from mem_stat_hash failed", K(ret), | ||||
|                     K(tmp_ret), K(cur_register_no), K(tmp_mem_stat), K(tenant_id_), K(ls_id_), | ||||
|                     K(tx_id_), K(record_mem_ret_)); | ||||
|     } | ||||
|     tmp_mem_stat.reset(); | ||||
|   } | ||||
|  | ||||
| @ -130,22 +168,33 @@ void ObTxMDSCache::free_mds_node(common::ObString &data, uint64_t register_no) | ||||
|     if (tmp_mem_stat.free_cnt_ >= tmp_mem_stat.alloc_cnt_) { | ||||
|       if (OB_TMP_FAIL(mem_stat_hash_.erase_refactored(cur_register_no))) { | ||||
|         TRANS_LOG_RET(ERROR, tmp_ret, "insert mem_stat_ into hash table failed", K(ret), K(tmp_ret), | ||||
|                       K(cur_register_no), K(tmp_mem_stat)); | ||||
|                       K(cur_register_no), K(tmp_mem_stat), K(tmp_mem_stat), K(tenant_id_), | ||||
|                       K(ls_id_), K(tx_id_), K(record_mem_ret_)); | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| #endif | ||||
| } | ||||
|  | ||||
| bool ObTxMDSCache::is_mem_leak() | ||||
| { | ||||
|   bool mem_leak = !mem_stat_hash_.empty(); | ||||
|   bool mem_leak = false; | ||||
|  | ||||
| #ifdef ENABLE_DEBUG_LOG | ||||
|   mem_leak = !mem_stat_hash_.empty(); | ||||
|   if (mem_leak) { | ||||
|     for (ObTxMDSMemStatHash::iterator iter = mem_stat_hash_.begin(); iter != mem_stat_hash_.end(); | ||||
|          iter++) { | ||||
|       TRANS_LOG_RET(ERROR, OB_ERR_UNEXPECTED, "mds node mem leak", K(iter->first), K(iter->second)); | ||||
|       if (record_mem_ret_ != OB_SUCCESS) { | ||||
|         TRANS_LOG_RET(WARN, OB_ERR_UNEXPECTED, "mds node mem leak", K(iter->first), K(iter->second), | ||||
|                       K(tenant_id_), K(ls_id_), K(tx_id_), K(record_mem_ret_)); | ||||
|       } else { | ||||
|         TRANS_LOG_RET(ERROR, OB_ERR_UNEXPECTED, "mds node mem leak", K(iter->first), | ||||
|                       K(iter->second), K(tenant_id_), K(ls_id_), K(tx_id_), K(record_mem_ret_)); | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| #endif | ||||
|  | ||||
|   return mem_leak; | ||||
| } | ||||
|  | ||||
| @ -51,7 +51,7 @@ class ObTxMDSCache | ||||
| { | ||||
| public: | ||||
|   ObTxMDSCache(TransModulePageAllocator &allocator) : mds_list_(allocator) { reset(); } | ||||
|   int init(int64_t tenant_id); | ||||
|   int init(const int64_t tenant_id, const share::ObLSID ls_id, const ObTransID tx_id); | ||||
|   void reset(); | ||||
|   void destroy(); | ||||
|  | ||||
| @ -101,7 +101,14 @@ private: | ||||
|   ObTxBufferNodeList mds_list_; | ||||
|   ObTxBufferNodeList::iterator submitted_iterator_; | ||||
|  | ||||
| #ifdef ENABLE_DEBUG_LOG | ||||
|   int64_t tenant_id_; | ||||
|   share::ObLSID ls_id_; | ||||
|   ObTransID  tx_id_; | ||||
|  | ||||
|   int record_mem_ret_; | ||||
|   ObTxMDSMemStatHash mem_stat_hash_; | ||||
| #endif | ||||
| }; | ||||
|  | ||||
| class ObTxMDSRange | ||||
|  | ||||
		Reference in New Issue
	
	Block a user
	 obdev
					obdev