diff --git a/mittest/mtlenv/storage/test_tablet_status_cache.cpp b/mittest/mtlenv/storage/test_tablet_status_cache.cpp index fd3229722f..e1d1db7109 100644 --- a/mittest/mtlenv/storage/test_tablet_status_cache.cpp +++ b/mittest/mtlenv/storage/test_tablet_status_cache.cpp @@ -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; diff --git a/src/storage/tablet/ob_tablet.cpp b/src/storage/tablet/ob_tablet.cpp index cf94c799bc..430e451033 100755 --- a/src/storage/tablet/ob_tablet.cpp +++ b/src/storage/tablet/ob_tablet.cpp @@ -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; } diff --git a/unittest/storage/test_tablet_helper.h b/unittest/storage/test_tablet_helper.h index aab72c8a97..11af499a73 100644 --- a/unittest/storage/test_tablet_helper.h +++ b/unittest/storage/test_tablet_helper.h @@ -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; }