[CP] Fix: Fix the core caused by ObConflictRowMapCtx
This commit is contained in:
@ -133,18 +133,24 @@ int ObConflictRowMapCtx::destroy()
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ObConflictRowMapCtx::init_conflict_map(int64_t replace_row_cnt, int64_t rowkey_cnt)
|
int ObConflictRowMapCtx::init_conflict_map(int64_t replace_row_cnt, int64_t rowkey_cnt, common::ObIAllocator *allocator)
|
||||||
{
|
{
|
||||||
int ret = OB_SUCCESS;
|
int ret = OB_SUCCESS;
|
||||||
if (!conflict_map_.created()) {
|
if (OB_ISNULL(allocator)) {
|
||||||
|
ret = OB_ERR_UNEXPECTED;
|
||||||
|
LOG_WARN("Allocator used to init conflict map is null", K(ret));
|
||||||
|
} else {
|
||||||
|
allocator_ = allocator;
|
||||||
|
}
|
||||||
|
if (OB_SUCC(ret) && !conflict_map_.created()) {
|
||||||
ObObj *objs = NULL;
|
ObObj *objs = NULL;
|
||||||
int64_t bucket_num = 0;
|
int64_t bucket_num = 0;
|
||||||
bucket_num = replace_row_cnt < MAX_ROW_BATCH_SIZE ? replace_row_cnt : MAX_ROW_BATCH_SIZE;
|
bucket_num = replace_row_cnt < MAX_ROW_BATCH_SIZE ? replace_row_cnt : MAX_ROW_BATCH_SIZE;
|
||||||
// map 没创建的场景下才需要创建, 这里可能被重复调用
|
// map 没创建的场景下才需要创建, 这里可能被重复调用
|
||||||
if (NULL == (rowkey_ = static_cast<ObRowkey*>(allocator_.alloc(sizeof(ObRowkey))))) {
|
if (NULL == (rowkey_ = static_cast<ObRowkey*>(allocator_->alloc(sizeof(ObRowkey))))) {
|
||||||
ret = OB_ALLOCATE_MEMORY_FAILED;
|
ret = OB_ALLOCATE_MEMORY_FAILED;
|
||||||
LOG_WARN("fail to alloc memory", K(ret));
|
LOG_WARN("fail to alloc memory", K(ret));
|
||||||
} else if (NULL == (objs = static_cast<ObObj*>(allocator_.alloc(sizeof(ObObj)* rowkey_cnt)))){
|
} else if (NULL == (objs = static_cast<ObObj*>(allocator_->alloc(sizeof(ObObj)* rowkey_cnt)))){
|
||||||
ret = OB_ALLOCATE_MEMORY_FAILED;
|
ret = OB_ALLOCATE_MEMORY_FAILED;
|
||||||
LOG_WARN("fail to alloc memory", K(ret));
|
LOG_WARN("fail to alloc memory", K(ret));
|
||||||
} else if (OB_FAIL(conflict_map_.create(bucket_num, ObModIds::OB_HASH_BUCKET))) {
|
} else if (OB_FAIL(conflict_map_.create(bucket_num, ObModIds::OB_HASH_BUCKET))) {
|
||||||
@ -178,7 +184,7 @@ int ObConflictChecker::create_conflict_map(int64_t replace_row_cnt)
|
|||||||
ObRowkeyCstCtdef *rowkey_cst_ctdef = checker_ctdef_.cst_ctdefs_.at(i);
|
ObRowkeyCstCtdef *rowkey_cst_ctdef = checker_ctdef_.cst_ctdefs_.at(i);
|
||||||
int64_t rowkey_cnt = rowkey_cst_ctdef->rowkey_expr_.count();
|
int64_t rowkey_cnt = rowkey_cst_ctdef->rowkey_expr_.count();
|
||||||
// 在init_conflict_map 函数内保证了map不会被重复created
|
// 在init_conflict_map 函数内保证了map不会被重复created
|
||||||
if (OB_FAIL(conflict_map_array_.at(i).init_conflict_map(replace_row_cnt, rowkey_cnt))) {
|
if (OB_FAIL(conflict_map_array_.at(i).init_conflict_map(replace_row_cnt, rowkey_cnt, &allocator_))) {
|
||||||
LOG_WARN("fail to init conflict_map", K(ret), K(rowkey_cnt));
|
LOG_WARN("fail to init conflict_map", K(ret), K(rowkey_cnt));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -74,12 +74,12 @@ public:
|
|||||||
ObConflictRowMapCtx()
|
ObConflictRowMapCtx()
|
||||||
: conflict_map_(),
|
: conflict_map_(),
|
||||||
rowkey_(NULL),
|
rowkey_(NULL),
|
||||||
allocator_(CURRENT_CONTEXT->get_arena_allocator())
|
allocator_(nullptr)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
~ObConflictRowMapCtx() {};
|
~ObConflictRowMapCtx() {};
|
||||||
|
|
||||||
int init_conflict_map(int64_t bucket_num, int64_t obj_cnt);
|
int init_conflict_map(int64_t bucket_num, int64_t obj_cnt, common::ObIAllocator *allocator);
|
||||||
int reuse();
|
int reuse();
|
||||||
int destroy();
|
int destroy();
|
||||||
|
|
||||||
@ -87,7 +87,7 @@ public:
|
|||||||
static const int64_t MAX_ROW_BATCH_SIZE = 500;
|
static const int64_t MAX_ROW_BATCH_SIZE = 500;
|
||||||
ObConflictRowMap conflict_map_;
|
ObConflictRowMap conflict_map_;
|
||||||
ObRowkey *rowkey_; // 临时的ObRowkey,用于map的compare,循环使用
|
ObRowkey *rowkey_; // 临时的ObRowkey,用于map的compare,循环使用
|
||||||
common::ObIAllocator &allocator_; // allocator用来创建hash map
|
common::ObIAllocator *allocator_; // allocator用来创建hash map
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef common::ObFixedArray<ObRowkeyCstCtdef *, common::ObIAllocator> ObRowkeyCstCtdefArray;
|
typedef common::ObFixedArray<ObRowkeyCstCtdef *, common::ObIAllocator> ObRowkeyCstCtdefArray;
|
||||||
|
|||||||
Reference in New Issue
Block a user