unregister ddl kv mgr in clog callback

This commit is contained in:
simonjoylet 2022-11-29 17:05:41 +00:00 committed by ob-robot
parent bb66f574c7
commit f09ac680ce
8 changed files with 118 additions and 16 deletions

View File

@ -1246,8 +1246,6 @@ int ObComplementMergeTask::add_build_hidden_table_sstable()
} else if (OB_FAIL(context_->data_sstable_redo_writer_.write_commit_log(hidden_table_key,
prepare_scn))) {
LOG_WARN("fail write ddl commit log", K(ret), K(hidden_table_key));
} else if (OB_FAIL(ddl_kv_mgr_handle.get_obj()->unregister_from_tablet(ddl_start_scn, ddl_kv_mgr_handle))) {
LOG_WARN("ddl kv mgr unregister failed", K(ret), KPC(param_));
}
}
return ret;

View File

@ -17,6 +17,7 @@
#include "storage/tx_storage/ob_ls_handle.h"
#include "storage/meta_mem/ob_tablet_handle.h"
#include "storage/tx_storage/ob_ls_service.h"
#include "storage/ddl/ob_tablet_ddl_kv_mgr.h"
namespace oceanbase
{
@ -153,6 +154,74 @@ int ObDDLMacroBlockClogCb::on_failure()
return OB_SUCCESS;
}
ObDDLCommitClogCb::ObDDLCommitClogCb()
: is_inited_(false), status_(), ls_id_(), tablet_id_(), start_scn_(SCN::min_scn())
{
}
int ObDDLCommitClogCb::init(const share::ObLSID &ls_id,
const common::ObTabletID &tablet_id,
const share::SCN &start_scn)
{
int ret = OB_SUCCESS;
if (OB_UNLIKELY(is_inited_)) {
ret = OB_INIT_TWICE;
LOG_WARN("init twice", K(ret));
} else if (OB_UNLIKELY(!ls_id.is_valid() || !tablet_id.is_valid() || !start_scn.is_valid_and_not_min())) {
ret = OB_INVALID_ARGUMENT;
LOG_WARN("invalid argument", K(ret), K(ls_id), K(tablet_id), K(start_scn));
} else {
ls_id_ = ls_id;
tablet_id_ = tablet_id;
start_scn_ = start_scn;
is_inited_ = true;
}
return ret;
}
int ObDDLCommitClogCb::on_success()
{
int ret = OB_SUCCESS;
ObLSHandle ls_handle;
ObTabletHandle tablet_handle;
ObDDLKvMgrHandle ddl_kv_mgr_handle;
if (!is_inited_) {
// ddl prepare will not init this cb, so do nothing
} else if (OB_FAIL(MTL(ObLSService *)->get_ls(ls_id_, ls_handle, ObLSGetMod::DDL_MOD))) {
LOG_WARN("failed to get log stream", K(ret), K(ls_id_));
} else if (OB_FAIL(ObDDLUtil::ddl_get_tablet(ls_handle,
tablet_id_,
tablet_handle,
ObTabletCommon::NO_CHECK_GET_TABLET_TIMEOUT_US))) {
LOG_WARN("get tablet handle failed", K(ret), K(ls_id_), K(tablet_id_));
} else if (OB_FAIL(tablet_handle.get_obj()->get_ddl_kv_mgr(ddl_kv_mgr_handle))) {
LOG_WARN("get ddl kv manager failed", K(ret), K(ls_id_), K(tablet_id_));
} else if (OB_FAIL(ddl_kv_mgr_handle.get_obj()->unregister_from_tablet(start_scn_, ddl_kv_mgr_handle))) {
LOG_WARN("unregister ddl kv manager from tablet failed", K(ret), K(ls_id_), K(tablet_id_));
}
status_.set_ret_code(ret);
status_.set_state(STATE_SUCCESS);
try_release();
return OB_SUCCESS; // force return success
}
int ObDDLCommitClogCb::on_failure()
{
status_.set_state(STATE_FAILED);
try_release();
return OB_SUCCESS;
}
void ObDDLCommitClogCb::try_release()
{
if (status_.try_set_release_flag()) {
} else {
op_free(this);
}
}
DEFINE_SERIALIZE(ObDDLClogHeader)
{
int ret = OB_SUCCESS;

View File

@ -52,6 +52,7 @@ public:
bool try_set_release_flag();
void set_ret_code(const int ret_code) { ret_code_ = ret_code; }
int get_ret_code() const { return ret_code_; }
TO_STRING_KV(K(the_other_release_this_), K(state_), K(ret_code_));
private:
bool the_other_release_this_;
ObDDLClogState state_;
@ -99,6 +100,30 @@ private:
bool is_data_buffer_freed_;
};
class ObDDLCommitClogCb : public logservice::AppendCb
{
public:
ObDDLCommitClogCb();
virtual ~ObDDLCommitClogCb() = default;
int init(const share::ObLSID &ls_id,
const common::ObTabletID &tablet_id,
const share::SCN &start_scn);
virtual int on_success() override;
virtual int on_failure() override;
inline bool is_success() const { return status_.is_success(); }
inline bool is_failed() const { return status_.is_failed(); }
inline bool is_finished() const { return status_.is_finished(); }
int get_ret_code() const { return status_.get_ret_code(); }
void try_release();
TO_STRING_KV(K(is_inited_), K(status_), K(ls_id_), K(tablet_id_), K(start_scn_));
private:
bool is_inited_;
ObDDLClogCbStatus status_;
share::ObLSID ls_id_;
common::ObTabletID tablet_id_;
share::SCN start_scn_;
};
class ObDDLClogHeader final
{
public:

View File

@ -705,7 +705,11 @@ int ObDDLRedoLogWriter::write_ddl_start_log(ObDDLKvMgrHandle &ddl_kv_mgr_handle,
}
template <typename T>
int ObDDLRedoLogWriter::write_ddl_finish_log(const T &log, const ObDDLClogType clog_type, ObLogHandler *log_handler, ObDDLCommitLogHandle &handle)
int ObDDLRedoLogWriter::write_ddl_finish_log(const T &log,
const ObDDLClogType clog_type,
const share::ObLSID &ls_id,
ObLogHandler *log_handler,
ObDDLCommitLogHandle &handle)
{
int ret = OB_SUCCESS;
const enum ObReplayBarrierType replay_barrier_type = ObReplayBarrierType::PRE_BARRIER;
@ -718,7 +722,7 @@ int ObDDLRedoLogWriter::write_ddl_finish_log(const T &log, const ObDDLClogType c
+ ddl_header.get_serialize_size()
+ log.get_serialize_size();
int64_t pos = 0;
ObDDLClogCb *cb = nullptr;
ObDDLCommitClogCb *cb = nullptr;
palf::LSN lsn;
const bool need_nonblock= false;
@ -728,9 +732,12 @@ int ObDDLRedoLogWriter::write_ddl_finish_log(const T &log, const ObDDLClogType c
if (OB_ISNULL(buffer = static_cast<char *>(ob_malloc(buffer_size)))) {
ret = OB_ALLOCATE_MEMORY_FAILED;
LOG_WARN("fail to alloc memory", K(ret));
} else if (OB_ISNULL(cb = op_alloc(ObDDLClogCb))) {
} else if (OB_ISNULL(cb = op_alloc(ObDDLCommitClogCb))) {
ret = OB_ALLOCATE_MEMORY_FAILED;
LOG_WARN("fail to alloc memory", K(ret));
} else if (ObDDLClogType::DDL_COMMIT_LOG == clog_type &&
OB_FAIL(cb->init(ls_id, log.get_table_key().tablet_id_, log.get_start_scn()))) {
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))) {
LOG_WARN("failed to serialize log base header", K(ret));
} else if (OB_FAIL(ddl_header.serialize(buffer, buffer_size, pos))) {
@ -748,7 +755,7 @@ int ObDDLRedoLogWriter::write_ddl_finish_log(const T &log, const ObDDLClogType c
scn))) {
LOG_WARN("fail to submit ddl commit log", K(ret), K(buffer), K(buffer_size));
} else {
ObDDLClogCb *tmp_cb = cb;
ObDDLCommitClogCb *tmp_cb = cb;
cb = nullptr;
bool need_retry = true;
while (need_retry) {
@ -848,6 +855,10 @@ int ObDDLCommitLogHandle::wait(const int64_t timeout)
while (OB_SUCC(ret) && !finish) {
if (cb_->is_success()) {
finish = true;
ret = cb_->get_ret_code();
if (OB_FAIL(ret)) {
LOG_WARN("ddl commit log callback execute failed", K(ret), KPC(cb_));
}
} else if (cb_->is_failed()) {
ret = OB_NOT_MASTER;
}
@ -1078,7 +1089,7 @@ int ObDDLSSTableRedoWriter::write_prepare_log(const ObITable::TableKey &table_ke
ret = OB_ERR_UNEXPECTED;
LOG_ERROR("ls should not be null", K(ret), K(table_key));
} else if (!remote_write_) {
if (OB_FAIL(ObDDLRedoLogWriter::get_instance().write_ddl_finish_log(log, ObDDLClogType::DDL_PREPARE_LOG, ls->get_log_handler(), handle))) {
if (OB_FAIL(ObDDLRedoLogWriter::get_instance().write_ddl_finish_log(log, ObDDLClogType::DDL_PREPARE_LOG, ls_id_, ls->get_log_handler(), handle))) {
if (ObDDLUtil::need_remote_write(ret)) {
if (OB_FAIL(switch_to_remote_write())) {
LOG_WARN("fail to switch to remote write", K(ret), K(table_key));
@ -1132,7 +1143,7 @@ int ObDDLSSTableRedoWriter::write_commit_log(const ObITable::TableKey &table_key
ret = OB_ERR_UNEXPECTED;
LOG_ERROR("ls should not be null", K(ret), K(table_key));
} else if (!remote_write_) {
if (OB_FAIL(ObDDLRedoLogWriter::get_instance().write_ddl_finish_log(log, ObDDLClogType::DDL_COMMIT_LOG, ls->get_log_handler(), handle))) {
if (OB_FAIL(ObDDLRedoLogWriter::get_instance().write_ddl_finish_log(log, ObDDLClogType::DDL_COMMIT_LOG, ls_id_, ls->get_log_handler(), handle))) {
if (ObDDLUtil::need_remote_write(ret)) {
if (OB_FAIL(switch_to_remote_write())) {
LOG_WARN("fail to switch to remote write", K(ret), K(table_key));

View File

@ -178,7 +178,7 @@ public:
void reset();
share::SCN get_commit_scn() const { return commit_scn_; }
public:
ObDDLClogCb *cb_;
ObDDLCommitClogCb *cb_;
share::SCN commit_scn_;
};
@ -200,9 +200,10 @@ public:
share::SCN &start_scn);
template <typename T>
int write_ddl_finish_log(const T &log,
const ObDDLClogType clog_type,
logservice::ObLogHandler *log_handler,
ObDDLCommitLogHandle &handle);
const ObDDLClogType clog_type,
const share::ObLSID &ls_id,
logservice::ObLogHandler *log_handler,
ObDDLCommitLogHandle &handle);
private:
ObDDLRedoLogWriter();
~ObDDLRedoLogWriter();

View File

@ -718,8 +718,6 @@ int ObSSTableInsertTabletContext::create_sstable_with_clog(
} else if (OB_FAIL(data_sstable_redo_writer_.write_commit_log(table_key,
prepare_scn))) {
LOG_WARN("fail write ddl commit log", K(ret), K(table_key));
} else if (OB_FAIL(ddl_kv_mgr_handle.get_obj()->unregister_from_tablet(ddl_start_scn, ddl_kv_mgr_handle))) {
LOG_WARN("ddl kv mgr unregister failed", K(ret), K(build_param_));
}
}
return ret;

View File

@ -454,7 +454,7 @@ int ObTabletDDLKvMgr::unregister_from_tablet(const SCN &ddl_start_scn, ObDDLKvMg
LOG_WARN("ddl kv mgr register before start", K(ret), K(ls_id_), K(tablet_id_), K(start_scn_), K(ddl_start_scn));
} else {
if (OB_FAIL(tablet_handle.get_obj()->remove_ddl_kv_mgr(kv_mgr_handle))) {
LOG_WARN("set ddl kv mgr into tablet failed", K(ret), K(ls_id_), K(tablet_id_), K(start_scn_));
LOG_WARN("remove ddl kv mgr from tablet failed", K(ret), K(ls_id_), K(tablet_id_), K(start_scn_));
}
}
}

View File

@ -267,7 +267,7 @@ int ObTabletPointer::remove_ddl_kv_mgr(const ObDDLKvMgrHandle &ddl_kv_mgr_handle
LOG_WARN("invalid argument", K(ret), K(ddl_kv_mgr_handle));
} else if (ddl_kv_mgr_handle_.get_obj() != ddl_kv_mgr_handle.get_obj()) {
ret = OB_ITEM_NOT_MATCH;
LOG_WARN("ddl kv mgr changed", K(ret));
LOG_WARN("ddl kv mgr changed", K(ret), KP(ddl_kv_mgr_handle_.get_obj()), KPC(ddl_kv_mgr_handle.get_obj()));
} else {
ddl_kv_mgr_handle_.reset();
}