[DeadLock] fix core-risk when 4013

This commit is contained in:
fengdeyiji
2023-09-12 12:14:02 +00:00
committed by ob-robot
parent 1225cc3815
commit 7b972979cf
6 changed files with 99 additions and 35 deletions

View File

@ -396,6 +396,29 @@ int ObDetectorUserReportInfo::set_columns_(const int64_t idx,
#undef PRINT_WRAPPER
}
int ObDetectorUserReportInfo::assign(const ObDetectorUserReportInfo &rhs)
{
int ret = OB_SUCCESS;
if (OB_FAIL(extra_columns_names_.assign(rhs.extra_columns_names_))) {
DETECT_LOG(WARN, "fail to copy array", K(rhs));
} else if (OB_FAIL(extra_columns_values_.assign(rhs.extra_columns_values_))) {
DETECT_LOG(WARN, "fail to copy array", K(rhs));
} else if (OB_FAIL(extra_columns_names_guard_.assign(rhs.extra_columns_names_guard_))) {
DETECT_LOG(WARN, "fail to copy array", K(rhs));
} else if (OB_FAIL(extra_columns_values_guard_.assign(rhs.extra_columns_values_guard_))) {
DETECT_LOG(WARN, "fail to copy array", K(rhs));
} else {
module_name_ = rhs.module_name_;
resource_visitor_ = rhs.required_resource_;
required_resource_ = rhs.required_resource_;
valid_extra_column_size_ = rhs.valid_extra_column_size_;
module_name_guard_ = rhs.module_name_guard_;
resource_visitor_guard_ = rhs.resource_visitor_guard_;
required_resource_guard_ = rhs.required_resource_guard_;
}
return ret;
}
ObDetectorInnerReportInfo::ObDetectorInnerReportInfo() :
tenant_id_(INVALID_VALUE),
detector_id_(INVALID_VALUE),
@ -417,20 +440,21 @@ int ObDetectorInnerReportInfo::set_args(const UserBinaryKey &binary_key,
const ObDetectorUserReportInfo &user_report_info)
{
int ret = OB_SUCCESS;
binary_key_ = binary_key;
tenant_id_ = MTL_ID();
addr_ = addr;
detector_id_ = detector_id;
report_time_ = report_time;
created_time_ = created_time;
event_id_ = event_id;
if (OB_FAIL(check_and_assign_ptr_(role, 0, "ObDetectorInnerReportInfo::set_args", &role_))) {
DETECT_LOG(ERROR, "assign event field failed");
} else if (OB_FAIL(user_report_info_.assign(user_report_info))) {
DETECT_LOG(WARN, "assign user_report_info field failed");
} else {
start_delay_ = start_delay;
priority_ = priority;
binary_key_ = binary_key;
tenant_id_ = MTL_ID();
addr_ = addr;
detector_id_ = detector_id;
report_time_ = report_time;
created_time_ = created_time;
event_id_ = event_id;
}
start_delay_ = start_delay;
priority_ = priority;
user_report_info_ = user_report_info;
return ret;
}
@ -504,6 +528,26 @@ const ObDetectorUserReportInfo &ObDetectorInnerReportInfo::get_user_report_info(
return user_report_info_;
}
int ObDetectorInnerReportInfo::assign(const ObDetectorInnerReportInfo &rhs)
{
int ret = OB_SUCCESS;
if (OB_FAIL(user_report_info_.assign(rhs.user_report_info_))) {
DETECT_LOG(WARN, "fail to assign user report info", K(rhs));
} else {
binary_key_ = rhs.binary_key_;
tenant_id_ = rhs.tenant_id_;
addr_ = rhs.addr_;
detector_id_ = rhs.detector_id_;
report_time_ = rhs.report_time_;
created_time_ = rhs.created_time_;
event_id_ = rhs.event_id_;
role_ = rhs.role_;
start_delay_ = rhs.start_delay_;
priority_ = rhs.priority_;
}
return ret;
}
}// namespace detector
}// namespace share
}// namespace oceanbase

View File

@ -108,6 +108,8 @@ class ObDetectorUserReportInfo
OB_UNIS_VERSION(1);
public:
ObDetectorUserReportInfo();
ObDetectorUserReportInfo &operator=(const ObDetectorUserReportInfo &) = delete;
int assign(const ObDetectorUserReportInfo &rhs);
bool is_valid() const;
int set_module_name(const common::ObSharedGuard<char> &module_name);
int set_visitor(const common::ObSharedGuard<char> &visitor);
@ -174,6 +176,8 @@ class ObDetectorInnerReportInfo
OB_UNIS_VERSION(1);
public:
ObDetectorInnerReportInfo();
ObDetectorInnerReportInfo &operator=(const ObDetectorInnerReportInfo &) = delete;
int assign(const ObDetectorInnerReportInfo &rhs);
int set_args(const UserBinaryKey &binary_key,
const common::ObAddr &addr, const uint64_t detector_id,
const int64_t report_time, const int64_t created_time,

View File

@ -49,6 +49,17 @@ bool ObDeadLockCollectInfoMessage::is_valid() const
return dest_key_.is_valid();
}
int ObDeadLockCollectInfoMessage::assign(const ObDeadLockCollectInfoMessage &rhs)
{
int ret = OB_SUCCESS;
if (OB_FAIL(collected_info_.assign(rhs.collected_info_))) {
DETECT_LOG(WARN, "fail to copy collected info");
} else {
dest_key_ = rhs.dest_key_;
}
return ret;
}
const UserBinaryKey &ObDeadLockCollectInfoMessage::get_dest_key() const
{
return dest_key_;

View File

@ -28,6 +28,8 @@ class ObDeadLockCollectInfoMessage
public:
ObDeadLockCollectInfoMessage() = default;
~ObDeadLockCollectInfoMessage() = default;
ObDeadLockCollectInfoMessage &operator=(const ObDeadLockCollectInfoMessage &) = delete;
int assign(const ObDeadLockCollectInfoMessage &rhs);
int set_dest_key(const UserBinaryKey &dest_key);
int set_args(const UserBinaryKey &dest_key,
const common::ObSArray<ObDetectorInnerReportInfo> &collected_info);

View File

@ -613,30 +613,33 @@ int ObLCLNode::process_collect_info_message(const ObDeadLockCollectInfoMessage &
int ret = OB_SUCCESS;
uint64_t event_id = 0;
ObDeadLockCollectInfoMessage msg_copy = msg;
const ObSArray<ObDetectorInnerReportInfo> &collected_info = msg_copy.get_collected_info();
if (!collected_info.empty()) {
int64_t detector_id = private_label_.get_id();
const UserBinaryKey &victim = collected_info[0].get_user_key();
DETECT_LOG_(INFO, "witness deadlock", KP(this), K(detector_id), K_(self_key), K(victim));
}
DETECT_TIME_GUARD(100_ms);
DETECT_LOG_(INFO, "reveive collect info message", K(collected_info.count()), PRINT_WRAPPER);
if (CLICK() && OB_SUCC(check_and_process_completely_collected_msg_with_lock_(collected_info))) {
DETECT_LOG_(INFO, "collect info done", PRINT_WRAPPER);
CLICK();
(void) ObDeadLockInnerTableService::insert_all(collected_info);
} else if (CLICK() && check_dead_loop_with_lock_(collected_info)) {
DETECT_LOG_(INFO, "message dead loop, just drop this message", PRINT_WRAPPER);
} else if (CLICK() && OB_FAIL(generate_event_id_with_lock_(collected_info, event_id))) {
DETECT_LOG_(WARN, "generate event id failed", PRINT_WRAPPER);
} else if (CLICK() && OB_FAIL(append_report_info_to_msg_(msg_copy, event_id))) {
DETECT_LOG_(WARN, "append report info to collect info message failed", PRINT_WRAPPER);
} else if (CLICK() && OB_FAIL(broadcast_with_lock_(msg_copy))) {
DETECT_LOG_(WARN, "keep boardcasting collect info msg failed", PRINT_WRAPPER);
ObDeadLockCollectInfoMessage msg_copy;
if (OB_FAIL(msg_copy.assign(msg))) {
DETECT_LOG_(WARN, "fail to copy message", PRINT_WRAPPER);
} else {
DETECT_LOG_(INFO, "successfully keep broadcasting collect info msg", PRINT_WRAPPER);
const ObSArray<ObDetectorInnerReportInfo> &collected_info = msg_copy.get_collected_info();
if (!collected_info.empty()) {
int64_t detector_id = private_label_.get_id();
const UserBinaryKey &victim = collected_info[0].get_user_key();
DETECT_LOG_(INFO, "witness deadlock", KP(this), K(detector_id), K_(self_key), K(victim));
}
DETECT_TIME_GUARD(100_ms);
DETECT_LOG_(INFO, "reveive collect info message", K(collected_info.count()), PRINT_WRAPPER);
if (CLICK() && OB_SUCC(check_and_process_completely_collected_msg_with_lock_(collected_info))) {
DETECT_LOG_(INFO, "collect info done", PRINT_WRAPPER);
CLICK();
(void) ObDeadLockInnerTableService::insert_all(collected_info);
} else if (CLICK() && check_dead_loop_with_lock_(collected_info)) {
DETECT_LOG_(INFO, "message dead loop, just drop this message", PRINT_WRAPPER);
} else if (CLICK() && OB_FAIL(generate_event_id_with_lock_(collected_info, event_id))) {
DETECT_LOG_(WARN, "generate event id failed", PRINT_WRAPPER);
} else if (CLICK() && OB_FAIL(append_report_info_to_msg_(msg_copy, event_id))) {
DETECT_LOG_(WARN, "append report info to collect info message failed", PRINT_WRAPPER);
} else if (CLICK() && OB_FAIL(broadcast_with_lock_(msg_copy))) {
DETECT_LOG_(WARN, "keep boardcasting collect info msg failed", PRINT_WRAPPER);
} else {
DETECT_LOG_(INFO, "successfully keep broadcasting collect info msg", PRINT_WRAPPER);
}
}
return ret;