fix empty shell cannot be washed

This commit is contained in:
obdev 2023-11-23 11:15:11 +00:00 committed by ob-robot
parent aede9be0db
commit c83b726c71
2 changed files with 29 additions and 2 deletions

View File

@ -686,6 +686,35 @@ TEST_F(TestLSTabletService, test_replay_empty_shell)
ObTabletMemberWrapper<ObTabletTableStore> wrapper;
test_tablet_handle.get_obj()->fetch_table_store(wrapper);
ASSERT_EQ(nullptr, wrapper.get_member()->get_major_sstables().get_boundary_table(true));
ObMetaDiskAddr tablet_addr = test_tablet_handle.get_obj()->tablet_addr_;
// validate that empty shell can be washed
ObTabletHandle normal_tablet_hdl;
void *free_obj = nullptr;
ObTabletPointer *tablet_ptr = test_tablet_handle.get_obj()->pointer_hdl_.get_resource_ptr();
ObTablet *empty_tablet = test_tablet_handle.get_obj();
test_tablet_handle.reset(); // release the ref cnt of tablet
ret = tablet_ptr->dump_meta_obj(normal_tablet_hdl, free_obj);
ASSERT_EQ(OB_SUCCESS, ret);
ASSERT_NE(nullptr, free_obj);
ASSERT_EQ((char *)(empty_tablet), (char *)(free_obj)+32); // 32Bytes header
// gc empty tablet
ObTenantMetaMemMgr *t3m = MTL(ObTenantMetaMemMgr *);
ret = t3m->gc_tablet(empty_tablet);
ASSERT_EQ(OB_SUCCESS, ret);
bool cleared = false;
ret = t3m->gc_tablets_in_queue(cleared);
ASSERT_EQ(OB_SUCCESS, ret);
ASSERT_TRUE(cleared);
// test load empty tablet
ret = ls_handle.get_ls()->get_tablet_svr()->get_tablet(tablet_id, test_tablet_handle, 0, ObMDSGetTabletMode::READ_WITHOUT_CHECK);
ASSERT_EQ(OB_SUCCESS, ret);
test_tablet_handle.get_obj()->fetch_table_store(wrapper);
ASSERT_EQ(nullptr, wrapper.get_member()->get_major_sstables().get_boundary_table(true));
ASSERT_EQ(tablet_addr, test_tablet_handle.get_obj()->tablet_addr_);
ObTabletMapKey key(ls_id_, tablet_id);
ret = ls_tablet_service_->do_remove_tablet(key);

View File

@ -314,8 +314,6 @@ int ObTabletPointer::dump_meta_obj(ObMetaObjGuard<ObTablet> &guard, void *&free_
} else if (OB_UNLIKELY(obj_.ptr_->get_ref() < 1)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("unexpected error, tablet ref is less than 1", K(ret), KPC(obj_.ptr_));
} else if (OB_UNLIKELY(phy_addr_.is_file())) {
LOG_INFO("obj is empty shell, don't be wash", K(ret), K(phy_addr_));
} else if (OB_ISNULL(obj_.pool_)) {
ret = OB_ERR_UNEXPECTED;
LOG_ERROR("obj is not allocated from pool", K(ret), K(*this));