[FEAT MERGE] Set different table mode and compaction strategies to optimize buffer table performance.

Co-authored-by: ZenoWang <wzybuaasoft@163.com>
This commit is contained in:
Tsunaou
2024-06-18 02:58:53 +00:00
committed by ob-robot
parent a5f60f4681
commit b29a7dd782
56 changed files with 2108 additions and 675 deletions

View File

@ -446,6 +446,7 @@ void ObReplayRestartTest::restart_test()
{
int ret = OB_SUCCESS;
ObLS *ls = nullptr;
ObTxTable *tx_table = nullptr;
ObTxDataTable *tx_data_table = nullptr;
share::SCN max_decided_scn = share::SCN::min_scn();
share::SCN upper_trans_version = share::SCN::min_scn();
@ -457,11 +458,12 @@ void ObReplayRestartTest::restart_test()
ASSERT_EQ(OB_SUCCESS, ls->get_max_decided_scn(max_decided_scn));
ASSERT_EQ(false, max_decided_scn.is_min());
tx_data_table = ls->get_tx_table()->get_tx_data_table();
tx_table = ls->get_tx_table();
tx_data_table = tx_table->get_tx_data_table();
{
// 场景一: keep alive日志没有被回放,min_start_scn为初始值状态,跳过计算upper_trans_version
ASSERT_EQ(SCN::min_scn(), tx_data_table->calc_upper_info_.min_start_scn_in_ctx_);
ASSERT_EQ(SCN::min_scn(), tx_table->ctx_min_start_scn_info_.min_start_scn_in_ctx_);
upper_trans_version.set_min();
FLOG_INFO("get upper trans version, situation 1:", K(SSTABLE_END_SCN));
ASSERT_EQ(OB_SUCCESS,
@ -473,8 +475,8 @@ void ObReplayRestartTest::restart_test()
REPLAY_BARRIER = SCN::plus(KEEP_ALIVE_SCN, 1);
int64_t retry_times = 100;
while (--retry_times > 0) {
tx_data_table->update_calc_upper_info_(SCN::max_scn() /*max_decided_scn*/);
if ( !tx_data_table->calc_upper_info_.min_start_scn_in_ctx_.is_min()) {
tx_table->update_min_start_scn_info(SCN::max_scn() /*max_decided_scn*/);
if ( !tx_table->ctx_min_start_scn_info_.min_start_scn_in_ctx_.is_min()) {
break;
} else {
::sleep(1);
@ -502,8 +504,8 @@ void ObReplayRestartTest::restart_test()
MinStartScnStatus status;
while (--retry_times > 0) {
ls->get_min_start_scn(min_start_scn, keep_alive_scn, status);
tx_data_table->update_calc_upper_info_(SCN::max_scn() /*max_decided_scn*/);
if (tx_data_table->calc_upper_info_.min_start_scn_in_ctx_ > SSTABLE_END_SCN) {
tx_table->update_min_start_scn_info(SCN::max_scn() /*max_decided_scn*/);
if (tx_table->ctx_min_start_scn_info_.min_start_scn_in_ctx_ > SSTABLE_END_SCN) {
break;
} else {
::sleep(1);
@ -514,21 +516,21 @@ void ObReplayRestartTest::restart_test()
status);
}
}
ASSERT_GT(tx_data_table->calc_upper_info_.min_start_scn_in_ctx_, SSTABLE_END_SCN);
ASSERT_GT(tx_table->ctx_min_start_scn_info_.min_start_scn_in_ctx_, SSTABLE_END_SCN);
retry_times = 60;
while (--retry_times > 0) {
ASSERT_EQ(OB_SUCCESS, ls->get_max_decided_scn(max_decided_scn));
if (max_decided_scn > tx_data_table->calc_upper_info_.keep_alive_scn_) {
if (max_decided_scn > tx_table->ctx_min_start_scn_info_.keep_alive_scn_) {
break;
} else {
::sleep(1);
fprintf(stdout, "waiting max decided scn, max_decided_scn = %lu keep_alive_scn = %lu\n",
max_decided_scn.get_val_for_inner_table_field(),
tx_data_table->calc_upper_info_.keep_alive_scn_.get_val_for_inner_table_field());
tx_table->ctx_min_start_scn_info_.keep_alive_scn_.get_val_for_inner_table_field());
}
}
ASSERT_GT(max_decided_scn, tx_data_table->calc_upper_info_.keep_alive_scn_);
ASSERT_GT(max_decided_scn, tx_table->ctx_min_start_scn_info_.keep_alive_scn_);
upper_trans_version.set_min();
FLOG_INFO("get upper trans version, situation 3:", K(SSTABLE_END_SCN));
@ -537,7 +539,7 @@ void ObReplayRestartTest::restart_test()
::sleep(10);
STORAGE_LOG(INFO, "finish restart test", K(upper_trans_version), K(SSTABLE_END_SCN), K(tx_data_table->calc_upper_info_));
STORAGE_LOG(INFO, "finish restart test", K(upper_trans_version), K(SSTABLE_END_SCN), K(tx_table->ctx_min_start_scn_info_));
ASSERT_LT(upper_trans_version, SCN::max_scn());
}
}
@ -640,47 +642,6 @@ int main(int argc, char **argv)
namespace oceanbase {
namespace storage {
void ObTxDataTable::update_calc_upper_info_(const SCN &max_decided_scn)
{
int64_t cur_ts = common::ObTimeUtility::fast_current_time();
SpinWLockGuard lock_guard(calc_upper_info_.lock_);
// recheck update condition and do update calc_upper_info
/**********************************************************/
//if (cur_ts - calc_upper_info_.update_ts_ > 30_s && max_decided_scn> calc_upper_info_.keep_alive_scn_) {
/**********************************************************/
SCN min_start_scn = SCN::min_scn();
SCN keep_alive_scn = SCN::min_scn();
MinStartScnStatus status;
ls_->get_min_start_scn(min_start_scn, keep_alive_scn, status);
if (MinStartScnStatus::UNKOWN == status) {
// do nothing
} else {
int ret = OB_SUCCESS;
CalcUpperInfo tmp_calc_upper_info;
tmp_calc_upper_info.keep_alive_scn_ = keep_alive_scn;
tmp_calc_upper_info.update_ts_ = cur_ts;
if (MinStartScnStatus::NO_CTX == status) {
// use the previous keep_alive_scn as min_start_scn
tmp_calc_upper_info.min_start_scn_in_ctx_ = calc_upper_info_.keep_alive_scn_;
} else if (MinStartScnStatus::HAS_CTX == status) {
tmp_calc_upper_info.min_start_scn_in_ctx_ = min_start_scn;
} else {
ret = OB_ERR_UNEXPECTED;
STORAGE_LOG(ERROR, "invalid min start scn status", K(min_start_scn), K(keep_alive_scn), K(status));
}
if (OB_FAIL(ret)) {
} else if (tmp_calc_upper_info.min_start_scn_in_ctx_ < calc_upper_info_.min_start_scn_in_ctx_) {
ret = OB_ERR_UNEXPECTED;
STORAGE_LOG(ERROR, "invalid min start scn", K(tmp_calc_upper_info), K(calc_upper_info_));
} else {
calc_upper_info_ = tmp_calc_upper_info;
}
}
}
int ObLSService::online_ls()
{
// do nothing