[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