From 44e79da7d229fce0f5de48c552c986ed80690a16 Mon Sep 17 00:00:00 2001 From: obdev Date: Tue, 8 Nov 2022 12:05:34 +0000 Subject: [PATCH] [FIX] memory leak in tx data memtable --- src/storage/tx_table/ob_tx_data_memtable.cpp | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/storage/tx_table/ob_tx_data_memtable.cpp b/src/storage/tx_table/ob_tx_data_memtable.cpp index 6bd6cc0aa..b81891ec0 100644 --- a/src/storage/tx_table/ob_tx_data_memtable.cpp +++ b/src/storage/tx_table/ob_tx_data_memtable.cpp @@ -107,6 +107,18 @@ void ObTxDataMemtable::reset() void ObTxDataMemtable::reset_thread_local_list_() { for (int i = 0; i < MAX_TX_DATA_TABLE_CONCURRENCY; i++) { + ObTxDataSortListNode *cur_node = local_sort_list_head_[i].next_; + while (OB_NOT_NULL(cur_node)) { + ObTxData *tx_data = ObTxData::get_tx_data_by_sort_list_node(cur_node); + cur_node = cur_node->next_; + if (false == tx_data->is_in_tx_data_table_) { + if (OB_ISNULL(tx_data_map_)) { + STORAGE_LOG(ERROR, "tx_data_map is unexpected nullptr", KP(tx_data_map_), KPC(tx_data)); + } else { + tx_data_map_->revert(tx_data); + } + } + } local_sort_list_head_[i].reset(); } } @@ -265,13 +277,14 @@ int ObTxDataMemtable::construct_list_for_sort_() int64_t skip_list_node_cnt = 0; for (int i = 0; i < MAX_TX_DATA_TABLE_CONCURRENCY; i++) { cur_node = local_sort_list_head_[i].next_; + local_sort_list_head_[i].reset(); while (OB_NOT_NULL(cur_node)) { ObTxData *tx_data = ObTxData::get_tx_data_by_sort_list_node(cur_node); if (false == tx_data->is_in_tx_data_table_) { cur_node = cur_node->next_; // TODO : @gengli remove log info after stable - STORAGE_LOG(INFO, "skip one tx data", KPC(tx_data), KP(this), K(freezer_->get_ls_id())); + // STORAGE_LOG(INFO, "skip one tx data", KPC(tx_data), KP(this), K(freezer_->get_ls_id())); skip_list_node_cnt++; // revert must behind move pointer tx_data_map_->revert(tx_data);