the callback of ddl commit log set commit scn of both data and lob tablet direct load mgr

This commit is contained in:
simonjoylet
2024-02-26 06:46:21 +00:00
committed by ob-robot
parent c24ac7568b
commit 5b58b058cf
5 changed files with 41 additions and 14 deletions

View File

@ -263,7 +263,7 @@ int ObDDLMacroBlockClogCb::on_failure()
} }
ObDDLCommitClogCb::ObDDLCommitClogCb() ObDDLCommitClogCb::ObDDLCommitClogCb()
: is_inited_(false), status_(), ls_id_(), tablet_id_(), start_scn_(SCN::min_scn()), lock_tid_(0), direct_load_mgr_handle_() : is_inited_(false), status_(), ls_id_(), tablet_id_(), start_scn_(SCN::min_scn()), lock_tid_(0), direct_load_mgr_handle_(), lob_direct_load_mgr_handle_()
{ {
} }
@ -272,18 +272,21 @@ int ObDDLCommitClogCb::init(const share::ObLSID &ls_id,
const common::ObTabletID &tablet_id, const common::ObTabletID &tablet_id,
const share::SCN &start_scn, const share::SCN &start_scn,
const uint32_t lock_tid, const uint32_t lock_tid,
ObTabletDirectLoadMgrHandle &direct_load_mgr_handle) ObTabletDirectLoadMgrHandle &direct_load_mgr_handle,
ObTabletDirectLoadMgrHandle &lob_direct_load_mgr_handle)
{ {
int ret = OB_SUCCESS; int ret = OB_SUCCESS;
if (OB_UNLIKELY(is_inited_)) { if (OB_UNLIKELY(is_inited_)) {
ret = OB_INIT_TWICE; ret = OB_INIT_TWICE;
LOG_WARN("init twice", K(ret)); LOG_WARN("init twice", K(ret));
} else if (OB_FAIL(direct_load_mgr_handle_.assign(direct_load_mgr_handle))) {
LOG_WARN("assign handle failed", K(ret));
} else if (OB_UNLIKELY(!ls_id.is_valid() || !tablet_id.is_valid() || !start_scn.is_valid_and_not_min() } else if (OB_UNLIKELY(!ls_id.is_valid() || !tablet_id.is_valid() || !start_scn.is_valid_and_not_min()
|| 0 == lock_tid)) { || 0 == lock_tid)) {
ret = OB_INVALID_ARGUMENT; ret = OB_INVALID_ARGUMENT;
LOG_WARN("invalid argument", K(ret), K(ls_id), K(tablet_id), K(start_scn), K(lock_tid)); LOG_WARN("invalid argument", K(ret), K(ls_id), K(tablet_id), K(start_scn), K(lock_tid));
} else if (OB_FAIL(direct_load_mgr_handle_.assign(direct_load_mgr_handle))) {
LOG_WARN("assign handle failed", K(ret));
} else if (OB_FAIL(lob_direct_load_mgr_handle_.assign(lob_direct_load_mgr_handle))) {
LOG_WARN("assign handle failed", K(ret));
} else { } else {
ls_id_ = ls_id; ls_id_ = ls_id;
tablet_id_ = tablet_id; tablet_id_ = tablet_id;
@ -306,7 +309,11 @@ int ObDDLCommitClogCb::on_success()
ret = OB_ERR_UNEXPECTED; ret = OB_ERR_UNEXPECTED;
LOG_WARN("unexpected error", K(ret), K(tablet_id_)); LOG_WARN("unexpected error", K(ret), K(tablet_id_));
} else { } else {
data_direct_load_mgr->set_commit_scn_nolock(__get_scn()); const SCN commit_scn = __get_scn();
data_direct_load_mgr->set_commit_scn_nolock(commit_scn);
if (lob_direct_load_mgr_handle_.is_valid()) {
lob_direct_load_mgr_handle_.get_full_obj()->set_commit_scn_nolock(commit_scn);
}
data_direct_load_mgr->unlock(lock_tid_); data_direct_load_mgr->unlock(lock_tid_);
} }
status_.set_ret_code(ret); status_.set_ret_code(ret);

View File

@ -144,7 +144,8 @@ public:
const common::ObTabletID &tablet_id, const common::ObTabletID &tablet_id,
const share::SCN &start_scn, const share::SCN &start_scn,
const uint32_t lock_tid, const uint32_t lock_tid,
ObTabletDirectLoadMgrHandle &direct_load_mgr_handle); ObTabletDirectLoadMgrHandle &direct_load_mgr_handle,
ObTabletDirectLoadMgrHandle &lob_direct_load_mgr_handle);
virtual int on_success() override; virtual int on_success() override;
virtual int on_failure() override; virtual int on_failure() override;
inline bool is_success() const { return status_.is_success(); } inline bool is_success() const { return status_.is_success(); }
@ -161,6 +162,7 @@ private:
share::SCN start_scn_; share::SCN start_scn_;
uint32_t lock_tid_; uint32_t lock_tid_;
ObTabletDirectLoadMgrHandle direct_load_mgr_handle_; ObTabletDirectLoadMgrHandle direct_load_mgr_handle_;
ObTabletDirectLoadMgrHandle lob_direct_load_mgr_handle_;
}; };
class ObDDLClogHeader final class ObDDLClogHeader final

View File

@ -863,6 +863,7 @@ int ObDDLRedoLogWriter::local_write_ddl_commit_log(
const share::ObLSID &ls_id, const share::ObLSID &ls_id,
ObLogHandler *log_handler, ObLogHandler *log_handler,
ObTabletDirectLoadMgrHandle &direct_load_mgr_handle, ObTabletDirectLoadMgrHandle &direct_load_mgr_handle,
ObTabletDirectLoadMgrHandle &lob_direct_load_mgr_handle,
ObDDLCommitLogHandle &handle, ObDDLCommitLogHandle &handle,
uint32_t &lock_tid) uint32_t &lock_tid)
{ {
@ -890,7 +891,7 @@ if (OB_ISNULL(buffer = static_cast<char *>(ob_malloc(buffer_size, ObMemAttr(MTL_
} else if (OB_ISNULL(cb = op_alloc(ObDDLCommitClogCb))) { } else if (OB_ISNULL(cb = op_alloc(ObDDLCommitClogCb))) {
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(cb->init(ls_id, log.get_table_key().tablet_id_, log.get_start_scn(), lock_tid, direct_load_mgr_handle))) { } else if (OB_FAIL(cb->init(ls_id, log.get_table_key().tablet_id_, log.get_start_scn(), lock_tid, direct_load_mgr_handle, lob_direct_load_mgr_handle))) {
LOG_WARN("init ddl commit log callback failed", K(ret), K(ls_id), K(log)); LOG_WARN("init ddl commit log callback failed", K(ret), K(ls_id), K(log));
} else if (OB_FAIL(base_header.serialize(buffer, buffer_size, pos))) { } else if (OB_FAIL(base_header.serialize(buffer, buffer_size, pos))) {
LOG_WARN("failed to serialize log base header", K(ret)); LOG_WARN("failed to serialize log base header", K(ret));
@ -1301,8 +1302,25 @@ int ObDDLRedoLogWriter::write_commit_log(
commit_scn = direct_load_mgr_handle.get_obj()->get_commit_scn(tablet_handle.get_obj()->get_tablet_meta()); commit_scn = direct_load_mgr_handle.get_obj()->get_commit_scn(tablet_handle.get_obj()->get_tablet_meta());
LOG_WARN("already committed", K(ret), K(start_scn), K(commit_scn), K(direct_load_mgr_handle.get_obj()->get_start_scn()), K(log)); LOG_WARN("already committed", K(ret), K(start_scn), K(commit_scn), K(direct_load_mgr_handle.get_obj()->get_start_scn()), K(log));
} else if (!remote_write_) { } else if (!remote_write_) {
if (OB_FAIL(local_write_ddl_commit_log( ObTabletBindingMdsUserData ddl_data;
log, ObDDLClogType::DDL_COMMIT_LOG, ls_id_, ls->get_log_handler(), direct_load_mgr_handle, handle, lock_tid))) { ObTabletDirectLoadMgrHandle lob_direct_load_mgr_handle;
if (OB_FAIL(tablet_handle.get_obj()->ObITabletMdsInterface::get_ddl_data(share::SCN::max_scn(), ddl_data))) {
LOG_WARN("failed to get ddl data from tablet", K(ret), K(tablet_handle));
} else if (ddl_data.lob_meta_tablet_id_.is_valid()) {
bool is_lob_major_sstable_exist = false;
if (OB_FAIL(MTL(ObTenantDirectLoadMgr *)->get_tablet_mgr_and_check_major(ls_id_, ddl_data.lob_meta_tablet_id_,
true/* is_full_direct_load */, lob_direct_load_mgr_handle, is_lob_major_sstable_exist))) {
if (OB_ENTRY_NOT_EXIST == ret && is_lob_major_sstable_exist) {
ret = OB_SUCCESS;
LOG_INFO("lob meta tablet exist major sstable, skip", K(ret), K(ddl_data.lob_meta_tablet_id_));
} else {
LOG_WARN("get tablet mgr failed", K(ret), K(ddl_data.lob_meta_tablet_id_));
}
}
}
if (OB_FAIL(ret)) {
} else if (OB_FAIL(local_write_ddl_commit_log(
log, ObDDLClogType::DDL_COMMIT_LOG, ls_id_, ls->get_log_handler(), direct_load_mgr_handle, lob_direct_load_mgr_handle, handle, lock_tid))) {
if (ObDDLUtil::need_remote_write(ret) && allow_remote_write) { if (ObDDLUtil::need_remote_write(ret) && allow_remote_write) {
if (OB_FAIL(switch_to_remote_write())) { if (OB_FAIL(switch_to_remote_write())) {
LOG_WARN("fail to switch to remote write", K(ret), K(table_key)); LOG_WARN("fail to switch to remote write", K(ret), K(table_key));

View File

@ -302,6 +302,7 @@ private:
const share::ObLSID &ls_id, const share::ObLSID &ls_id,
logservice::ObLogHandler *log_handler, logservice::ObLogHandler *log_handler,
ObTabletDirectLoadMgrHandle &direct_load_mgr_handle, ObTabletDirectLoadMgrHandle &direct_load_mgr_handle,
ObTabletDirectLoadMgrHandle &lob_direct_load_mgr_handle,
ObDDLCommitLogHandle &handle, ObDDLCommitLogHandle &handle,
uint32_t &lock_tid); uint32_t &lock_tid);
int remote_write_ddl_commit_redo( int remote_write_ddl_commit_redo(

View File

@ -315,11 +315,10 @@ int ObTabletDirectLoadMgrHandle::assign(const ObTabletDirectLoadMgrHandle &other
{ {
int ret = OB_SUCCESS; int ret = OB_SUCCESS;
reset(); reset();
if (OB_UNLIKELY(!other.is_valid())) { if (OB_LIKELY(other.is_valid())) {
ret = OB_INVALID_ARGUMENT; if (OB_FAIL(set_obj(other.tablet_mgr_))) {
LOG_WARN("invalid arguments", K(ret), K(other));
} else if (OB_FAIL(set_obj(other.tablet_mgr_))) {
LOG_WARN("set obj failed", K(ret)); LOG_WARN("set obj failed", K(ret));
} }
}
return ret; return ret;
} }