[CP] free a dup_tablet_set after 4013
This commit is contained in:
@ -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_++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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);
|
||||
|
||||
Reference in New Issue
Block a user