Fix get tablet return 4165
This commit is contained in:
@ -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;
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user