[CP] fix ddl wrongly relying on macro_block_buf

This commit is contained in:
obdev
2023-04-26 20:22:44 +08:00
committed by ob-robot
parent 663c6f510d
commit 782e59f78f
2 changed files with 17 additions and 16 deletions

View File

@ -155,11 +155,6 @@ int ObDDLMacroBlockClogCb::init(const share::ObLSID &ls_id,
} else if (OB_UNLIKELY(!ls_id.is_valid() || !redo_info.is_valid() || !macro_block_id.is_valid() || !ddl_kv_mgr_handle.is_valid())) {
ret = OB_INVALID_ARGUMENT;
LOG_WARN("invalid argument", K(ret), K(ls_id), K(redo_info), K(macro_block_id));
} else {
void *buf = nullptr;
if (OB_ISNULL(buf = arena_.alloc(redo_info.data_buffer_.length()))) {
ret = OB_ALLOCATE_MEMORY_FAILED;
LOG_WARN("allocate memory failed", K(ret), K(redo_info.data_buffer_.length()));
} else {
redo_info_.data_buffer_.assign(const_cast<char *>(redo_info.data_buffer_.ptr()), redo_info.data_buffer_.length());
redo_info_.block_type_ = redo_info.block_type_;
@ -170,7 +165,6 @@ int ObDDLMacroBlockClogCb::init(const share::ObLSID &ls_id,
macro_block_id_ = macro_block_id;
ddl_kv_mgr_handle_ = ddl_kv_mgr_handle;
}
}
return ret;
}

View File

@ -613,6 +613,8 @@ int ObDDLRedoLogWriter::write(
+ log.get_serialize_size();
int64_t pos = 0;
ObDDLMacroBlockClogCb *cb = nullptr;
ObDDLRedoLog tmp_log;
int64_t log_start_pos = 0;
palf::LSN lsn;
const bool need_nonblock= false;
@ -633,14 +635,18 @@ int ObDDLRedoLogWriter::write(
} else if (OB_ISNULL(cb = op_alloc(ObDDLMacroBlockClogCb))) {
ret = OB_ALLOCATE_MEMORY_FAILED;
LOG_WARN("fail to alloc memory", K(ret));
} else if (OB_FAIL(cb->init(ls_id, log.get_redo_info(), macro_block_id, ddl_kv_mgr_handle))) {
LOG_WARN("init ddl clog callback failed", K(ret));
} else if (OB_FAIL(base_header.serialize(buffer, buffer_size, pos))) {
LOG_WARN("failed to serialize log base header", K(ret));
} else if (OB_FAIL(ddl_header.serialize(buffer, buffer_size, pos))) {
LOG_WARN("fail to seriaize ddl redo log", K(ret));
} else if (FALSE_IT(log_start_pos = pos)) {
} else if (OB_FAIL(log.serialize(buffer, buffer_size, pos))) {
LOG_WARN("fail to seriaize ddl redo log", K(ret));
} else if (OB_FAIL(tmp_log.deserialize(buffer, buffer_size, log_start_pos))) {
LOG_WARN("fail to deserialize ddl redo log", K(ret));
/* use the ObString data_buffer_ in tmp_log.redo_info_, do not rely on the macro_block_buf in original log*/
} else if (OB_FAIL(cb->init(ls_id, tmp_log.get_redo_info(), macro_block_id, ddl_kv_mgr_handle))) {
LOG_WARN("init ddl clog callback failed", K(ret));
} else if (OB_FAIL(log_handler->append(buffer,
buffer_size,
base_scn,
@ -1385,6 +1391,7 @@ ObDDLRedoLogWriterCallback::ObDDLRedoLogWriterCallback()
ObDDLRedoLogWriterCallback::~ObDDLRedoLogWriterCallback()
{
(void)wait();
if (nullptr != block_buffer_) {
ob_free(block_buffer_);
block_buffer_ = nullptr;