BUGFI: forbid frequent freeze
This commit is contained in:
@ -170,6 +170,10 @@ public:
|
||||
bool need_do_writing_throttle() const;
|
||||
bool check_clock_over_seq(const int64_t seq);
|
||||
int64_t expected_wait_time(const int64_t seq) const;
|
||||
int64_t get_max_cached_memstore_size() const
|
||||
{
|
||||
return MAX_CACHED_GROUP_COUNT * ATOMIC_LOAD(&nway_) * (PAGE_SIZE + ACHUNK_PRESERVE_SIZE);
|
||||
}
|
||||
private:
|
||||
ObQSync& get_qs() {
|
||||
static ObQSync s_qs;
|
||||
|
||||
@ -149,6 +149,9 @@ public:
|
||||
int64_t hazard = hlist_.hazard();
|
||||
return hazard == INT64_MAX? 0: hazard;
|
||||
}
|
||||
int64_t get_max_cached_memstore_size() const {
|
||||
return arena_.get_max_cached_memstore_size();
|
||||
}
|
||||
int64_t get_mem_total_memstore_used() const { return arena_.hold(); }
|
||||
void log_frozen_memstore_info(char* buf, int64_t limit) {
|
||||
if (NULL != buf && limit > 0) {
|
||||
|
||||
@ -950,6 +950,7 @@ int ObTenantFreezer::get_tenant_mem_usage_(ObTenantFreezeCtx &ctx)
|
||||
int64_t active_memstore_used = 0;
|
||||
int64_t total_memstore_used = 0;
|
||||
int64_t total_memstore_hold = 0;
|
||||
int64_t max_cached_memstore_size = 0;
|
||||
|
||||
const uint64_t tenant_id = MTL_ID();
|
||||
if (OB_FAIL(allocator_mgr_->get_tenant_memstore_allocator(tenant_id,
|
||||
@ -963,10 +964,12 @@ int ObTenantFreezer::get_tenant_mem_usage_(ObTenantFreezeCtx &ctx)
|
||||
total_memstore_used = tenant_allocator->get_mem_total_memstore_used();
|
||||
total_memstore_hold = get_tenant_memory_hold(tenant_id,
|
||||
ObCtxIds::MEMSTORE_CTX_ID);
|
||||
max_cached_memstore_size = tenant_allocator->get_max_cached_memstore_size();
|
||||
}
|
||||
ctx.active_memstore_used_ = active_memstore_used;
|
||||
ctx.total_memstore_used_ = total_memstore_used;
|
||||
ctx.total_memstore_hold_ = total_memstore_hold;
|
||||
ctx.max_cached_memstore_size_ = max_cached_memstore_size;
|
||||
|
||||
return ret;
|
||||
}
|
||||
@ -1272,10 +1275,10 @@ bool ObTenantFreezer::need_freeze_(const ObTenantFreezeCtx &ctx)
|
||||
{
|
||||
bool need_freeze = false;
|
||||
// 1. trigger by active memstore used.
|
||||
if (ctx.active_memstore_used_ > ctx.memstore_freeze_trigger_) {
|
||||
if (ctx.active_memstore_used_ > ctx.memstore_freeze_trigger_ + ctx.max_cached_memstore_size_) {
|
||||
need_freeze = true;
|
||||
LOG_INFO("[TenantFreezer] A minor freeze is needed by active memstore used.",
|
||||
K(ctx.active_memstore_used_), K(ctx.memstore_freeze_trigger_));
|
||||
K(ctx.active_memstore_used_), K(ctx.memstore_freeze_trigger_), K(ctx.max_cached_memstore_size_));
|
||||
}
|
||||
return need_freeze;
|
||||
}
|
||||
@ -1317,6 +1320,7 @@ int ObTenantFreezer::do_minor_freeze_(const ObTenantFreezeCtx &ctx)
|
||||
LOG_INFO("[TenantFreezer] A minor freeze is needed",
|
||||
"active_memstore_used_", ctx.active_memstore_used_,
|
||||
"memstore_freeze_trigger", ctx.memstore_freeze_trigger_,
|
||||
"max_cached_memstore_size", ctx.max_cached_memstore_size_,
|
||||
"mem_tenant_remain", get_tenant_memory_remain(MTL_ID()),
|
||||
"mem_tenant_limit", get_tenant_memory_limit(MTL_ID()),
|
||||
"mem_tenant_hold", get_tenant_memory_hold(MTL_ID()),
|
||||
|
||||
@ -47,7 +47,8 @@ ObTenantFreezeCtx::ObTenantFreezeCtx()
|
||||
kvcache_mem_(0),
|
||||
active_memstore_used_(0),
|
||||
total_memstore_used_(0),
|
||||
total_memstore_hold_(0)
|
||||
total_memstore_hold_(0),
|
||||
max_cached_memstore_size_(0)
|
||||
{
|
||||
}
|
||||
|
||||
@ -62,6 +63,7 @@ void ObTenantFreezeCtx::reset()
|
||||
active_memstore_used_ = 0;
|
||||
total_memstore_used_ = 0;
|
||||
total_memstore_hold_ = 0;
|
||||
max_cached_memstore_size_ = 0;
|
||||
}
|
||||
|
||||
ObTenantInfo::ObTenantInfo()
|
||||
|
||||
@ -75,6 +75,8 @@ public:
|
||||
int64_t active_memstore_used_;
|
||||
int64_t total_memstore_used_;
|
||||
int64_t total_memstore_hold_;
|
||||
|
||||
int64_t max_cached_memstore_size_;
|
||||
private:
|
||||
DISABLE_COPY_ASSIGN(ObTenantFreezeCtx);
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user