fix ddl macro block handle reset without wait apply finished.

This commit is contained in:
obdev
2023-09-08 11:48:56 +08:00
committed by ob-robot
parent 7085d97454
commit 7ae7b9560f
3 changed files with 18 additions and 2 deletions

View File

@ -143,6 +143,15 @@ ObDDLMacroBlockClogCb::ObDDLMacroBlockClogCb()
}
ObDDLMacroBlockClogCb::~ObDDLMacroBlockClogCb()
{
int ret = OB_SUCCESS;
if (macro_block_id_.is_valid() && OB_FAIL(OB_SERVER_BLOCK_MGR.dec_ref(macro_block_id_))) {
LOG_ERROR("dec ref failed", K(ret), K(macro_block_id_), K(common::lbt()));
}
macro_block_id_.reset();
}
int ObDDLMacroBlockClogCb::init(const share::ObLSID &ls_id,
const blocksstable::ObDDLMacroBlockRedoInfo &redo_info,
const blocksstable::MacroBlockId &macro_block_id,
@ -156,6 +165,8 @@ 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() || !tablet_handle.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 if (OB_FAIL(OB_SERVER_BLOCK_MGR.inc_ref(macro_block_id))) {
LOG_WARN("inc reference count failed", K(ret), K(macro_block_id));
} 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_;

View File

@ -103,7 +103,7 @@ class ObDDLMacroBlockClogCb : public logservice::AppendCb
{
public:
ObDDLMacroBlockClogCb();
virtual ~ObDDLMacroBlockClogCb() = default;
virtual ~ObDDLMacroBlockClogCb();
int init(const share::ObLSID &ls_id,
const blocksstable::ObDDLMacroBlockRedoInfo &redo_info,
const blocksstable::MacroBlockId &macro_block_id,

View File

@ -160,9 +160,14 @@ private:
const blocksstable::ObColDescIArray *col_descs_;
int64_t snapshot_version_;
ObDDLSSTableRedoWriter sstable_redo_writer_;
ObDDLRedoLogWriterCallback redo_log_writer_callback_;
blocksstable::ObDataStoreDesc data_desc_;
/**
* ATTENTION!
* The deconstruction order of the `redo_log_writer_callback_` should be in front of the `macro_block_writer_`
* to ensure the safety-used of the ddl macro block.
*/
blocksstable::ObMacroBlockWriter macro_block_writer_;
ObDDLRedoLogWriterCallback redo_log_writer_callback_;
common::ObArenaAllocator allocator_;
common::ObArenaAllocator lob_allocator_;
int64_t lob_cnt_;