[FIX] memory leak of tx data

This commit is contained in:
ZenoWang
2022-11-28 03:20:22 +00:00
committed by ob-robot
parent 34ce8ef878
commit 7597a4f144
2 changed files with 22 additions and 42 deletions

View File

@ -193,7 +193,9 @@ void ObTxDataTable::reset()
int ObTxDataTable::prepare_for_safe_destroy() 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() 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 ObTxDataTable::check_tx_data_in_sstable_(const ObTransID tx_id, ObITxDataCheckFunctor &fn)
{ {
int ret = OB_SUCCESS; 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))) { 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)); STORAGE_LOG(WARN, "get tx data from sstable failed.", KR(ret), K(tx_id));
} else if (OB_ISNULL(tx_data)) { } else if (OB_FAIL(fn(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))) {
STORAGE_LOG(WARN, "check tx data in sstable failed.", KR(ret), KP(this), K(tablet_id_)); STORAGE_LOG(WARN, "check tx data in sstable failed.", KR(ret), KP(this), K(tablet_id_));
} }
// free tx data after using it // free undo status list if exist
if (OB_NOT_NULL(tx_data)) { if (OB_NOT_NULL(tx_data.undo_status_list_.head_)) {
free_tx_data(tx_data); free_undo_status_list_(tx_data.undo_status_list_.head_);
} }
return ret; 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; int ret = OB_SUCCESS;
tx_data = nullptr;
ObTableIterParam iter_param = read_schema_.iter_param_; ObTableIterParam iter_param = read_schema_.iter_param_;
ObTabletHandle &tablet_handle = iter_param.tablet_handle_; ObTabletHandle &tablet_handle = iter_param.tablet_handle_;
if (tablet_handle.is_valid()) { if (tablet_handle.is_valid()) {
ret = OB_ERR_UNEXPECTED; ret = OB_ERR_UNEXPECTED;
STORAGE_LOG(ERROR, "tablet handle should be empty", KR(ret), K(tablet_handle)); STORAGE_LOG(ERROR, "tablet handle should be empty", KR(ret), K(tablet_handle));
} else if (OB_FAIL(alloc_tx_data(tx_data))) { } else if (FALSE_IT(tx_data.tx_id_ = tx_id)) {
STORAGE_LOG(WARN, "allocate tx data from tx data table failed.");
} else if (FALSE_IT(tx_data->tx_id_ = tx_id)) {
} else if (OB_FAIL(ls_tablet_svr_->get_tablet(tablet_id_, tablet_handle))) { } 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_)); 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())) { } 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_); ObTxDataSingleRowGetter getter(iter_param, slice_allocator_);
if (OB_FAIL(getter.init(tx_id))) { if (OB_FAIL(getter.init(tx_id))) {
STORAGE_LOG(WARN, "init ObTxDataSingleRowGetter fail.", KR(ret), KP(this), K(tablet_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) { if (OB_ITER_END == ret) {
ret = OB_TRANS_CTX_NOT_EXIST; 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; 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 ObTxDataTable::supplement_undo_actions_if_exist(ObTxData *&tx_data)
{ {
int ret = OB_SUCCESS; int ret = OB_SUCCESS;
ObTxData *tx_data_from_sstable = nullptr; ObTxData tx_data_from_sstable;
tx_data_from_sstable.reset();
if (IS_NOT_INIT) { if (IS_NOT_INIT) {
ret = OB_NOT_INIT; ret = OB_NOT_INIT;
@ -1232,17 +1225,9 @@ int ObTxDataTable::supplement_undo_actions_if_exist(ObTxData *&tx_data)
} else { } else {
STORAGE_LOG(WARN, "get tx data from sstable failed.", KR(ret)); 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 { } else {
// assign and reset to avoid deep copy // assign and reset to avoid deep copy
tx_data->undo_status_list_ = tx_data_from_sstable->undo_status_list_; 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);
} }
return ret; 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 ObTxDataTable::dump_tx_data_in_sstable_2_text_(const ObTransID tx_id, FILE *fd)
{ {
int ret = OB_SUCCESS; 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))) { 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)); 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 { } else {
fprintf(fd, "********** Tx Data SSTable ***********\n\n"); 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"); 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; return ret;
} }

View File

@ -74,6 +74,8 @@ public:
memtable_tail_ = -1; memtable_tail_ = -1;
memtable_handles_.reset(); memtable_handles_.reset();
} }
TO_STRING_KV(K(memtable_head_), K(memtable_tail_), K(memtable_handles_));
}; };
struct CalcUpperInfo struct CalcUpperInfo
@ -236,6 +238,7 @@ public: // ObTxDataTable
K_(is_started), K_(is_started),
K_(tablet_id), K_(tablet_id),
K_(calc_upper_info), K_(calc_upper_info),
K_(memtables_cache),
KP_(ls), KP_(ls),
KP_(ls_tablet_svr), KP_(ls_tablet_svr),
KP_(memtable_mgr), 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_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); int insert_(ObTxData *&tx_data, ObTxDataMemtableWriteGuard &write_guard);