add create worker forcely for each group
This commit is contained in:
@ -337,7 +337,7 @@ void ObResourceGroup::update_queue_size()
|
|||||||
req_queue_.set_limit(common::ObServerConfig::get_instance().tenant_task_queue_size);
|
req_queue_.set_limit(common::ObServerConfig::get_instance().tenant_task_queue_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
int ObResourceGroup::acquire_more_worker(int64_t num, int64_t &succ_num)
|
int ObResourceGroup::acquire_more_worker(int64_t num, int64_t &succ_num, bool force)
|
||||||
{
|
{
|
||||||
int ret = OB_SUCCESS;
|
int ret = OB_SUCCESS;
|
||||||
ObTenantSwitchGuard guard(tenant_);
|
ObTenantSwitchGuard guard(tenant_);
|
||||||
@ -347,7 +347,7 @@ int ObResourceGroup::acquire_more_worker(int64_t num, int64_t &succ_num)
|
|||||||
|
|
||||||
while (OB_SUCC(ret) && need_num > succ_num) {
|
while (OB_SUCC(ret) && need_num > succ_num) {
|
||||||
ObThWorker *w = nullptr;
|
ObThWorker *w = nullptr;
|
||||||
if (OB_FAIL(create_worker(w, tenant_, group_id_, INT32_MAX, this))) {
|
if (OB_FAIL(create_worker(w, tenant_, group_id_, INT32_MAX, force, this))) {
|
||||||
LOG_WARN("create worker failed", K(ret));
|
LOG_WARN("create worker failed", K(ret));
|
||||||
} else if (!workers_.add_last(&w->worker_node_)) {
|
} else if (!workers_.add_last(&w->worker_node_)) {
|
||||||
OB_ASSERT(false);
|
OB_ASSERT(false);
|
||||||
@ -401,7 +401,7 @@ void ObResourceGroup::check_worker_count()
|
|||||||
const auto diff = min_worker_cnt() - workers_.get_size();
|
const auto diff = min_worker_cnt() - workers_.get_size();
|
||||||
token_change_ts_ = now;
|
token_change_ts_ = now;
|
||||||
ATOMIC_STORE(&shrink_, false);
|
ATOMIC_STORE(&shrink_, false);
|
||||||
acquire_more_worker(diff, succ_num);
|
acquire_more_worker(diff, succ_num, /* force */ true);
|
||||||
LOG_INFO("worker thread created", K(tenant_->id()), K(group_id_), K(token));
|
LOG_INFO("worker thread created", K(tenant_->id()), K(group_id_), K(token));
|
||||||
} else if (OB_UNLIKELY(token > workers_.get_size())
|
} else if (OB_UNLIKELY(token > workers_.get_size())
|
||||||
&& OB_LIKELY(ObMallocAllocator::get_instance()->get_tenant_remain(tenant_->id()) > ObMallocAllocator::get_instance()->get_tenant_limit(tenant_->id()) * 0.05)) {
|
&& OB_LIKELY(ObMallocAllocator::get_instance()->get_tenant_remain(tenant_->id()) > ObMallocAllocator::get_instance()->get_tenant_limit(tenant_->id()) * 0.05)) {
|
||||||
@ -1402,7 +1402,7 @@ void ObTenant::check_worker_count()
|
|||||||
const auto diff = min_worker_cnt() - workers_.get_size();
|
const auto diff = min_worker_cnt() - workers_.get_size();
|
||||||
token_change_ts_ = now;
|
token_change_ts_ = now;
|
||||||
ATOMIC_STORE(&shrink_, false);
|
ATOMIC_STORE(&shrink_, false);
|
||||||
acquire_more_worker(diff, succ_num);
|
acquire_more_worker(diff, succ_num, /* force */ true);
|
||||||
LOG_INFO("worker thread created", K(id_), K(token));
|
LOG_INFO("worker thread created", K(id_), K(token));
|
||||||
} else if (OB_UNLIKELY(token > workers_.get_size())
|
} else if (OB_UNLIKELY(token > workers_.get_size())
|
||||||
&& OB_LIKELY(ObMallocAllocator::get_instance()->get_tenant_remain(id_) > ObMallocAllocator::get_instance()->get_tenant_limit(id_) * 0.05)) {
|
&& OB_LIKELY(ObMallocAllocator::get_instance()->get_tenant_remain(id_) > ObMallocAllocator::get_instance()->get_tenant_limit(id_) * 0.05)) {
|
||||||
@ -1465,7 +1465,7 @@ int ObTenant::acquire_level_worker(int64_t num, int64_t &succ_num, int32_t level
|
|||||||
} else {
|
} else {
|
||||||
while (OB_SUCC(ret) && need_num > succ_num) {
|
while (OB_SUCC(ret) && need_num > succ_num) {
|
||||||
ObThWorker *w = nullptr;
|
ObThWorker *w = nullptr;
|
||||||
if (OB_FAIL(create_worker(w, this, 0, level))) {
|
if (OB_FAIL(create_worker(w, this, 0, level, true))) {
|
||||||
LOG_WARN("create worker failed", K(ret));
|
LOG_WARN("create worker failed", K(ret));
|
||||||
} else if (!nesting_workers_.add_last(&w->worker_node_)) {
|
} else if (!nesting_workers_.add_last(&w->worker_node_)) {
|
||||||
OB_ASSERT(false);
|
OB_ASSERT(false);
|
||||||
@ -1489,7 +1489,7 @@ int ObTenant::acquire_level_worker(int64_t num, int64_t &succ_num, int32_t level
|
|||||||
}
|
}
|
||||||
|
|
||||||
// This interface is unnecessary after adding htap
|
// This interface is unnecessary after adding htap
|
||||||
int ObTenant::acquire_more_worker(int64_t num, int64_t &succ_num)
|
int ObTenant::acquire_more_worker(int64_t num, int64_t &succ_num, bool force)
|
||||||
{
|
{
|
||||||
int ret = OB_SUCCESS;
|
int ret = OB_SUCCESS;
|
||||||
succ_num = 0;
|
succ_num = 0;
|
||||||
@ -1497,7 +1497,7 @@ int ObTenant::acquire_more_worker(int64_t num, int64_t &succ_num)
|
|||||||
ObTenantSwitchGuard guard(this);
|
ObTenantSwitchGuard guard(this);
|
||||||
while (OB_SUCC(ret) && num > succ_num) {
|
while (OB_SUCC(ret) && num > succ_num) {
|
||||||
ObThWorker *w = nullptr;
|
ObThWorker *w = nullptr;
|
||||||
if (OB_FAIL(create_worker(w, this, 0, 0))) {
|
if (OB_FAIL(create_worker(w, this, 0, 0, force))) {
|
||||||
LOG_WARN("create worker failed", K(ret));
|
LOG_WARN("create worker failed", K(ret));
|
||||||
} else if (!workers_.add_last(&w->worker_node_)) {
|
} else if (!workers_.add_last(&w->worker_node_)) {
|
||||||
OB_ASSERT(false);
|
OB_ASSERT(false);
|
||||||
|
|||||||
@ -280,7 +280,7 @@ public:
|
|||||||
|
|
||||||
int init();
|
int init();
|
||||||
void update_queue_size();
|
void update_queue_size();
|
||||||
int acquire_more_worker(int64_t num, int64_t &succ_num);
|
int acquire_more_worker(int64_t num, int64_t &succ_num, bool force = false);
|
||||||
void check_worker_count();
|
void check_worker_count();
|
||||||
void check_worker_count(ObThWorker &w);
|
void check_worker_count(ObThWorker &w);
|
||||||
int clear_worker();
|
int clear_worker();
|
||||||
@ -359,7 +359,7 @@ class ObTenant : public share::ObTenantBase
|
|||||||
friend class ObResourceGroup;
|
friend class ObResourceGroup;
|
||||||
friend int ::select_dump_tenant_info(lua_State*);
|
friend int ::select_dump_tenant_info(lua_State*);
|
||||||
friend int create_worker(ObThWorker* &worker, ObTenant *tenant, int32_t group_id,
|
friend int create_worker(ObThWorker* &worker, ObTenant *tenant, int32_t group_id,
|
||||||
int32_t level, ObResourceGroup *group);
|
int32_t level, bool force, ObResourceGroup *group);
|
||||||
friend int destroy_worker(ObThWorker *worker);
|
friend int destroy_worker(ObThWorker *worker);
|
||||||
using WListNode = common::ObDLinkNode<lib::Worker*>;
|
using WListNode = common::ObDLinkNode<lib::Worker*>;
|
||||||
using WList = common::ObDList<WListNode>;
|
using WList = common::ObDList<WListNode>;
|
||||||
@ -506,7 +506,7 @@ private:
|
|||||||
void check_group_worker_count();
|
void check_group_worker_count();
|
||||||
// alloc NUM worker
|
// alloc NUM worker
|
||||||
int acquire_level_worker(int64_t num, int64_t &succ_num, int32_t level);
|
int acquire_level_worker(int64_t num, int64_t &succ_num, int32_t level);
|
||||||
int acquire_more_worker(int64_t num, int64_t &succ_num);
|
int acquire_more_worker(int64_t num, int64_t &succ_num, bool force = false);
|
||||||
|
|
||||||
int64_t worker_count() const { return workers_.get_size(); }
|
int64_t worker_count() const { return workers_.get_size(); }
|
||||||
|
|
||||||
|
|||||||
@ -46,10 +46,10 @@ extern TLOCAL(bool, TLOCAL_NEED_WAIT_IN_LOCK_WAIT_MGR);
|
|||||||
namespace omt
|
namespace omt
|
||||||
{
|
{
|
||||||
int create_worker(ObThWorker* &worker, ObTenant *tenant, int32_t group_id,
|
int create_worker(ObThWorker* &worker, ObTenant *tenant, int32_t group_id,
|
||||||
int32_t level, ObResourceGroup *group)
|
int32_t level, bool force, ObResourceGroup *group)
|
||||||
{
|
{
|
||||||
int ret = OB_SUCCESS;
|
int ret = OB_SUCCESS;
|
||||||
if (tenant->total_worker_cnt() >= tenant->max_worker_cnt()) {
|
if (!force && tenant->total_worker_cnt() >= tenant->max_worker_cnt()) {
|
||||||
ret = OB_RESOURCE_OUT;
|
ret = OB_RESOURCE_OUT;
|
||||||
LOG_WARN("create worker fail", K(ret), K(tenant->id()), K(group_id), K(level),
|
LOG_WARN("create worker fail", K(ret), K(tenant->id()), K(group_id), K(level),
|
||||||
K(tenant->total_worker_cnt()), K(tenant->max_worker_cnt()));
|
K(tenant->total_worker_cnt()), K(tenant->max_worker_cnt()));
|
||||||
|
|||||||
@ -169,7 +169,7 @@ level: set worker's level, in ObResourceGroup level = INT32_MAX, in ObTenant lev
|
|||||||
group: set worker's group, in ObResourceGroup level = this, in ObTenant level = nullptr,
|
group: set worker's group, in ObResourceGroup level = this, in ObTenant level = nullptr,
|
||||||
*/
|
*/
|
||||||
int create_worker(ObThWorker* &worker, ObTenant *tenant, int32_t group_id,
|
int create_worker(ObThWorker* &worker, ObTenant *tenant, int32_t group_id,
|
||||||
int32_t level = INT32_MAX, ObResourceGroup *group = nullptr);
|
int32_t level = INT32_MAX, bool force = false, ObResourceGroup *group = nullptr);
|
||||||
// defalut level=INT32_MAX, group=nullptr
|
// defalut level=INT32_MAX, group=nullptr
|
||||||
int destroy_worker(ObThWorker *worker);
|
int destroy_worker(ObThWorker *worker);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user