[CP] fix request leak if failed to GC last worker.
This commit is contained in:
@ -539,10 +539,36 @@ int ObResourceGroup::clear_worker()
|
|||||||
{
|
{
|
||||||
int ret = OB_SUCCESS;
|
int ret = OB_SUCCESS;
|
||||||
ObMutexGuard guard(workers_lock_);
|
ObMutexGuard guard(workers_lock_);
|
||||||
while (req_queue_.size() > 0
|
|
||||||
|| (multi_level_queue_.get_total_size() > 0)) {
|
int tmp_ret = OB_SUCCESS;
|
||||||
ob_usleep(10L * 1000L);
|
const int64_t timeout = 10 * 1000;
|
||||||
|
ObLink* task = nullptr;
|
||||||
|
rpc::ObRequest *req = nullptr;
|
||||||
|
while (req_queue_.size() > 0) {
|
||||||
|
if (OB_TMP_FAIL(req_queue_.pop(task, timeout))) {
|
||||||
|
LOG_WARN("req queue pop task fail", K(tmp_ret), K(&req_queue_));
|
||||||
|
} else if (NULL != task) {
|
||||||
|
req = static_cast<rpc::ObRequest*>(task);
|
||||||
|
on_translate_fail(req, OB_TENANT_NOT_IN_SERVER);
|
||||||
|
} else {
|
||||||
|
LOG_ERROR("req queue pop successfully but task is NULL");
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int32_t level = 0; level < MULTI_LEVEL_QUEUE_SIZE; level++) {
|
||||||
|
while (multi_level_queue_.get_size(level) > 0) {
|
||||||
|
if (OB_TMP_FAIL(multi_level_queue_.pop(task, level, timeout))) {
|
||||||
|
LOG_WARN("req queue pop task fail", K(tmp_ret), K(&multi_level_queue_));
|
||||||
|
} else if (NULL != task) {
|
||||||
|
req = static_cast<rpc::ObRequest*>(task);
|
||||||
|
on_translate_fail(req, OB_TENANT_NOT_IN_SERVER);
|
||||||
|
} else {
|
||||||
|
LOG_ERROR("multi level queue pop successfully but task is NULL");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
while (nesting_workers_.get_size() > 0) {
|
while (nesting_workers_.get_size() > 0) {
|
||||||
int ret = OB_SUCCESS;
|
int ret = OB_SUCCESS;
|
||||||
DLIST_FOREACH_REMOVESAFE(wnode, nesting_workers_) {
|
DLIST_FOREACH_REMOVESAFE(wnode, nesting_workers_) {
|
||||||
|
Reference in New Issue
Block a user