提交 e3c058b9 编写于 作者: Z ZenoWang 提交者: wangzelin.wzl

[FIX] memory leak of tx data

上级 71856466
......@@ -193,7 +193,9 @@ void ObTxDataTable::reset()
int ObTxDataTable::prepare_for_safe_destroy()
{
return clean_memtables_cache_();
int ret = clean_memtables_cache_();
LOG_INFO("tx data table prepare for safe destroy", KR(ret), K(get_ls_id()));
return ret;
}
int ObTxDataTable::offline()
......@@ -644,37 +646,32 @@ int ObTxDataTable::get_tx_data_in_memtables_cache_(const ObTransID tx_id,
int ObTxDataTable::check_tx_data_in_sstable_(const ObTransID tx_id, ObITxDataCheckFunctor &fn)
{
int ret = OB_SUCCESS;
ObTxData *tx_data = nullptr;
ObTxData tx_data;
tx_data.reset();
if (OB_FAIL(get_tx_data_in_sstable_(tx_id, tx_data))) {
STORAGE_LOG(WARN, "get tx data from sstable failed.", KR(ret), K(tx_id));
} else if (OB_ISNULL(tx_data)) {
ret = OB_ERR_UNEXPECTED;
STORAGE_LOG(ERROR, "unexpected nullptr of tx data", KR(ret), K(tx_id));
} else if (OB_FAIL(fn(*tx_data))) {
} else if (OB_FAIL(fn(tx_data))) {
STORAGE_LOG(WARN, "check tx data in sstable failed.", KR(ret), KP(this), K(tablet_id_));
}
// free tx data after using it
if (OB_NOT_NULL(tx_data)) {
free_tx_data(tx_data);
// free undo status list if exist
if (OB_NOT_NULL(tx_data.undo_status_list_.head_)) {
free_undo_status_list_(tx_data.undo_status_list_.head_);
}
return ret;
}
int ObTxDataTable::get_tx_data_in_sstable_(const transaction::ObTransID tx_id, ObTxData *&tx_data)
int ObTxDataTable::get_tx_data_in_sstable_(const transaction::ObTransID tx_id, ObTxData &tx_data)
{
int ret = OB_SUCCESS;
tx_data = nullptr;
ObTableIterParam iter_param = read_schema_.iter_param_;
ObTabletHandle &tablet_handle = iter_param.tablet_handle_;
if (tablet_handle.is_valid()) {
ret = OB_ERR_UNEXPECTED;
STORAGE_LOG(ERROR, "tablet handle should be empty", KR(ret), K(tablet_handle));
} else if (OB_FAIL(alloc_tx_data(tx_data))) {
STORAGE_LOG(WARN, "allocate tx data from tx data table failed.");
} else if (FALSE_IT(tx_data->tx_id_ = tx_id)) {
} else if (FALSE_IT(tx_data.tx_id_ = tx_id)) {
} else if (OB_FAIL(ls_tablet_svr_->get_tablet(tablet_id_, tablet_handle))) {
STORAGE_LOG(WARN, "get tablet from ls tablet service fail.", KR(ret), KP(this), K(tablet_id_));
} else if (OB_UNLIKELY(!tablet_handle.is_valid())) {
......@@ -684,7 +681,7 @@ int ObTxDataTable::get_tx_data_in_sstable_(const transaction::ObTransID tx_id, O
ObTxDataSingleRowGetter getter(iter_param, slice_allocator_);
if (OB_FAIL(getter.init(tx_id))) {
STORAGE_LOG(WARN, "init ObTxDataSingleRowGetter fail.", KR(ret), KP(this), K(tablet_id_));
} else if (OB_FAIL(getter.get_next_row(*tx_data))) {
} else if (OB_FAIL(getter.get_next_row(tx_data))) {
if (OB_ITER_END == ret) {
ret = OB_TRANS_CTX_NOT_EXIST;
}
......@@ -694,11 +691,6 @@ int ObTxDataTable::get_tx_data_in_sstable_(const transaction::ObTransID tx_id, O
}
}
// If get tx data in sstable failed, free the tx data and reset it.
if (OB_FAIL(ret) && (nullptr != tx_data)) {
free_tx_data(tx_data);
tx_data = nullptr;
}
return ret;
}
......@@ -1217,7 +1209,8 @@ int ObTxDataTable::calc_upper_trans_scn_(const SCN sstable_end_scn, SCN &upper_t
int ObTxDataTable::supplement_undo_actions_if_exist(ObTxData *&tx_data)
{
int ret = OB_SUCCESS;
ObTxData *tx_data_from_sstable = nullptr;
ObTxData tx_data_from_sstable;
tx_data_from_sstable.reset();
if (IS_NOT_INIT) {
ret = OB_NOT_INIT;
......@@ -1232,17 +1225,9 @@ int ObTxDataTable::supplement_undo_actions_if_exist(ObTxData *&tx_data)
} else {
STORAGE_LOG(WARN, "get tx data from sstable failed.", KR(ret));
}
} else if (OB_ISNULL(tx_data_from_sstable)) {
ret = OB_ERR_UNEXPECTED;
STORAGE_LOG(WARN, "unexpected nullptr of tx data", KR(ret), KPC(tx_data));
} else {
// assign and reset to avoid deep copy
tx_data->undo_status_list_ = tx_data_from_sstable->undo_status_list_;
tx_data_from_sstable->undo_status_list_.reset();
}
if (OB_NOT_NULL(tx_data_from_sstable)) {
free_tx_data(tx_data_from_sstable);
tx_data->undo_status_list_ = tx_data_from_sstable.undo_status_list_;
}
return ret;
}
......@@ -1325,24 +1310,16 @@ int ObTxDataTable::dump_tx_data_in_memtable_2_text_(const ObTransID tx_id, FILE
int ObTxDataTable::dump_tx_data_in_sstable_2_text_(const ObTransID tx_id, FILE *fd)
{
int ret = OB_SUCCESS;
ObTxData *tx_data = nullptr;
ObTxData tx_data;
tx_data.reset();
if (OB_FAIL(get_tx_data_in_sstable_(tx_id, tx_data))) {
STORAGE_LOG(WARN, "get tx data from sstable failed.", KR(ret), K(tx_id));
} else if (OB_ISNULL(tx_data)) {
ret = OB_ERR_UNEXPECTED;
STORAGE_LOG(ERROR, "unexpected nullptr of tx data", KR(ret), K(tx_id));
} else {
fprintf(fd, "********** Tx Data SSTable ***********\n\n");
tx_data->dump_2_text(fd);
tx_data.dump_2_text(fd);
fprintf(fd, "\n********** Tx Data SSTable ***********\n");
}
// free tx data after using it
if (OB_NOT_NULL(tx_data)) {
free_tx_data(tx_data);
}
return ret;
}
......
......@@ -74,6 +74,8 @@ public:
memtable_tail_ = -1;
memtable_handles_.reset();
}
TO_STRING_KV(K(memtable_head_), K(memtable_tail_), K(memtable_handles_));
};
struct CalcUpperInfo
......@@ -236,6 +238,7 @@ public: // ObTxDataTable
K_(is_started),
K_(tablet_id),
K_(calc_upper_info),
K_(memtables_cache),
KP_(ls),
KP_(ls_tablet_svr),
KP_(memtable_mgr),
......@@ -262,7 +265,7 @@ private:
int get_tx_data_in_cache_(const transaction::ObTransID tx_id, ObTxData *&tx_data);
int get_tx_data_in_sstable_(const transaction::ObTransID tx_id, ObTxData *&tx_data);
int get_tx_data_in_sstable_(const transaction::ObTransID tx_id, ObTxData &tx_data);
int insert_(ObTxData *&tx_data, ObTxDataMemtableWriteGuard &write_guard);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册