unregister ddl kv mgr in clog callback
This commit is contained in:
parent
bb66f574c7
commit
f09ac680ce
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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:
|
||||
|
@ -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));
|
||||
|
@ -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();
|
||||
|
@ -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;
|
||||
|
@ -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_));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user