Do not report ERROR when sample rate equals 100
This commit is contained in:
@ -13,9 +13,8 @@
|
||||
#define USING_LOG_PREFIX STORAGE
|
||||
|
||||
#include "storage/ob_storage_table_guard.h"
|
||||
#include "share/allocator/ob_shared_memory_allocator_mgr.h"
|
||||
#include "share/allocator/ob_memstore_allocator_mgr.h"
|
||||
#include "share/throttle/ob_throttle_common.h"
|
||||
#include "share/throttle/ob_share_throttle_define.h"
|
||||
#include "storage/memtable/ob_memtable.h"
|
||||
#include "storage/ob_i_table.h"
|
||||
#include "storage/ob_relative_table.h"
|
||||
@ -48,43 +47,112 @@ ObStorageTableGuard::ObStorageTableGuard(
|
||||
for_multi_source_data_(for_multi_source_data)
|
||||
{
|
||||
init_ts_ = ObTimeUtility::current_time();
|
||||
share::memstore_throttled_alloc() = 0;
|
||||
get_thread_alloc_stat() = 0;
|
||||
}
|
||||
|
||||
ObStorageTableGuard::~ObStorageTableGuard()
|
||||
{
|
||||
(void)throttle_if_needed_();
|
||||
reset();
|
||||
}
|
||||
bool &need_speed_limit = tl_need_speed_limit();
|
||||
ObThrottleStat &stat = get_throttle_stat();
|
||||
int64_t total_expected_wait_us = 0;
|
||||
int64_t user_timeout_skip_us = 0;
|
||||
int64_t frozen_memtable_skip_us = 0;
|
||||
int64_t replay_frozen_skip_us = 0;
|
||||
int64_t from_user_skip_us = 0; // does not used now
|
||||
if (need_control_mem_ && need_speed_limit) {
|
||||
bool need_sleep = true;
|
||||
int64_t left_interval = INT64_MAX;
|
||||
if (!for_replay_) {
|
||||
left_interval = min(left_interval, store_ctx_.timeout_ - ObTimeUtility::current_time());
|
||||
}
|
||||
if (NULL != memtable_) {
|
||||
need_sleep = memtable_->is_active_memtable();
|
||||
}
|
||||
uint64_t timeout = 10000;//10s
|
||||
common::ObWaitEventGuard wait_guard(common::ObWaitEventIds::MEMSTORE_MEM_PAGE_ALLOC_WAIT, timeout, 0, 0, left_interval);
|
||||
|
||||
void ObStorageTableGuard::throttle_if_needed_()
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
if (!need_control_mem_) {
|
||||
// skip throttle
|
||||
} else {
|
||||
TxShareThrottleTool &throttle_tool = MTL(ObSharedMemAllocMgr *)->share_resource_throttle_tool();
|
||||
ObThrottleInfoGuard share_ti_guard;
|
||||
ObThrottleInfoGuard module_ti_guard;
|
||||
if (throttle_tool.is_throttling<ObMemstoreAllocator>(share_ti_guard, module_ti_guard)) {
|
||||
|
||||
// only do throttle on active memtable
|
||||
if (OB_NOT_NULL(memtable_) && memtable_->is_active_memtable()) {
|
||||
reset();
|
||||
(void)TxShareMemThrottleUtil::do_throttle<ObMemstoreAllocator>(
|
||||
for_replay_, store_ctx_.timeout_, throttle_tool, share_ti_guard, module_ti_guard);
|
||||
}
|
||||
|
||||
// if throttle is skipped due to some reasons, advance clock by call skip_throttle() and clean throttle status
|
||||
// record in throttle info
|
||||
if (throttle_tool.still_throttling<ObMemstoreAllocator>(share_ti_guard, module_ti_guard)){
|
||||
int64_t skip_size = share::memstore_throttled_alloc();
|
||||
(void)throttle_tool.skip_throttle<ObMemstoreAllocator>(skip_size, share_ti_guard, module_ti_guard);
|
||||
|
||||
if (OB_NOT_NULL(module_ti_guard.throttle_info())) {
|
||||
module_ti_guard.throttle_info()->reset();
|
||||
reset();
|
||||
int ret = OB_SUCCESS;
|
||||
int tmp_ret = OB_SUCCESS;
|
||||
bool has_sleep = false;
|
||||
int64_t sleep_time = 0;
|
||||
int time = 0;
|
||||
const int64_t &seq = get_seq();
|
||||
int64_t clock = 0;
|
||||
ObGMemstoreAllocator* memstore_allocator = NULL;
|
||||
if (OB_SUCCESS != (tmp_ret = ObMemstoreAllocatorMgr::get_instance().get_tenant_memstore_allocator(
|
||||
MTL_ID(), memstore_allocator))) {
|
||||
} else if (OB_ISNULL(memstore_allocator)) {
|
||||
LOG_WARN_RET(OB_ALLOCATE_MEMORY_FAILED, "get_tenant_mutil_allocator failed", K(store_ctx_.tablet_id_), K(tmp_ret));
|
||||
} else {
|
||||
clock = memstore_allocator->get_clock();
|
||||
total_expected_wait_us = memstore_allocator->expected_wait_time(seq);
|
||||
user_timeout_skip_us = max(0, total_expected_wait_us - left_interval);
|
||||
frozen_memtable_skip_us = need_sleep ? 0 : max(0, total_expected_wait_us - user_timeout_skip_us);
|
||||
while (need_sleep &&
|
||||
!memstore_allocator->check_clock_over_seq(seq) &&
|
||||
(left_interval > 0)) {
|
||||
if (for_replay_) {
|
||||
if(MTL(ObTenantFreezer *)->exist_ls_freezing()) {
|
||||
replay_frozen_skip_us = max(0, total_expected_wait_us - user_timeout_skip_us - sleep_time);
|
||||
break;
|
||||
}
|
||||
}
|
||||
int64_t expected_wait_time = memstore_allocator->expected_wait_time(seq);
|
||||
if (expected_wait_time < 0) {
|
||||
LOG_ERROR("expected wait time should not smaller than 0", K(expected_wait_time), K(seq), K(clock), K(left_interval));
|
||||
}
|
||||
if (expected_wait_time <= 0) {
|
||||
break;
|
||||
}
|
||||
int64_t sleep_interval = min(min(left_interval, SLEEP_INTERVAL_PER_TIME), expected_wait_time);
|
||||
// don't use ob_usleep, as we are already in the scope of 'wait_guard'
|
||||
if (sleep_interval < 0) {
|
||||
LOG_ERROR("sleep interval should not smaller than 0", K(expected_wait_time), K(seq), K(clock), K(left_interval));
|
||||
}
|
||||
if (sleep_interval > 10 * 60 * 1000 * 1000L) {
|
||||
LOG_WARN("sleep interval greater than 10 minutes, pay attention", K(expected_wait_time), K(seq), K(clock), K(left_interval));
|
||||
}
|
||||
if (sleep_interval <= 0) {
|
||||
break;
|
||||
}
|
||||
::usleep(sleep_interval);
|
||||
sleep_time += sleep_interval;
|
||||
time++;
|
||||
left_interval -= sleep_interval;
|
||||
has_sleep = true;
|
||||
need_sleep = memstore_allocator->need_do_writing_throttle();
|
||||
}
|
||||
const int64_t finish_clock = memstore_allocator->get_clock();
|
||||
if (finish_clock < seq) { // we has skip some time, need make the clock skip too.
|
||||
const int64_t skip_clock = MIN(seq - finish_clock, get_thread_alloc_stat());
|
||||
memstore_allocator->skip_clock(skip_clock);
|
||||
}
|
||||
}
|
||||
|
||||
if (REACH_TIME_INTERVAL(100 * 1000L) &&
|
||||
sleep_time > 0) {
|
||||
int64_t cost_time = ObTimeUtility::current_time() - init_ts_;
|
||||
LOG_INFO("throttle situation", K(sleep_time), K(clock), K(time), K(seq), K(for_replay_), K(cost_time));
|
||||
}
|
||||
|
||||
if (for_replay_ && has_sleep) {
|
||||
// avoid print replay_timeout
|
||||
get_replay_is_writing_throttling() = true;
|
||||
}
|
||||
}
|
||||
reset();
|
||||
stat.update(total_expected_wait_us,
|
||||
from_user_skip_us,
|
||||
user_timeout_skip_us,
|
||||
frozen_memtable_skip_us,
|
||||
replay_frozen_skip_us);
|
||||
const bool last_throttle_status = stat.last_throttle_status;
|
||||
const int64_t last_print_log_time = stat.last_log_timestamp;
|
||||
if (stat.need_log(need_speed_limit)) {
|
||||
LOG_INFO("throttle statics", K(need_speed_limit), K(last_throttle_status), K(last_print_log_time), K(stat));
|
||||
if (!need_speed_limit && last_throttle_status) {
|
||||
stat.reset();
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -101,20 +169,23 @@ int ObStorageTableGuard::refresh_and_protect_table(ObRelativeTable &relative_tab
|
||||
}
|
||||
|
||||
while (OB_SUCC(ret) && need_to_refresh_table(*iter.table_iter())) {
|
||||
const int64_t remain_timeout = THIS_WORKER.get_timeout_remain();
|
||||
if (OB_UNLIKELY(remain_timeout <= 0)) {
|
||||
ret = OB_TIMEOUT;
|
||||
} else if (OB_FAIL(store_ctx_.ls_->get_tablet_svr()->get_read_tables(
|
||||
if (OB_FAIL(store_ctx_.ls_->get_tablet_svr()->get_read_tables(
|
||||
tablet_id,
|
||||
remain_timeout,
|
||||
store_ctx_.mvcc_acc_ctx_.get_snapshot_version().get_val_for_tx(),
|
||||
iter,
|
||||
relative_table.allow_not_ready()))) {
|
||||
LOG_WARN("fail to get read tables", K(ret), K(ls_id), K(remain_timeout),
|
||||
"table_id", relative_table.get_table_id());
|
||||
LOG_WARN("fail to get read tables", K(ret), K(ls_id), K(tablet_id),
|
||||
"table id", relative_table.get_table_id());
|
||||
} else {
|
||||
// no worry. iter will hold tablet reference and its life cycle is longer than guard
|
||||
tablet_ = iter.get_tablet();
|
||||
// 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -124,6 +195,7 @@ int ObStorageTableGuard::refresh_and_protect_table(ObRelativeTable &relative_tab
|
||||
int ObStorageTableGuard::refresh_and_protect_memtable()
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
ObIMemtableMgr *memtable_mgr = tablet_->get_memtable_mgr();
|
||||
memtable::ObIMemtable *memtable = nullptr;
|
||||
ObTableHandleV2 handle;
|
||||
const share::ObLSID &ls_id = tablet_->get_tablet_meta().ls_id_;
|
||||
@ -132,54 +204,57 @@ int ObStorageTableGuard::refresh_and_protect_memtable()
|
||||
bool bool_ret = true;
|
||||
bool for_replace_tablet_meta = false;
|
||||
const int64_t start = ObTimeUtility::current_time();
|
||||
do {
|
||||
if (OB_FAIL(tablet_->get_boundary_memtable(handle))) {
|
||||
// if there is no memtable, create a new one
|
||||
if (OB_ENTRY_NOT_EXIST == ret) {
|
||||
LOG_DEBUG("there is no boundary memtable", K(ret), K(ls_id), K(tablet_id));
|
||||
ObLSHandle ls_handle;
|
||||
ObTabletHandle tmp_handle;
|
||||
if (OB_FAIL(MTL(ObLSService *)->get_ls(ls_id, ls_handle, ObLSGetMod::STORAGE_MOD))) {
|
||||
LOG_WARN("failed to get log stream", K(ret), K(ls_id), K(tablet_id));
|
||||
} else if (OB_UNLIKELY(!ls_handle.is_valid())) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("unexpected error, invalid ls handle", K(ret), K(ls_handle), K(ls_id), K(tablet_id));
|
||||
} else if (OB_FAIL(ls_handle.get_ls()->get_tablet_svr()->get_tablet(tablet_id,
|
||||
tmp_handle, 0, ObMDSGetTabletMode::READ_WITHOUT_CHECK))) {
|
||||
LOG_WARN("fail to get tablet", K(ret), K(ls_id), K(tablet_id));
|
||||
} else if (FALSE_IT(clog_checkpoint_scn = tmp_handle.get_obj()->get_tablet_meta().clog_checkpoint_scn_)) {
|
||||
} else if (replay_scn_ > clog_checkpoint_scn) {
|
||||
// TODO: get the newest schema_version from tablet
|
||||
if (OB_FAIL(ls_handle.get_ls()->get_tablet_svr()->create_memtable(
|
||||
tablet_id, 0/*schema version*/, for_replay_, clog_checkpoint_scn))) {
|
||||
LOG_WARN("fail to create a boundary memtable", K(ret), K(ls_id), K(tablet_id));
|
||||
|
||||
if (OB_ISNULL(memtable_mgr)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("memtable mgr is null", K(ret), KP(memtable_mgr));
|
||||
} else {
|
||||
do {
|
||||
if (OB_FAIL(memtable_mgr->get_boundary_memtable(handle))) {
|
||||
// if there is no memtable, create a new one
|
||||
if (OB_ENTRY_NOT_EXIST == ret) {
|
||||
LOG_DEBUG("there is no boundary memtable", K(ret), K(ls_id), K(tablet_id));
|
||||
if (OB_FAIL(memtable_mgr->get_newest_clog_checkpoint_scn(clog_checkpoint_scn))) {
|
||||
LOG_WARN("fail to get newest clog_checkpoint_scn", K(ret), K(ls_id), K(tablet_id));
|
||||
} else if (replay_scn_ > clog_checkpoint_scn) {
|
||||
// TODO: get the newest schema_version from tablet
|
||||
ObLSHandle ls_handle;
|
||||
if (OB_FAIL(MTL(ObLSService *)->get_ls(ls_id, ls_handle, ObLSGetMod::STORAGE_MOD))) {
|
||||
LOG_WARN("failed to get log stream", K(ret), K(ls_id), K(tablet_id));
|
||||
} else if (OB_UNLIKELY(!ls_handle.is_valid())) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("unexpected error, invalid ls handle", K(ret), K(ls_handle), K(ls_id), K(tablet_id));
|
||||
} else if (OB_FAIL(ls_handle.get_ls()->get_tablet_svr()->create_memtable(
|
||||
tablet_id, 0/*schema version*/, for_replay_, clog_checkpoint_scn))) {
|
||||
LOG_WARN("fail to create a boundary memtable", K(ret), K(ls_id), K(tablet_id));
|
||||
}
|
||||
} else { // replay_log_scn_ <= clog_checkpoint_scn
|
||||
// no need to create a boundary memtable
|
||||
ret = OB_SUCCESS;
|
||||
break;
|
||||
}
|
||||
} else { // replay_log_scn_ <= clog_checkpoint_scn
|
||||
// no need to create a boundary memtable
|
||||
ret = OB_SUCCESS;
|
||||
break;
|
||||
} else { // OB_ENTRY_NOT_EXIST != ret
|
||||
LOG_WARN("fail to get boundary memtable", K(ret), K(ls_id), K(tablet_id));
|
||||
}
|
||||
} else { // OB_ENTRY_NOT_EXIST != ret
|
||||
LOG_WARN("fail to get boundary memtable", K(ret), K(ls_id), K(tablet_id));
|
||||
} else if (OB_FAIL(handle.get_memtable(memtable))) {
|
||||
LOG_WARN("fail to get memtable from ObTableHandle", K(ret), K(ls_id), K(tablet_id));
|
||||
} else if (OB_FAIL(check_freeze_to_inc_write_ref(memtable, bool_ret, for_replace_tablet_meta))) {
|
||||
if (OB_EAGAIN == ret) {
|
||||
} else if (OB_MINOR_FREEZE_NOT_ALLOW != ret) {
|
||||
LOG_WARN("fail to check_freeze", K(ret), K(tablet_id), K(bool_ret), KPC(memtable));
|
||||
}
|
||||
} else {
|
||||
// do nothing
|
||||
}
|
||||
} else if (OB_FAIL(handle.get_memtable(memtable))) {
|
||||
LOG_WARN("fail to get memtable from ObTableHandle", K(ret), K(ls_id), K(tablet_id));
|
||||
} else if (OB_FAIL(check_freeze_to_inc_write_ref(memtable, bool_ret, for_replace_tablet_meta))) {
|
||||
if (OB_EAGAIN == ret) {
|
||||
} else if (OB_MINOR_FREEZE_NOT_ALLOW != ret) {
|
||||
LOG_WARN("fail to check_freeze", K(ret), K(tablet_id), K(bool_ret), KPC(memtable));
|
||||
const int64_t cost_time = ObTimeUtility::current_time() - start;
|
||||
if (cost_time > 10 * 1000) {
|
||||
if (TC_REACH_TIME_INTERVAL(10 * 1000)) {
|
||||
TRANS_LOG_RET(WARN, OB_ERR_TOO_MUCH_TIME, "refresh replay table too much times", K(ret),
|
||||
K(ls_id), K(tablet_id), K(cost_time));
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// do nothing
|
||||
}
|
||||
const int64_t cost_time = ObTimeUtility::current_time() - start;
|
||||
if (cost_time > 10 * 1000) {
|
||||
if (TC_REACH_TIME_INTERVAL(10 * 1000)) {
|
||||
TRANS_LOG_RET(WARN, OB_ERR_TOO_MUCH_TIME, "refresh replay table too much times", K(ret),
|
||||
K(ls_id), K(tablet_id), K(cost_time));
|
||||
}
|
||||
}
|
||||
} while ((OB_SUCC(ret) || OB_ENTRY_NOT_EXIST == ret || OB_EAGAIN == ret) && bool_ret);
|
||||
} while ((OB_SUCC(ret) || OB_ENTRY_NOT_EXIST == ret || OB_EAGAIN == ret) && bool_ret);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
@ -190,7 +265,6 @@ void ObStorageTableGuard::reset()
|
||||
memtable_->dec_write_ref();
|
||||
memtable_ = NULL;
|
||||
}
|
||||
share::memstore_throttled_alloc() = 0;
|
||||
}
|
||||
|
||||
void ObStorageTableGuard::double_check_inc_write_ref(
|
||||
@ -236,6 +310,7 @@ int ObStorageTableGuard::check_freeze_to_inc_write_ref(ObITable *table, bool &bo
|
||||
bool_ret = true;
|
||||
const share::ObLSID &ls_id = tablet_->get_tablet_meta().ls_id_;
|
||||
const common::ObTabletID &tablet_id = tablet_->get_tablet_meta().tablet_id_;
|
||||
ObIMemtableMgr *memtable_mgr = tablet_->get_memtable_mgr();
|
||||
// need to make sure the memtable is a right boundary memtable
|
||||
memtable::ObIMemtable *memtable = static_cast<memtable::ObIMemtable *>(table);
|
||||
memtable::ObIMemtable *old_memtable = memtable;
|
||||
@ -243,9 +318,11 @@ int ObStorageTableGuard::check_freeze_to_inc_write_ref(ObITable *table, bool &bo
|
||||
// prevent that the memtable transforms from active to frozen before inc_write_ref
|
||||
uint32_t old_freeze_flag = 0;
|
||||
bool is_tablet_freeze = false;
|
||||
ObProtectedMemtableMgrHandle *protected_handle = NULL;
|
||||
|
||||
if (OB_ISNULL(table)) {
|
||||
if (OB_ISNULL(memtable_mgr)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("memtable mgr is null", K(ret), K(bool_ret), K(ls_id), K(tablet_id), KP(memtable_mgr));
|
||||
} else if (OB_ISNULL(table)) {
|
||||
LOG_INFO("table is null, need to refresh", K(bool_ret), K(ls_id), K(tablet_id));
|
||||
} else if (FALSE_IT(old_freeze_flag = memtable->get_freeze_flag())) {
|
||||
} else if (FALSE_IT(is_tablet_freeze = memtable->get_is_tablet_freeze())) {
|
||||
@ -255,9 +332,7 @@ int ObStorageTableGuard::check_freeze_to_inc_write_ref(ObITable *table, bool &bo
|
||||
if (for_replay_ || for_multi_source_data_) {
|
||||
// filter memtables for replay or multi_source_data according to scn
|
||||
ObTableHandleV2 handle;
|
||||
if (OB_FAIL(tablet_->get_protected_memtable_mgr_handle(protected_handle))) {
|
||||
LOG_WARN("failed to get_protected_memtable_mgr_handle", K(ret), KPC(tablet_));
|
||||
} else if (OB_FAIL(protected_handle->get_memtable_for_replay(replay_scn_, handle))) {
|
||||
if (OB_FAIL(memtable_mgr->get_memtable_for_replay(replay_scn_, handle))) {
|
||||
if (OB_NO_NEED_UPDATE == ret) {
|
||||
// no need to replay the log
|
||||
bool_ret = false;
|
||||
@ -285,17 +360,13 @@ int ObStorageTableGuard::check_freeze_to_inc_write_ref(ObITable *table, bool &bo
|
||||
SCN clog_checkpoint_scn;
|
||||
bool need_create_memtable = true;
|
||||
SCN migration_clog_checkpoint_scn;
|
||||
ObTabletHandle tmp_handle;
|
||||
ObLSHandle ls_handle;
|
||||
if (OB_FAIL(MTL(ObLSService *)->get_ls(ls_id, ls_handle, ObLSGetMod::STORAGE_MOD))) {
|
||||
LOG_WARN("failed to get log stream", K(ret), K(bool_ret), K(ls_id), K(tablet_id));
|
||||
} else if (OB_UNLIKELY(!ls_handle.is_valid())) {
|
||||
ObIMemtableMgr *memtable_mgr = tablet_->get_memtable_mgr();
|
||||
|
||||
if (OB_ISNULL(memtable_mgr)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("unexpected error, invalid ls handle", K(ret), K(bool_ret), K(ls_handle), K(ls_id), K(tablet_id));
|
||||
} else if (OB_FAIL(ls_handle.get_ls()->get_tablet_svr()->get_tablet(tablet_id,
|
||||
tmp_handle, 0, ObMDSGetTabletMode::READ_WITHOUT_CHECK))) {
|
||||
LOG_WARN("fail to get tablet", K(ret), K(ls_id), K(tablet_id));
|
||||
} else if (FALSE_IT(clog_checkpoint_scn = tmp_handle.get_obj()->get_tablet_meta().clog_checkpoint_scn_)) {
|
||||
LOG_WARN("memtable mgr is null", K(ret), K(bool_ret), K(ls_id), K(tablet_id), KP(memtable_mgr));
|
||||
} else if (OB_FAIL(memtable_mgr->get_newest_clog_checkpoint_scn(clog_checkpoint_scn))) {
|
||||
LOG_WARN("failed to get newest clog_checkpoint_scn", K(ret), K(ls_id), K(tablet_id), K(clog_checkpoint_scn));
|
||||
} else if (FALSE_IT(migration_clog_checkpoint_scn = static_cast<memtable::ObMemtable *>(memtable)->get_migration_clog_checkpoint_scn())) {
|
||||
} else if (for_replay_ && !migration_clog_checkpoint_scn.is_min()) {
|
||||
static_cast<memtable::ObMemtable *>(memtable)->resolve_right_boundary();
|
||||
@ -308,7 +379,13 @@ int ObStorageTableGuard::check_freeze_to_inc_write_ref(ObITable *table, bool &bo
|
||||
// create a new memtable if no write in the old memtable
|
||||
if (OB_FAIL(ret)) {
|
||||
} else if (need_create_memtable) {
|
||||
if (OB_FAIL(ls_handle.get_ls()->get_tablet_svr()->create_memtable(tablet_id,
|
||||
ObLSHandle ls_handle;
|
||||
if (OB_FAIL(MTL(ObLSService *)->get_ls(ls_id, ls_handle, ObLSGetMod::STORAGE_MOD))) {
|
||||
LOG_WARN("failed to get log stream", K(ret), K(bool_ret), K(ls_id), K(tablet_id));
|
||||
} else if (OB_UNLIKELY(!ls_handle.is_valid())) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("unexpected error, invalid ls handle", K(ret), K(bool_ret), K(ls_handle), K(ls_id), K(tablet_id));
|
||||
} else if (OB_FAIL(ls_handle.get_ls()->get_tablet_svr()->create_memtable(tablet_id,
|
||||
memtable->get_max_schema_version()/*schema version*/,
|
||||
for_replay_,
|
||||
clog_checkpoint_scn))) {
|
||||
|
||||
Reference in New Issue
Block a user