[CP] free a dup_tablet_set after 4013

This commit is contained in:
obdev
2024-02-09 05:41:27 +00:00
committed by ob-robot
parent 5fd93005c8
commit 8d6d93ee73
2 changed files with 52 additions and 27 deletions

View File

@ -384,18 +384,8 @@ int ObLSDupTabletsMgr::init_free_tablet_pool_()
const uint64_t tenant_id = MTL_ID();
for (int i = 0; i < RESERVED_FREE_SET_COUNT && OB_SUCC(ret); i++) {
DupTabletChangeMap *tmp_map_ptr = nullptr;
if (OB_ISNULL(tmp_map_ptr = static_cast<DupTabletChangeMap *>(
share::mtl_malloc(sizeof(DupTabletChangeMap), "DupTabletMap")))) {
ret = OB_ALLOCATE_MEMORY_FAILED;
// } else if (OB_FALSE_IT(extra_free_set_alloc_count_++)) {
} else if (OB_FALSE_IT(new (tmp_map_ptr) DupTabletChangeMap(i + 1))) {
} else if (OB_FAIL(tmp_map_ptr->create(tenant_id, 1024))) {
DUP_TABLE_LOG(WARN, "create dup_tablet hash map", K(ret));
} else if (false == (free_set_pool_.add_last(tmp_map_ptr))) {
ret = OB_ERR_UNEXPECTED;
DUP_TABLE_LOG(WARN, "push back into free_set_pool failed", K(ret),
K(free_set_pool_.get_size()), KPC(tmp_map_ptr));
if (OB_FAIL(alloc_one_free_tablet_set_(i + 1))) {
DUP_TABLE_LOG(WARN, "alloc one free tablet set failed", K(ret), K(i));
}
}
@ -2318,29 +2308,58 @@ int ObLSDupTabletsMgr::discover_dup_tablet_(const common::ObTabletID &tablet_id,
K(readable_tablets_list_.get_size()));
return ret;
}
int ObLSDupTabletsMgr::alloc_extra_free_tablet_set_()
int ObLSDupTabletsMgr::alloc_one_free_tablet_set_(const uint64_t uid)
{
int ret = OB_SUCCESS;
const int64_t origin_free_set_size = free_set_pool_.get_size();
bool construct_object_succ = true;
DupTabletChangeMap *tmp_map_ptr = nullptr;
const uint64_t tenant_id = MTL_ID();
if (OB_ISNULL(tmp_map_ptr = static_cast<DupTabletChangeMap *>(
share::mtl_malloc(sizeof(DupTabletChangeMap), "DupTabletMap")))) {
ret = OB_ALLOCATE_MEMORY_FAILED;
} else if (OB_FALSE_IT(extra_free_set_alloc_count_++)) {
} else if (OB_FALSE_IT(new (tmp_map_ptr) DupTabletChangeMap(RESERVED_FREE_SET_COUNT
+ extra_free_set_alloc_count_))) {
DUP_TABLE_LOG(WARN, "alloc a dup tablet map failed", K(ret), K(uid), KPC(tmp_map_ptr));
} else if (OB_FALSE_IT(new (tmp_map_ptr) DupTabletChangeMap(uid))) {
} else if (OB_FALSE_IT(construct_object_succ = true)) {
} else if (OB_FAIL(tmp_map_ptr->create(tenant_id, 1024))) {
DUP_TABLE_LOG(WARN, "create dup_tablet hash map", K(ret));
} else if (false == (free_set_pool_.add_last(tmp_map_ptr))) {
ret = OB_ERR_UNEXPECTED;
ret = OB_ALLOCATE_MEMORY_FAILED;
DUP_TABLE_LOG(WARN, "push back into free_set_pool failed", K(ret), K(free_set_pool_.get_size()),
KPC(tmp_map_ptr));
}
DUP_TABLE_LOG(INFO, "alloc a extra free tablet set", K(ret), K(last_no_free_set_time_),
K(extra_free_set_alloc_count_), KPC(changing_new_set_),
K(free_set_pool_.get_size()), K(need_confirm_new_queue_.get_size()),
K(readable_tablets_list_.get_size()));
if (OB_FAIL(ret)) {
if (free_set_pool_.get_size() == origin_free_set_size) {
if (OB_NOT_NULL(tmp_map_ptr)) {
if (construct_object_succ) {
if (tmp_map_ptr->created()) {
tmp_map_ptr->destroy();
}
tmp_map_ptr->~DupTabletChangeMap();
}
mtl_free(tmp_map_ptr);
}
} else {
DUP_TABLE_LOG(
ERROR, "unexpected free set in hash_map, rewrite the err_code as OB_ERR_UNEXPECTED",
K(ret), KPC(tmp_map_ptr), K(origin_free_set_size), K(free_set_pool_.get_size()));
ret = OB_ERR_UNEXPECTED;
}
} else {
if (uid > RESERVED_FREE_SET_COUNT) {
DUP_TABLE_LOG(INFO, "alloc a extra free tablet set", K(ret), K(last_no_free_set_time_),
K(uid), K(extra_free_set_alloc_count_), KPC(changing_new_set_),
K(free_set_pool_.get_size()), K(need_confirm_new_queue_.get_size()),
K(readable_tablets_list_.get_size()));
}
}
return ret;
}
@ -2365,8 +2384,11 @@ int ObLSDupTabletsMgr::get_free_tablet_set(DupTabletChangeMap *&free_set,
}
while (OB_SUCC(ret) && target_id > RESERVED_FREE_SET_COUNT + extra_free_set_alloc_count_) {
if (OB_FAIL(alloc_extra_free_tablet_set_())) {
if (OB_FAIL(
alloc_one_free_tablet_set_(RESERVED_FREE_SET_COUNT + extra_free_set_alloc_count_ + 1))) {
DUP_TABLE_LOG(WARN, "alloc extra free tablet set failed", K(ret));
} else {
extra_free_set_alloc_count_++;
}
}
@ -2377,8 +2399,12 @@ int ObLSDupTabletsMgr::get_free_tablet_set(DupTabletChangeMap *&free_set,
if (force_alloc || extra_free_set_alloc_count_ < MAX_FREE_SET_COUNT - RESERVED_FREE_SET_COUNT
|| ObTimeUtility::fast_current_time() - last_no_free_set_time_ >= 3 * 1000 * 1000) {
if (OB_FAIL(alloc_extra_free_tablet_set_())) {
DUP_TABLE_LOG(WARN, "alloc extra free tablet set failed", K(ret));
if (OB_FAIL(alloc_one_free_tablet_set_(RESERVED_FREE_SET_COUNT + extra_free_set_alloc_count_
+ 1))) {
DUP_TABLE_LOG(WARN, "alloc extra free tablet set failed", K(ret),
K(RESERVED_FREE_SET_COUNT), K(extra_free_set_alloc_count_));
} else {
extra_free_set_alloc_count_++;
}
}
}

View File

@ -807,9 +807,8 @@ private:
int init_free_tablet_pool_();
int destroy_free_tablet_pool_();
// int get_changing_new_set_(DupTabletChangeMap *&changing_new_set);
// int get_old_tablet_set_(DupTabletChangeMap *&old_tablet_set);
int alloc_extra_free_tablet_set_();
int alloc_one_free_tablet_set_(const uint64_t uid);
int get_free_tablet_set(DupTabletChangeMap *&free_set,
const bool force_alloc = false,
const uint64_t target_id = 0);