diff --git a/src/observer/ob_rpc_processor_simple.cpp b/src/observer/ob_rpc_processor_simple.cpp index 236aaca45..fa4dcd305 100644 --- a/src/observer/ob_rpc_processor_simple.cpp +++ b/src/observer/ob_rpc_processor_simple.cpp @@ -1637,6 +1637,9 @@ int ObRpcChangeLSAccessModeP::process() uint64_t tenant_id = arg_.get_tenant_id(); MAKE_TENANT_SWITCH_SCOPE_GUARD(guard); ObLSService *ls_svr = nullptr; + int64_t wait_sync_scn_cost = 0; + int64_t change_access_mode_cost = 0; + int64_t begin_time = ObTimeUtility::current_time(); if (tenant_id != MTL_ID()) { ret = guard.switch_to(tenant_id); } @@ -1668,7 +1671,9 @@ int ObRpcChangeLSAccessModeP::process() *ls))) { LOG_WARN("fail to wait user ls sync scn locally", KR(ret), K(ls_id), K(arg_.get_sys_ls_end_scn())); } + wait_sync_scn_cost = ObTimeUtility::current_time() - begin_time; } + begin_time = ObTimeUtility::current_time(); const int64_t timeout = THIS_WORKER.get_timeout_remain(); if (FAILEDx(log_handler->change_access_mode( arg_.get_mode_version(), @@ -1676,10 +1681,11 @@ int ObRpcChangeLSAccessModeP::process() arg_.get_ref_scn()))) { LOG_WARN("failed to change access mode", KR(ret), K(arg_), K(timeout)); } + change_access_mode_cost = ObTimeUtility::current_time() - begin_time; int tmp_ret = OB_SUCCESS; - if (OB_SUCCESS != (tmp_ret = result_.init(tenant_id, ls_id, ret))) { + if (OB_SUCCESS != (tmp_ret = result_.init(tenant_id, ls_id, ret, wait_sync_scn_cost, change_access_mode_cost))) { ret = OB_SUCC(ret) ? tmp_ret : ret; - LOG_WARN("failed to init res", KR(ret), K(tenant_id), K(ls_id), KR(tmp_ret)); + LOG_WARN("failed to init res", KR(ret), K(tenant_id), K(ls_id), KR(tmp_ret), K(wait_sync_scn_cost), K(change_access_mode_cost)); } else { //if ret not OB_SUCCESS, res can not return ret = OB_SUCCESS; diff --git a/src/share/ob_rpc_struct.cpp b/src/share/ob_rpc_struct.cpp index 1802803f0..83de30a81 100755 --- a/src/share/ob_rpc_struct.cpp +++ b/src/share/ob_rpc_struct.cpp @@ -7677,22 +7677,25 @@ OB_SERIALIZE_MEMBER(ObLSAccessModeInfo, tenant_id_, ls_id_, mode_version_, acces bool ObChangeLSAccessModeRes::is_valid() const { - return OB_INVALID_TENANT_ID != tenant_id_ - && ls_id_.is_valid(); + return OB_INVALID_TENANT_ID != tenant_id_ && ls_id_.is_valid() && wait_sync_scn_cost_ >= 0 && change_access_mode_cost_ >= 0; } int ObChangeLSAccessModeRes::init( uint64_t tenant_id, const ObLSID &ls_id, - int result) + const int result, const int64_t wait_sync_scn_cost, const int64_t change_access_mode_cost) { int ret = OB_SUCCESS; if (OB_UNLIKELY(OB_INVALID_TENANT_ID == tenant_id - || !ls_id.is_valid())) { + || !ls_id.is_valid() + || wait_sync_scn_cost < 0 + || change_access_mode_cost < 0)) { ret = OB_INVALID_ARGUMENT; - LOG_WARN("invalid argument", KR(ret), K(tenant_id), K(ls_id)); + LOG_WARN("invalid argument", KR(ret), K(tenant_id), K(ls_id), K(wait_sync_scn_cost), K(change_access_mode_cost)); } else { tenant_id_ = tenant_id; ls_id_ = ls_id; ret_ = result; + wait_sync_scn_cost_ = wait_sync_scn_cost; + change_access_mode_cost_ = change_access_mode_cost; } return ret; } @@ -7703,12 +7706,14 @@ int ObChangeLSAccessModeRes::assign(const ObChangeLSAccessModeRes &other) if (this != &other) { tenant_id_ = other.tenant_id_; ls_id_ = other.ls_id_; - ret = other.ret_; + ret_ = other.ret_; + wait_sync_scn_cost_ = other.wait_sync_scn_cost_; + change_access_mode_cost_ = other.change_access_mode_cost_; } return ret; } -OB_SERIALIZE_MEMBER(ObChangeLSAccessModeRes, tenant_id_, ls_id_, ret_); +OB_SERIALIZE_MEMBER(ObChangeLSAccessModeRes, tenant_id_, ls_id_, ret_, wait_sync_scn_cost_, change_access_mode_cost_); int ObNotifySwitchLeaderArg::init(const uint64_t tenant_id, const share::ObLSID &ls_id, const common::ObAddr &leader, const SwitchLeaderComment &comment) diff --git a/src/share/ob_rpc_struct.h b/src/share/ob_rpc_struct.h index f93bb75ca..6dd6fa95e 100755 --- a/src/share/ob_rpc_struct.h +++ b/src/share/ob_rpc_struct.h @@ -3311,12 +3311,12 @@ struct ObChangeLSAccessModeRes OB_UNIS_VERSION(1); public: ObChangeLSAccessModeRes(): tenant_id_(OB_INVALID_TENANT_ID), - ls_id_(), ret_(common::OB_SUCCESS) {} + ls_id_(), ret_(common::OB_SUCCESS), wait_sync_scn_cost_(0), change_access_mode_cost_(0) {} ~ObChangeLSAccessModeRes() {} bool is_valid() const; - int init(uint64_t tenant_id, const share::ObLSID& ls_id, int ret); + int init(uint64_t tenant_id, const share::ObLSID& ls_id, const int result, const int64_t wait_sync_scn_cost, const int64_t change_access_mode_cost); int assign(const ObChangeLSAccessModeRes &other); - TO_STRING_KV(K_(tenant_id), K_(ls_id), K_(ret)); + TO_STRING_KV(K_(tenant_id), "ls_id", ls_id_.id(), K_(ret), K_(wait_sync_scn_cost), K_(change_access_mode_cost)); int get_result() const { return ret_; @@ -3329,12 +3329,16 @@ public: { return ls_id_; } + int64_t get_wait_sync_scn_cost() const { return wait_sync_scn_cost_; } + int64_t get_change_access_mode_cost() const { return change_access_mode_cost_; } private: DISALLOW_COPY_AND_ASSIGN(ObChangeLSAccessModeRes); private: uint64_t tenant_id_; share::ObLSID ls_id_; int ret_; + int64_t wait_sync_scn_cost_; + int64_t change_access_mode_cost_; }; struct ObNotifySwitchLeaderArg