提交 7433acf7 编写于 作者: O obdev 提交者: wangzelin.wzl

[CP] [CP] [CP] Fix reference count exception when ps cache evict task concurrency

上级 1da9b531
......@@ -39,6 +39,7 @@ ObPsCache::ObPsCache()
mem_low_pct_(0),
hit_count_(0),
access_count_(0),
mutex_(),
mem_context_(NULL),
inner_allocator_(NULL)
{}
......@@ -46,8 +47,6 @@ ObPsCache::ObPsCache()
ObPsCache::~ObPsCache()
{
int ret = OB_SUCCESS;
// ps_stmt_id和ps_stmt_info创建时,会给其增加引用计数
// 现在PsCache要析构了,对所有内部对象减去1,如果引用计数到0,会显式free内存
cache_evict_all_ps();
if (NULL != mem_context_) {
......@@ -709,6 +708,12 @@ int ObPsCache::cache_evict_all_ps()
int ObPsCache::inner_cache_evict(bool is_evict_all)
{
int ret = OB_SUCCESS;
// There is a concurrency problem between the regularly triggered ps cache evict task and
// the manually triggered flush ps cache evict task. There is also a concurrency problem between
// the flush ps cache evict tasks triggered at the same time in different sessions.
// The same ps stmt may be added to the closed list by different ps cache evict tasks
// at the same time, so mutex is used here to make all flush ps cache evict tasks execute serially
lib::ObMutexGuard guard(mutex_);
PsIdClosedTimePairs expired_stmt_ids;
PsIdClosedTimePairs closed_stmt_ids;
ObGetClosedStmtIdOp op(&expired_stmt_ids, &closed_stmt_ids);
......
......@@ -187,6 +187,7 @@ private:
uint64_t hit_count_;
uint64_t access_count_;
lib::ObMutex mutex_;
lib::MemoryContext mem_context_;
common::ObIAllocator* inner_allocator_;
};
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册