[FEAT MERGE] Improve the inner implementation of tx table

Co-authored-by: kongfy <njukongfy@gmail.com>
This commit is contained in:
ZenoWang
2023-05-07 07:38:34 +00:00
committed by ob-robot
parent 1a4be45b79
commit ccde264e06
92 changed files with 4834 additions and 1542 deletions

View File

@ -23,6 +23,7 @@
#include "storage/tx_storage/ob_tenant_freezer.h"
#include "storage/tx_table/ob_tx_ctx_table.h"
#include "storage/tx_table/ob_tx_table_define.h"
#include "storage/tx_table/ob_tx_data_cache.h"
#include "storage/tablet/ob_tablet.h"
#define USING_LOG_PREFIX STORAGE
@ -69,6 +70,7 @@ int ObTxDataTable::init(ObLS *ls, ObTxCtxTable *tx_ctx_table)
TX_DATA_MEM_LEAK_DEBUG_CODE
ls_ = ls;
ls_id_ = ls->get_ls_id();
memtable_mgr_ = static_cast<ObTxDataMemtableMgr *>(memtable_mgr_handle.get_memtable_mgr());
memtable_mgr_->set_slice_allocator(&slice_allocator_);
tx_ctx_table_ = tx_ctx_table;
@ -219,7 +221,7 @@ void ObTxDataTable::reset()
int ObTxDataTable::prepare_for_safe_destroy()
{
int ret = clean_memtables_cache_();
LOG_INFO("tx data table prepare for safe destroy", KR(ret), K(get_ls_id()));
LOG_INFO("tx data table prepare for safe destroy", KR(ret), K(ls_id_));
return ret;
}
@ -418,7 +420,7 @@ int ObTxDataTable::insert_(ObTxData *&tx_data, ObTxDataMemtableWriteGuard &write
STORAGE_LOG(WARN,
"insert tx data into tx data memtable failed",
KR(ret),
"ls_id", get_ls_id(),
K(ls_id_),
KPC(tx_data),
KPC(tx_data_memtable));
} else {
@ -448,16 +450,16 @@ int ObTxDataTable::insert_(ObTxData *&tx_data, ObTxDataMemtableWriteGuard &write
return ret;
}
int ObTxDataTable::check_with_tx_data(const ObTransID tx_id, ObITxDataCheckFunctor &fn)
int ObTxDataTable::check_with_tx_data(const ObTransID tx_id, ObITxDataCheckFunctor &fn, ObTxDataGuard &tx_data_guard)
{
int ret = OB_SUCCESS;
if (IS_NOT_INIT) {
ret = OB_NOT_INIT;
STORAGE_LOG(WARN, "tx data table is not init.", KR(ret), KP(this), K(tx_id));
} else if (OB_SUCC(check_tx_data_in_memtable_(tx_id, fn))) {
} else if (OB_SUCC(check_tx_data_in_memtable_(tx_id, fn, tx_data_guard))) {
// successfully do check function in memtable, check done
STORAGE_LOG(DEBUG, "tx data table check with tx memtable data succeed", K(tx_id), K(fn));
} else if (OB_TRANS_CTX_NOT_EXIST == ret && OB_SUCC(check_tx_data_in_sstable_(tx_id, fn))) {
} else if (OB_TRANS_CTX_NOT_EXIST == ret && OB_SUCC(check_tx_data_in_sstable_(tx_id, fn, tx_data_guard))) {
// successfully do check function in sstable
STORAGE_LOG(DEBUG, "tx data table check with tx sstable data succeed", K(tx_id), K(fn));
} else {
@ -465,15 +467,19 @@ int ObTxDataTable::check_with_tx_data(const ObTransID tx_id, ObITxDataCheckFunct
K(tablet_id_));
}
if (OB_SUCC(ret) && OB_NOT_NULL(tx_data_guard.tx_data()) && (ObTxData::RUNNING == tx_data_guard.tx_data()->state_)) {
ret = OB_EAGAIN;
STORAGE_LOG(WARN, "read a running state tx data from tx data table, need retry", KR(ret), K(tx_data_guard));
}
return ret;
}
int ObTxDataTable::check_tx_data_in_memtable_(const ObTransID tx_id, ObITxDataCheckFunctor &fn)
int ObTxDataTable::check_tx_data_in_memtable_(const ObTransID tx_id, ObITxDataCheckFunctor &fn, ObTxDataGuard &tx_data_guard)
{
int ret = OB_SUCCESS;
while (OB_SUCC(ret)) {
if (OB_FAIL(check_tx_data_with_cache_once_(tx_id, fn))) {
if (OB_FAIL(check_tx_data_with_cache_once_(tx_id, fn, tx_data_guard))) {
if (OB_EAGAIN == ret) {
ret = OB_SUCCESS;
if (OB_FAIL(update_memtables_cache())) {
@ -495,11 +501,10 @@ int ObTxDataTable::check_tx_data_in_memtable_(const ObTransID tx_id, ObITxDataCh
return ret;
}
int ObTxDataTable::check_tx_data_with_cache_once_(const transaction::ObTransID tx_id, ObITxDataCheckFunctor &fn)
int ObTxDataTable::check_tx_data_with_cache_once_(const transaction::ObTransID tx_id, ObITxDataCheckFunctor &fn, ObTxDataGuard &tx_data_guard)
{
int ret = OB_SUCCESS;
ObTxDataGuard tx_data_guard;
bool find = false;
if (OB_FAIL(get_tx_data_from_cache_(tx_id, tx_data_guard, find))) {
@ -516,6 +521,7 @@ int ObTxDataTable::check_tx_data_with_cache_once_(const transaction::ObTransID t
K(tx_data_guard),
KPC(tx_data_guard.tx_data()));
} else {
EVENT_INC(ObStatEventIds::TX_DATA_READ_TX_DATA_MEMTABLE_COUNT);
ret = fn(*tx_data_guard.tx_data());
}
} else {
@ -659,27 +665,30 @@ int ObTxDataTable::get_tx_data_in_memtables_cache_(const ObTransID tx_id,
return ret;
}
// For ease of understanding, this function can be regarded as the following steps:
// 1. Try to get tx data from sstable cache if we want to use the cache.
// 2. If we 1) dont want to get tx data from cache; 2) get from cache failed; 3) get an tx data with
// running state from cachce, trying to get tx data from sstable.
// 3. Call functor with tx data.
// 4. Free or revert tx data according to where it is from.
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,
ObTxDataGuard &tx_data_guard)
{
int ret = OB_SUCCESS;
ObTxData tx_data;
tx_data.reset();
tx_data_guard.reset();
if (OB_FAIL(get_tx_data_in_sstable_(tx_id, tx_data))) {
if (OB_FAIL(alloc_tx_data(tx_data_guard))) {
STORAGE_LOG(WARN, "allocate tx data to read from sstable failed", KR(ret), K(tx_data_guard));
} else if (OB_ISNULL(tx_data_guard.tx_data())) {
ret = OB_ERR_UNEXPECTED;
STORAGE_LOG(WARN, "tx data is unexpected null", KR(ret), K(tx_data_guard));
} else if (OB_FAIL(get_tx_data_in_sstable_(tx_id, *tx_data_guard.tx_data()))) {
STORAGE_LOG(WARN, "get tx data from sstable failed.", 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_));
} else {
EVENT_INC(ObStatEventIds::TX_DATA_READ_TX_DATA_SSTABLE_COUNT);
if (OB_FAIL(fn(*tx_data_guard.tx_data()))) {
STORAGE_LOG(WARN, "check tx data in sstable failed.", KR(ret), KP(this),
K(tablet_id_));
}
}
if (OB_NOT_NULL(tx_data.undo_status_list_.head_)) {
free_undo_status_list_(tx_data.undo_status_list_.head_);
tx_data.undo_status_list_.head_ = nullptr;
if (OB_FAIL(ret)) {
tx_data_guard.reset();
}
return ret;
}
@ -722,6 +731,7 @@ int ObTxDataTable::get_recycle_scn(SCN &recycle_scn)
ObLSTabletIterator iterator;
ObMigrationStatus migration_status;
share::ObLSRestoreStatus restore_status;
ObTimeGuard tg("get recycle scn", 0);
SCN min_end_scn = SCN::max_scn();
SCN min_end_scn_from_old_tablets = SCN::max_scn();
SCN min_end_scn_from_latest_tablets = SCN::max_scn();
@ -745,6 +755,7 @@ int ObTxDataTable::get_recycle_scn(SCN &recycle_scn)
} else if (OB_FAIL(get_ls_min_end_scn_in_latest_tablets_(min_end_scn_from_latest_tablets))) {
// get_ls_min_end_scn_in_latest_tablets must before get_ls_min_end_scn_in_old_tablets
STORAGE_LOG(WARN, "fail to get ls min end log ts in all of latest tablets", KR(ret));
} else if (FALSE_IT(tg.click("iterate tablet finish"))) {
} else if (OB_FAIL(ls_tablet_svr_->get_ls_min_end_scn_in_old_tablets(min_end_scn_from_old_tablets))) {
STORAGE_LOG(WARN, "fail to get ls min end log ts in all of old tablets", KR(ret));
} else {
@ -768,7 +779,8 @@ int ObTxDataTable::get_recycle_scn(SCN &recycle_scn)
"ls_id", ls_->get_ls_id(),
K(recycle_scn),
K(min_end_scn_from_old_tablets),
K(min_end_scn_from_latest_tablets));
K(min_end_scn_from_latest_tablets),
K(tg));
return ret;
}
@ -882,12 +894,12 @@ int ObTxDataTable::get_upper_trans_version_before_given_scn(const SCN sstable_en
ret = OB_ERR_UNEXPECTED;
STORAGE_LOG(ERROR, "invalid cache for upper trans version calculation", KR(ret));
} else if (OB_FAIL(calc_upper_trans_scn_(sstable_end_scn, upper_trans_version))) {
STORAGE_LOG(WARN, "calc upper trans version failed", KR(ret), "ls_id", get_ls_id());
STORAGE_LOG(WARN, "calc upper trans version failed", KR(ret), K(ls_id_));
} else {
FLOG_INFO("get upper trans version finish.",
KR(ret),
K(skip_calc),
"ls_id", get_ls_id(),
K(ls_id_),
K(sstable_end_scn),
K(upper_trans_version));
}
@ -1027,7 +1039,7 @@ bool ObTxDataTable::skip_this_sstable_end_scn_(const SCN &sstable_end_scn)
// make sure the max decided log ts is greater than sstable_end_scn
if (OB_FAIL(ls_->get_max_decided_scn(max_decided_scn))) {
need_skip = true;
STORAGE_LOG(WARN, "get max decided log ts failed", KR(ret), "ls_id", get_ls_id().id());
STORAGE_LOG(WARN, "get max decided log ts failed", KR(ret), K(ls_id_).id());
}
// check if the min_start_scn_in_ctx is larger than sstable_end_scn
@ -1243,12 +1255,10 @@ int ObTxDataTable::calc_upper_trans_scn_(const SCN sstable_end_scn, SCN &upper_t
K(sstable_end_scn),
K(upper_trans_version),
K(calc_upper_trans_version_cache_),
"ls_id", get_ls_id(),
K(ls_id_),
"array_count", array.count(),
"chose_idx", l);
for (int i = 0; i < array.count(); i++) {
STORAGE_LOG(INFO, "commit versions array : ", K(i), K(array.at(i)));
}
return ret;
}
@ -1376,7 +1386,7 @@ int ObTxDataTable::dump_tx_data_in_sstable_2_text_(const ObTransID tx_id, FILE *
return ret;
}
share::ObLSID ObTxDataTable::get_ls_id() { return ls_->get_ls_id(); }
share::ObLSID ObTxDataTable::get_ls_id() { return ls_id_; }
} // namespace storage