Fix get tablet return 4165

This commit is contained in:
JiahuaChen
2023-07-07 10:47:48 +00:00
committed by ob-robot
parent 59d7be6b30
commit ddf7854eb4
3 changed files with 62 additions and 34 deletions

View File

@ -525,6 +525,51 @@ TEST_F(TestTabletStatusCache, get_transfer_out_deleted)
ASSERT_TRUE(!tablet->tablet_status_cache_.is_valid());
}
TEST_F(TestTabletStatusCache, get_empty_result_tablet)
{
int ret = OB_SUCCESS;
// create tablet without any tablet status
const common::ObTabletID tablet_id(ObTimeUtility::fast_current_time() % 10000000000000);
const ObTabletMapKey key(LS_ID, tablet_id);
ObTabletHandle tablet_handle;
const uint64_t table_id = 1234567;
share::schema::ObTableSchema table_schema;
ObLSHandle ls_handle;
ObLS *ls = nullptr;
if (OB_FAIL(MTL(ObLSService*)->get_ls(LS_ID, ls_handle, ObLSGetMod::STORAGE_MOD))) {
LOG_WARN("failed to get ls", K(ret));
} else if (OB_ISNULL(ls = ls_handle.get_ls())) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("ls is null", K(ret), KP(ls));
} else if (OB_FAIL(build_test_schema(table_schema, table_id))) {
LOG_WARN("failed to build table schema");
} else if (OB_FAIL(TestTabletHelper::create_tablet(ls_handle, tablet_id, table_schema, allocator_,
ObTabletStatus::Status::MAX, share::SCN::min_scn()))) {
LOG_WARN("failed to create tablet", K(ret), K(ls_id), K(tablet_id));
}
ASSERT_EQ(OB_SUCCESS, ret);
// test READ_WITHOUT_CHECK
ret = ObTabletCreateDeleteHelper::check_and_get_tablet(key, tablet_handle, 1 * 1000 * 1000/*timeout_us*/,
ObMDSGetTabletMode::READ_WITHOUT_CHECK, ObTransVersion::MAX_TRANS_VERSION/*snapshot*/);
ASSERT_EQ(OB_SUCCESS, ret);
ASSERT_FALSE(tablet_handle.get_obj()->tablet_status_cache_.is_valid());
// test READ_READABLE_COMMITED
ret = ObTabletCreateDeleteHelper::check_and_get_tablet(key, tablet_handle, 1 * 1000 * 1000/*timeout_us*/,
ObMDSGetTabletMode::READ_READABLE_COMMITED, ObTransVersion::MAX_TRANS_VERSION/*snapshot*/);
ASSERT_EQ(OB_TABLET_NOT_EXIST, ret);
ASSERT_FALSE(tablet_handle.get_obj()->tablet_status_cache_.is_valid());
// test READ_ALL_COMMITED
ret = ObTabletCreateDeleteHelper::check_and_get_tablet(key, tablet_handle, 1 * 1000 * 1000/*timeout_us*/,
ObMDSGetTabletMode::READ_ALL_COMMITED, ObTransVersion::MAX_TRANS_VERSION/*snapshot*/);
ASSERT_EQ(OB_TABLET_NOT_EXIST, ret);
ASSERT_FALSE(tablet_handle.get_obj()->tablet_status_cache_.is_valid());
}
TEST_F(TestTabletStatusCache, get_read_all_committed_tablet)
{
int ret = OB_SUCCESS;
@ -545,27 +590,10 @@ TEST_F(TestTabletStatusCache, get_read_all_committed_tablet)
tablet->tablet_status_cache_.reset();
}
ObTabletCreateDeleteMdsUserData user_data;
share::SCN min_scn;
share::SCN commit_scn;
// creation not commited
user_data.tablet_status_ = ObTabletStatus::MAX;
min_scn.set_min();
user_data.data_type_ = ObTabletMdsUserDataType::CREATE_TABLET;
user_data.create_commit_scn_ = share::SCN::plus(min_scn, 50);
user_data.create_commit_version_ = 50;
mds::MdsCtx ctx1(mds::MdsWriter(transaction::ObTransID(2023062801)));
ret = tablet->set(user_data, ctx1);
ASSERT_EQ(OB_SUCCESS, ret);
commit_scn = share::SCN::plus(min_scn, 100);
ctx1.single_log_commit(commit_scn, commit_scn);
tablet_handle.reset();
ret = ObTabletCreateDeleteHelper::check_and_get_tablet(key, tablet_handle, 1 * 1000 * 1000/*timeout_us*/,
ObMDSGetTabletMode::READ_ALL_COMMITED, ObTransVersion::MAX_TRANS_VERSION/*snapshot*/);
ASSERT_EQ(OB_TABLET_NOT_EXIST, ret);
share::SCN commit_scn;
// creation commited
user_data.tablet_status_ = ObTabletStatus::NORMAL;

View File

@ -5749,10 +5749,15 @@ int ObTablet::check_tablet_status_for_read_all_committed()
// first make sure tablet is in any committed state
// then check if it is a empty shell
if (OB_FAIL(get_tablet_status(share::SCN::max_scn(), user_data, 0/*timeout*/))) {
LOG_WARN("failed to get tablet status", K(ret), K(ls_id), K(tablet_id));
} else if (OB_UNLIKELY(!user_data.tablet_status_.is_valid() || is_empty_shell())) {
if (OB_EMPTY_RESULT == ret) {
ret = OB_TABLET_NOT_EXIST;
LOG_WARN("tablet creation has not been committed, or has been roll backed", K(ret), K(ls_id), K(tablet_id));
} else {
LOG_WARN("failed to get tablet status", K(ret), K(ls_id), K(tablet_id));
}
} else if (OB_UNLIKELY(is_empty_shell())) {
ret = OB_TABLET_NOT_EXIST;
LOG_WARN("tablet does not exist", K(ret), K(ls_id), K(tablet_id), K(user_data));
LOG_WARN("tablet become empty shell", K(ret), K(ls_id), K(tablet_id));
}
return ret;
}

View File

@ -99,6 +99,7 @@ inline int TestTabletHelper::create_tablet(
{
int ret = OB_SUCCESS;
ObTenantMetaMemMgr *t3m = MTL(ObTenantMetaMemMgr*);
ObLSTabletService *ls_tablet_svr = ls_handle.get_ls()->get_tablet_svr();
ObTabletCreateSSTableParam param;
prepare_sstable_param(tablet_id, table_schema, param);
@ -127,7 +128,7 @@ inline int TestTabletHelper::create_tablet(
ls_id, tablet_id, tablet_id, share::SCN::base_scn(),
snapshot_version, table_schema, compat_mode, store_flag, sstable, freezer))){
STORAGE_LOG(WARN, "tablet init failed", K(ret), K(ls_id), K(tablet_id));
} else {
} else if (ObTabletStatus::Status::MAX != tablet_status) {
ObTabletCreateDeleteMdsUserData data;
data.tablet_status_ = tablet_status;
data.create_commit_scn_ = create_commit_scn;
@ -142,20 +143,14 @@ inline int TestTabletHelper::create_tablet(
STORAGE_LOG(WARN, "data serialize failed", K(ret), K(data_serialize_size), K(pos));
} else {
tablet_handle.get_obj()->mds_data_.tablet_status_.committed_kv_.get_ptr()->v_.user_data_.assign(buf, data_serialize_size);
ObMetaDiskAddr disk_addr;
disk_addr.set_mem_addr(0, sizeof(ObTablet));
if(OB_FAIL(t3m->compare_and_swap_tablet(key,
tablet_handle,
tablet_handle))) {
STORAGE_LOG(WARN, "failed to compare and swap tablet", K(ret), K(ls_id), K(tablet_id), K(disk_addr));
} else {
ObLSTabletService *ls_tablet_svr = ls_handle.get_ls()->get_tablet_svr();
if OB_FAIL(ls_tablet_svr->tablet_id_set_.set(tablet_id)) {
STORAGE_LOG(WARN, "set tablet id failed", K(ret), K(tablet_id));
}
}
}
}
if (FAILEDx(t3m->compare_and_swap_tablet(key, tablet_handle, tablet_handle))) {
STORAGE_LOG(WARN, "failed to compare and swap tablet", K(ret), K(ls_id), K(tablet_id));
} else if OB_FAIL (ls_tablet_svr->tablet_id_set_.set(tablet_id)){
STORAGE_LOG(WARN, "set tablet id failed", K(ret), K(tablet_id));
}
}
return ret;
}