[CP] opt: provide a new sync interface for getting gts timestamp
This commit is contained in:
@ -2405,10 +2405,14 @@ TEST_F(ObTestTx, interrupt_get_read_snapshot)
|
||||
PREPARE_TX(n1, tx);
|
||||
ObTxReadSnapshot snapshot;
|
||||
n1->get_ts_mgr_().inject_get_gts_error(OB_EAGAIN);
|
||||
ASYNC_DO(acq_snapshot, n1->get_read_snapshot(tx, ObTxIsolationLevel::RC, n1->ts_after_ms(20 * 1000), snapshot));
|
||||
ASSERT_EQ(OB_SUCCESS, n1->interrupt(tx, OB_TRANS_KILLED));
|
||||
ASYNC_WAIT(acq_snapshot, 2000 * 1000, wait_ret);
|
||||
ASSERT_EQ(OB_ERR_INTERRUPTED, wait_ret);
|
||||
int ret = OB_SUCCESS;
|
||||
do {
|
||||
ASYNC_DO(acq_snapshot, n1->get_read_snapshot(tx, ObTxIsolationLevel::RC, n1->ts_after_ms(20 * 1000), snapshot));
|
||||
ASSERT_EQ(OB_SUCCESS, n1->interrupt(tx, OB_TRANS_KILLED));
|
||||
ASYNC_WAIT(acq_snapshot, 2000 * 1000, wait_ret);
|
||||
ret = wait_ret;
|
||||
} while (OB_GTS_NOT_READY == ret);
|
||||
ASSERT_EQ(OB_ERR_INTERRUPTED, ret);
|
||||
ROLLBACK_TX(n1, tx);
|
||||
}
|
||||
|
||||
|
@ -271,6 +271,30 @@ public:
|
||||
return ret;
|
||||
}
|
||||
|
||||
int get_gts_sync(const uint64_t tenant_id,
|
||||
const MonotonicTs stc,
|
||||
const int64_t timeout_us,
|
||||
share::SCN &scn,
|
||||
MonotonicTs &receive_gts_ts)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
const int64_t expire_ts = ObClockGenerator::getClock() + timeout_us;
|
||||
|
||||
do {
|
||||
int64_t n = ObClockGenerator::getClock();
|
||||
if (n >= expire_ts) {
|
||||
ret = OB_TIMEOUT;
|
||||
} else if (OB_FAIL(get_gts(tenant_id, stc, NULL, scn, receive_gts_ts))) {
|
||||
if (OB_EAGAIN == ret) {
|
||||
ob_usleep(500);
|
||||
}
|
||||
}
|
||||
} while (OB_EAGAIN == ret);
|
||||
|
||||
return ret;
|
||||
return get_gts(tenant_id, stc, NULL, scn, receive_gts_ts);
|
||||
}
|
||||
|
||||
int get_gts(const uint64_t tenant_id, ObTsCbTask *task, share::SCN &scn) {
|
||||
if (get_gts_error_) { return get_gts_error_; }
|
||||
return OB_SUCCESS;
|
||||
|
Reference in New Issue
Block a user