Wait till statement timeout in refresh_and_protect_table

This commit is contained in:
obdev 2022-11-08 10:35:26 +00:00 committed by wangzelin.wzl
parent 991572d45c
commit 5ce81574fa
6 changed files with 15 additions and 18 deletions

View File

@ -1798,7 +1798,7 @@ int ObLSTabletService::create_memtable(
const bool for_replay)
{
int ret = OB_SUCCESS;
ObTimeGuard time_guard("ObLSTabletService::create_memtable", 1 * 1000 * 1000);
ObTimeGuard time_guard("ObLSTabletService::create_memtable", 10 * 1000);
ObTabletHandle handle;
if (OB_UNLIKELY(!is_inited_)) {
ret = OB_NOT_INIT;

View File

@ -109,12 +109,8 @@ int ObStorageTableGuard::refresh_and_protect_table(ObRelativeTable &relative_tab
ret = OB_ERR_UNEXPECTED;
LOG_WARN("ls is null", K(ret), K(ls_id));
}
bool bool_ret = false;
while (OB_SUCC(ret) && need_to_refresh_table(iter.table_iter_, ret)) {
// it's ok that get_read_tables cover the ret code returned by need_to_refresh_table
// because need_to_refresh_table return false and stop the loop if refresh too much times
// the last ret code will be passed to upper levels
while (OB_SUCC(ret) && need_to_refresh_table(iter.table_iter_)) {
if (OB_FAIL(store_ctx_.ls_->get_tablet_svr()->get_read_tables(
tablet_id,
store_ctx_.mvcc_acc_ctx_.get_snapshot_version(),
@ -125,6 +121,13 @@ int ObStorageTableGuard::refresh_and_protect_table(ObRelativeTable &relative_tab
} else {
// no worry. iter will hold tablet reference and its life cycle is longer than guard
tablet_ = iter.tablet_handle_.get_obj();
// TODO: check if seesion is killed
if (store_ctx_.timeout_ > 0) {
const int64_t query_left_time = store_ctx_.timeout_ - ObTimeUtility::current_time();
if (query_left_time <= 0) {
ret = OB_TRANS_STMT_TIMEOUT;
}
}
}
}
@ -189,9 +192,6 @@ int ObStorageTableGuard::refresh_and_protect_memtable()
TRANS_LOG(WARN, "refresh replay table too much times", K(ret),
K(ls_id), K(tablet_id), K(cost_time));
}
if (cost_time > LOG_INTERVAL_US) {
ret = OB_TIMEOUT;
}
}
} while ((OB_SUCC(ret) || OB_ENTRY_NOT_EXIST == ret) && bool_ret);
}
@ -316,9 +316,9 @@ int ObStorageTableGuard::check_freeze_to_inc_write_ref(ObITable *table, bool &bo
return ret;
}
bool ObStorageTableGuard::need_to_refresh_table(ObTableStoreIterator &iter, int &ret)
bool ObStorageTableGuard::need_to_refresh_table(ObTableStoreIterator &iter)
{
ret = OB_SUCCESS;
int ret = OB_SUCCESS;
bool bool_ret = false;
int exit_flag = -1;
@ -361,9 +361,6 @@ bool ObStorageTableGuard::need_to_refresh_table(ObTableStoreIterator &iter, int
} else {
LOG_WARN("unexpect exit_flag", K(exit_flag), K(ret), K(ls_id), K(tablet_id));
}
if (OB_FAIL(ret)) {
bool_ret = false;
}
}
return bool_ret;

View File

@ -57,7 +57,7 @@ private:
memtable::ObIMemtable *memtable,
bool &bool_ret);
int check_freeze_to_inc_write_ref(ObITable *table, bool &bool_ret);
bool need_to_refresh_table(ObTableStoreIterator &iter, int &ret);
bool need_to_refresh_table(ObTableStoreIterator &iter);
bool check_if_need_log();
private:
static const int64_t LOG_INTERVAL_US = 10 * 1000 * 1000;

View File

@ -1539,7 +1539,7 @@ int ObTablet::create_memtable(const int64_t schema_version,
const bool for_replay)
{
int ret = OB_SUCCESS;
ObTimeGuard time_guard("ObTablet::create_memtable", 1 * 1000 * 1000);
ObTimeGuard time_guard("ObTablet::create_memtable", 10 * 1000);
TCWLockGuard guard(table_store_lock_);
time_guard.click("lock");
const int64_t clog_checkpoint_ts = tablet_meta_.clog_checkpoint_ts_;

View File

@ -141,7 +141,7 @@ int ObTabletMemtableMgr::create_memtable(const int64_t clog_checkpoint_ts,
const int64_t schema_version,
const bool for_replay)
{
ObTimeGuard time_guard("ObTabletMemtableMgr::create_memtable", 1 * 1000 * 1000);
ObTimeGuard time_guard("ObTabletMemtableMgr::create_memtable", 10 * 1000);
// Write lock
SpinWLockGuard lock_guard(lock_);
time_guard.click("lock");

View File

@ -725,7 +725,7 @@ int ObTxReplayExecutor::get_compat_mode_(const ObTabletID &tablet_id, lib::Worke
void ObTxReplayExecutor::rewrite_replay_retry_code_(int &ret_code)
{
if (ret_code == OB_MINOR_FREEZE_NOT_ALLOW || ret_code == OB_LOG_TS_OUT_OF_BOUND ||
ret_code == OB_ALLOCATE_MEMORY_FAILED || ret_code == OB_TIMEOUT) {
ret_code == OB_ALLOCATE_MEMORY_FAILED) {
TRANS_LOG(INFO, "rewrite replay error_code as OB_EAGAIN for retry", K(ret_code),
K(ls_->get_ls_id()), K(log_ts_ns_));
ret_code = OB_EAGAIN;