fix WORK_AREA not limit after restart observer

This commit is contained in:
tushicheng
2023-06-12 04:42:23 +00:00
committed by ob-robot
parent 9ab529a64b
commit 913dea2c36
4 changed files with 28 additions and 12 deletions

View File

@ -48,6 +48,7 @@ int64_t ob_get_reserved_urgent_memory();
// pc_pctg: percentage limitation of tenant memory can be used by Plan Cache // pc_pctg: percentage limitation of tenant memory can be used by Plan Cache
// wa_pctg: percentage limitation of tenant memory can be used by Work Area // wa_pctg: percentage limitation of tenant memory can be used by Work Area
int set_ctx_limit(uint64_t tenant_id, uint64_t ctx_id, const int64_t limit);
int set_wa_limit(uint64_t tenand_id, int64_t wa_pctg); int set_wa_limit(uint64_t tenand_id, int64_t wa_pctg);
// set meta object memory limit for specified tenant. // set meta object memory limit for specified tenant.

View File

@ -235,19 +235,21 @@ TEST_F(TestMultiTenant, get_tenant_context)
class CtxMemConfigGetter : public ObICtxMemConfigGetter class CtxMemConfigGetter : public ObICtxMemConfigGetter
{ {
public: public:
virtual int get(common::ObIArray<ObCtxMemConfig> &configs) virtual int get(common::ObIArray<ObCtxMemConfig> &configs, int64_t tenant_limit)
{ {
int ret = OB_SUCCESS; int ret = OB_SUCCESS;
{ {
ObCtxMemConfig cfg; ObCtxMemConfig cfg;
cfg.ctx_id_ = 10; cfg.ctx_id_ = 10;
cfg.idle_size_ = 10 * INTACT_ACHUNK_SIZE; cfg.idle_size_ = 10 * INTACT_ACHUNK_SIZE;
cfg.limit_ = 5 * tenant_limit / 100;
ret = configs.push_back(cfg); ret = configs.push_back(cfg);
} }
{ {
ObCtxMemConfig cfg; ObCtxMemConfig cfg;
cfg.ctx_id_ = 11; cfg.ctx_id_ = 11;
cfg.idle_size_ = 20 * INTACT_ACHUNK_SIZE; cfg.idle_size_ = 20 * INTACT_ACHUNK_SIZE;
cfg.limit_ = 10 * tenant_limit / 100;
ret = configs.push_back(cfg); ret = configs.push_back(cfg);
} }
return ret; return ret;
@ -262,10 +264,11 @@ TEST_F(TestMultiTenant, idle)
uint64_t tenant_id = 100; uint64_t tenant_id = 100;
int ret = add_tenant(tenant_id); int ret = add_tenant(tenant_id);
ASSERT_EQ(OB_SUCCESS, ret); ASSERT_EQ(OB_SUCCESS, ret);
common::ObArray<ObCtxMemConfig> configs;
mcg.get(configs);
ASSERT_TRUE(2 == configs.size());
ObMallocAllocator *malloc_allocator = ObMallocAllocator::get_instance(); ObMallocAllocator *malloc_allocator = ObMallocAllocator::get_instance();
int64_t tenant_limit = malloc_allocator->get_tenant_limit(tenant_id);
common::ObArray<ObCtxMemConfig> configs;
mcg.get(configs, tenant_limit);
ASSERT_TRUE(2 == configs.size());
for (int i = 0 ; i < configs.size(); i++) { for (int i = 0 ; i < configs.size(); i++) {
ObCtxMemConfig &cfg = configs.at(i); ObCtxMemConfig &cfg = configs.at(i);
auto ta = malloc_allocator->get_tenant_ctx_allocator(tenant_id, cfg.ctx_id_); auto ta = malloc_allocator->get_tenant_ctx_allocator(tenant_id, cfg.ctx_id_);
@ -273,6 +276,7 @@ TEST_F(TestMultiTenant, idle)
int64_t chunk_cnt = cfg.idle_size_/INTACT_ACHUNK_SIZE; int64_t chunk_cnt = cfg.idle_size_/INTACT_ACHUNK_SIZE;
ASSERT_EQ(ta->chunk_cnt_, chunk_cnt); ASSERT_EQ(ta->chunk_cnt_, chunk_cnt);
ASSERT_EQ(ta->idle_size_, cfg.idle_size_); ASSERT_EQ(ta->idle_size_, cfg.idle_size_);
ASSERT_EQ(ta->get_limit(), cfg.limit_);
ASSERT_NE(0, malloc_allocator->get_tenant_ctx_hold(tenant_id, cfg.ctx_id_)); ASSERT_NE(0, malloc_allocator->get_tenant_ctx_hold(tenant_id, cfg.ctx_id_));
} }
// remove // remove

View File

@ -210,10 +210,17 @@ bool equal_with_tenant_id(const ObTenant *lhs,
return NULL != lhs ? (lhs->id() == tenant_id) : false; return NULL != lhs ? (lhs->id() == tenant_id) : false;
} }
int ObCtxMemConfigGetter::get(common::ObIArray<ObCtxMemConfig> &configs) int ObCtxMemConfigGetter::get(common::ObIArray<ObCtxMemConfig> &configs, int64_t tenant_limit)
{ {
UNUSED(configs); int64_t ret = OB_SUCCESS;
return OB_SUCCESS; {
ObCtxMemConfig cfg;
cfg.ctx_id_ = ObCtxIds::WORK_AREA;
cfg.idle_size_ = 0;
cfg.limit_ = 5 * tenant_limit / 100;
ret = configs.push_back(cfg);
}
return ret;
} }
ObCtxMemConfigGetter g_default_mcg; ObCtxMemConfigGetter g_default_mcg;
@ -786,15 +793,18 @@ int ObMultiTenant::create_tenant(const ObTenantMeta &meta, bool write_slog, cons
} }
if (OB_SUCC(ret)) { if (OB_SUCC(ret)) {
ObSEArray<ObCtxMemConfig, ObCtxIds::MAX_CTX_ID> configs; ObSEArray<ObCtxMemConfig, ObCtxIds::MAX_CTX_ID> configs;
if (OB_FAIL(mcg_->get(configs))) { if (OB_FAIL(mcg_->get(configs, allowed_mem_limit))) {
LOG_ERROR("get ctx mem config failed", K(ret)); LOG_ERROR("get ctx mem config failed", K(ret));
} }
for (int64_t i = 0; OB_SUCC(ret) && i < configs.count(); i++) { for (int64_t i = 0; OB_SUCC(ret) && i < configs.count(); i++) {
const uint64_t ctx_id = configs.at(i).ctx_id_; const uint64_t ctx_id = configs.at(i).ctx_id_;
const int64_t idle_size = configs.at(i).idle_size_; const int64_t idle_size = configs.at(i).idle_size_;
const int64_t limit = configs.at(i).limit_;
const bool reserve = true; const bool reserve = true;
if (OB_FAIL(malloc_allocator->set_tenant_ctx_idle(tenant_id, ctx_id, idle_size, reserve))) { if (OB_FAIL(malloc_allocator->set_tenant_ctx_idle(tenant_id, ctx_id, idle_size, reserve))) {
LOG_ERROR("set tenant ctx idle failed", K(ret)); LOG_ERROR("set tenant ctx idle failed", K(ret));
} else if (OB_FAIL(set_ctx_limit(tenant_id, ctx_id, limit))) {
LOG_ERROR("set tenant ctx limit failed", K(ret), K(limit));
} }
LOG_INFO("init ctx memory finish", K(ret), K(tenant_id), K(i), K(configs.at(i))); LOG_INFO("init ctx memory finish", K(ret), K(tenant_id), K(i), K(configs.at(i)));
} }

View File

@ -45,22 +45,23 @@ class ObTenantConfig;
struct ObCtxMemConfig struct ObCtxMemConfig
{ {
ObCtxMemConfig() ObCtxMemConfig()
: ctx_id_(0), idle_size_(0) {} : ctx_id_(0), idle_size_(0), limit_(INT64_MAX) {}
uint64_t ctx_id_; uint64_t ctx_id_;
int64_t idle_size_; int64_t idle_size_;
TO_STRING_KV(K_(ctx_id), K_(idle_size)); int64_t limit_;
TO_STRING_KV(K_(ctx_id), K_(idle_size), K_(limit));
}; };
class ObICtxMemConfigGetter class ObICtxMemConfigGetter
{ {
public: public:
virtual int get(common::ObIArray<ObCtxMemConfig> &configs) = 0; virtual int get(common::ObIArray<ObCtxMemConfig> &configs, int64_t tenant_limit) = 0;
}; };
class ObCtxMemConfigGetter : public ObICtxMemConfigGetter class ObCtxMemConfigGetter : public ObICtxMemConfigGetter
{ {
public: public:
virtual int get(common::ObIArray<ObCtxMemConfig> &configs); virtual int get(common::ObIArray<ObCtxMemConfig> &configs, int64_t tenant_limit);
}; };
// Forward declearation // Forward declearation