[DETECT] add count down state to adapt sql retry deadlock
This commit is contained in:
@ -9,6 +9,7 @@
|
|||||||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||||
* See the Mulan PubL v2 for more details.
|
* See the Mulan PubL v2 for more details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <gtest/gtest.h>
|
#include <gtest/gtest.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#define USING_LOG_PREFIX STORAGE
|
#define USING_LOG_PREFIX STORAGE
|
||||||
@ -332,7 +333,6 @@ TEST_F(ObTestMdsBeforeRecover, before_recover_test)
|
|||||||
do_recycle_and_gc_mds_table(TEST_LS_ID, TEST_TABLET_ID);
|
do_recycle_and_gc_mds_table(TEST_LS_ID, TEST_TABLET_ID);
|
||||||
get_latest_scn(TEST_LS_ID, TEST_TABLET_ID, scn_from_table);
|
get_latest_scn(TEST_LS_ID, TEST_TABLET_ID, scn_from_table);
|
||||||
read_virtual_mds_stat(TEST_LS_ID, TEST_TABLET_ID, RESULT);
|
read_virtual_mds_stat(TEST_LS_ID, TEST_TABLET_ID, RESULT);
|
||||||
OCCAM_LOG(INFO, "xuwang.txw debug", K(RESULT), K(TEST_LS_ID), K(TEST_TABLET_ID));
|
|
||||||
ASSERT_EQ(OB_SUCCESS, LAST_SCN.convert_for_inner_table_field(scn_from_table));
|
ASSERT_EQ(OB_SUCCESS, LAST_SCN.convert_for_inner_table_field(scn_from_table));
|
||||||
advance_checkpoint(TEST_LS_ID, LAST_SCN);
|
advance_checkpoint(TEST_LS_ID, LAST_SCN);
|
||||||
write_result_to_file(BEFORE_RECOVER_RESULT_FILE);
|
write_result_to_file(BEFORE_RECOVER_RESULT_FILE);
|
||||||
@ -372,7 +372,6 @@ TEST_F(ObTestMdsAfterRecover, after_recover_test)
|
|||||||
{
|
{
|
||||||
read_virtual_mds_stat(TEST_LS_ID, TEST_TABLET_ID, RESULT);// to fill cache
|
read_virtual_mds_stat(TEST_LS_ID, TEST_TABLET_ID, RESULT);// to fill cache
|
||||||
read_virtual_mds_stat(TEST_LS_ID, TEST_TABLET_ID, RESULT);
|
read_virtual_mds_stat(TEST_LS_ID, TEST_TABLET_ID, RESULT);
|
||||||
OCCAM_LOG(INFO, "xuwang.txw debug", K(RESULT), K(TEST_LS_ID), K(TEST_TABLET_ID));
|
|
||||||
write_result_to_file(AFTER_RECOVER_RESULT_FILE);
|
write_result_to_file(AFTER_RECOVER_RESULT_FILE);
|
||||||
ASSERT_EQ(true, compare_before_and_after_recover_results(BEFORE_RECOVER_RESULT_FILE, AFTER_RECOVER_RESULT_FILE));
|
ASSERT_EQ(true, compare_before_and_after_recover_results(BEFORE_RECOVER_RESULT_FILE, AFTER_RECOVER_RESULT_FILE));
|
||||||
}
|
}
|
||||||
|
|||||||
@ -9,6 +9,9 @@
|
|||||||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||||
* See the Mulan PubL v2 for more details.
|
* See the Mulan PubL v2 for more details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#ifndef DEBUG_FOR_MDS
|
||||||
|
#define DEBUG_FOR_MDS
|
||||||
#include "lib/ob_errno.h"
|
#include "lib/ob_errno.h"
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
#include <thread>
|
#include <thread>
|
||||||
@ -214,7 +217,6 @@ TEST_F(TestMdsTransactionTest, test_mds_table_gc_and_recycle)
|
|||||||
// 5. 从LS找到tablet结构
|
// 5. 从LS找到tablet结构
|
||||||
storage::ObTabletHandle tablet_handle;
|
storage::ObTabletHandle tablet_handle;
|
||||||
ASSERT_EQ(OB_SUCCESS, ls_handle.get_ls()->get_tablet(tablet_id, tablet_handle));
|
ASSERT_EQ(OB_SUCCESS, ls_handle.get_ls()->get_tablet(tablet_id, tablet_handle));
|
||||||
MDS_LOG(ERROR, "xuwang.txw debug", K(tablet_id));
|
|
||||||
// 6. 调用tablet接口写入多源数据,提交
|
// 6. 调用tablet接口写入多源数据,提交
|
||||||
MdsCtx ctx1(mds::MdsWriter(ObTransID(1)));
|
MdsCtx ctx1(mds::MdsWriter(ObTransID(1)));
|
||||||
share::SCN rec_scn;
|
share::SCN rec_scn;
|
||||||
@ -226,7 +228,6 @@ TEST_F(TestMdsTransactionTest, test_mds_table_gc_and_recycle)
|
|||||||
// ASSERT_EQ(OB_SUCCESS, static_cast<ObTabletPointer*>(tablet_handle.get_obj()->pointer_hdl_.get_resource_ptr())->mds_table_handler_.mds_table_handle_.get_rec_scn(rec_scn));
|
// ASSERT_EQ(OB_SUCCESS, static_cast<ObTabletPointer*>(tablet_handle.get_obj()->pointer_hdl_.get_resource_ptr())->mds_table_handler_.mds_table_handle_.get_rec_scn(rec_scn));
|
||||||
// ASSERT_EQ(mock_scn(10), rec_scn);
|
// ASSERT_EQ(mock_scn(10), rec_scn);
|
||||||
std::this_thread::sleep_for(std::chrono::seconds(5));
|
std::this_thread::sleep_for(std::chrono::seconds(5));
|
||||||
MDS_LOG(ERROR, "xuwang.txw debug1");
|
|
||||||
ASSERT_EQ(OB_SUCCESS, tablet_handle.get_obj()->mds_table_flush(share::SCN::max_scn()));
|
ASSERT_EQ(OB_SUCCESS, tablet_handle.get_obj()->mds_table_flush(share::SCN::max_scn()));
|
||||||
// 7. 检查mds table的存在情况
|
// 7. 检查mds table的存在情况
|
||||||
std::this_thread::sleep_for(std::chrono::seconds(5));
|
std::this_thread::sleep_for(std::chrono::seconds(5));
|
||||||
@ -282,3 +283,4 @@ int main(int argc, char **argv)
|
|||||||
::testing::InitGoogleTest(&argc, argv);
|
::testing::InitGoogleTest(&argc, argv);
|
||||||
return RUN_ALL_TESTS();
|
return RUN_ALL_TESTS();
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
@ -62,6 +62,7 @@ public:
|
|||||||
virtual void set_timeout(const uint64_t timeout) = 0;
|
virtual void set_timeout(const uint64_t timeout) = 0;
|
||||||
virtual int register_timer_task() = 0;
|
virtual int register_timer_task() = 0;
|
||||||
virtual void unregister_timer_task() = 0;
|
virtual void unregister_timer_task() = 0;
|
||||||
|
virtual void dec_count_down_allow_detect() = 0;
|
||||||
virtual int64_t to_string(char *buffer, const int64_t length) const = 0;// for debugging
|
virtual int64_t to_string(char *buffer, const int64_t length) const = 0;// for debugging
|
||||||
virtual const ObDetectorPriority &get_priority() const = 0;// return detector's priority
|
virtual const ObDetectorPriority &get_priority() const = 0;// return detector's priority
|
||||||
// build a directed dependency relationship to other
|
// build a directed dependency relationship to other
|
||||||
|
|||||||
@ -81,6 +81,7 @@ int ObDeadLockDetectorMgr::InnerAllocHandle::InnerFactory::create(const UserBina
|
|||||||
const CollectCallBack &on_collect_operation,
|
const CollectCallBack &on_collect_operation,
|
||||||
const ObDetectorPriority &priority,
|
const ObDetectorPriority &priority,
|
||||||
const uint64_t start_delay,
|
const uint64_t start_delay,
|
||||||
|
const uint32_t count_down_allow_detect,
|
||||||
const bool auto_activate_when_detected,
|
const bool auto_activate_when_detected,
|
||||||
ObIDeadLockDetector *&p_detector)
|
ObIDeadLockDetector *&p_detector)
|
||||||
{
|
{
|
||||||
@ -104,6 +105,7 @@ int ObDeadLockDetectorMgr::InnerAllocHandle::InnerFactory::create(const UserBina
|
|||||||
on_collect_operation,
|
on_collect_operation,
|
||||||
priority,
|
priority,
|
||||||
start_delay,
|
start_delay,
|
||||||
|
count_down_allow_detect,
|
||||||
auto_activate_when_detected);
|
auto_activate_when_detected);
|
||||||
if (false == static_cast<ObLCLNode*>(p_detector)->
|
if (false == static_cast<ObLCLNode*>(p_detector)->
|
||||||
is_successfully_constructed()) {
|
is_successfully_constructed()) {
|
||||||
@ -415,6 +417,7 @@ int ObDeadLockDetectorMgr::process_notify_parent_message(
|
|||||||
},
|
},
|
||||||
ObDetectorPriority(PRIORITY_RANGE::EXTREMELY_HIGH, 0),
|
ObDetectorPriority(PRIORITY_RANGE::EXTREMELY_HIGH, 0),
|
||||||
0,
|
0,
|
||||||
|
0,
|
||||||
true,
|
true,
|
||||||
p_detector))) {
|
p_detector))) {
|
||||||
DETECT_LOG(WARN, "create new detector instance failed", PRINT_WRAPPER);
|
DETECT_LOG(WARN, "create new detector instance failed", PRINT_WRAPPER);
|
||||||
|
|||||||
@ -96,6 +96,7 @@ public:
|
|||||||
const CollectCallBack &on_collect_operation,
|
const CollectCallBack &on_collect_operation,
|
||||||
const ObDetectorPriority &priority = ObDetectorPriority(0),
|
const ObDetectorPriority &priority = ObDetectorPriority(0),
|
||||||
const uint64_t start_delay = 0,
|
const uint64_t start_delay = 0,
|
||||||
|
const uint32_t count_down_allow_detect = 0,
|
||||||
const bool auto_activate_when_detected = true);
|
const bool auto_activate_when_detected = true);
|
||||||
template<typename KeyType1, typename KeyType2>
|
template<typename KeyType1, typename KeyType2>
|
||||||
int add_parent(const KeyType1 &key, const KeyType2 &parent_key);
|
int add_parent(const KeyType1 &key, const KeyType2 &parent_key);
|
||||||
@ -130,6 +131,8 @@ public:
|
|||||||
const common::ObIArray<ObDependencyResource> &new_list);
|
const common::ObIArray<ObDependencyResource> &new_list);
|
||||||
template<typename T>
|
template<typename T>
|
||||||
int get_block_list(const T &src_key, common::ObIArray<ObDependencyResource> &cur_list);
|
int get_block_list(const T &src_key, common::ObIArray<ObDependencyResource> &cur_list);
|
||||||
|
template<typename T>
|
||||||
|
int dec_count_down_allow_detect(const T &src_key);
|
||||||
// remove directed dependency relationship between two detector
|
// remove directed dependency relationship between two detector
|
||||||
template<typename T1, typename T2>
|
template<typename T1, typename T2>
|
||||||
int activate(const T1 &src_key, const T2 &dest_key);
|
int activate(const T1 &src_key, const T2 &dest_key);
|
||||||
@ -164,6 +167,7 @@ private:
|
|||||||
const CollectCallBack &on_collect_operation,
|
const CollectCallBack &on_collect_operation,
|
||||||
const ObDetectorPriority &priority,
|
const ObDetectorPriority &priority,
|
||||||
const uint64_t start_delay,
|
const uint64_t start_delay,
|
||||||
|
const uint32_t count_down_allow_detect,
|
||||||
const bool auto_activate_when_detected,
|
const bool auto_activate_when_detected,
|
||||||
ObIDeadLockDetector *&p_detector);
|
ObIDeadLockDetector *&p_detector);
|
||||||
void release(ObIDeadLockDetector *p_detector);
|
void release(ObIDeadLockDetector *p_detector);
|
||||||
@ -236,6 +240,7 @@ int ObDeadLockDetectorMgr::register_key(const KeyType &key,
|
|||||||
const CollectCallBack &on_collect_operation,
|
const CollectCallBack &on_collect_operation,
|
||||||
const ObDetectorPriority &priority,
|
const ObDetectorPriority &priority,
|
||||||
const uint64_t start_delay,
|
const uint64_t start_delay,
|
||||||
|
const uint32_t count_down_allow_detect,
|
||||||
const bool auto_activate_when_detected)
|
const bool auto_activate_when_detected)
|
||||||
{
|
{
|
||||||
CHECK_INIT();
|
CHECK_INIT();
|
||||||
@ -259,6 +264,7 @@ int ObDeadLockDetectorMgr::register_key(const KeyType &key,
|
|||||||
on_collect_operation,
|
on_collect_operation,
|
||||||
priority,
|
priority,
|
||||||
start_delay,
|
start_delay,
|
||||||
|
count_down_allow_detect,
|
||||||
auto_activate_when_detected,
|
auto_activate_when_detected,
|
||||||
p_detector))) {
|
p_detector))) {
|
||||||
DETECT_LOG(WARN, "create new detector instance failed", PRINT_WRAPPER, KP(p_detector));
|
DETECT_LOG(WARN, "create new detector instance failed", PRINT_WRAPPER, KP(p_detector));
|
||||||
@ -499,6 +505,28 @@ int ObDeadLockDetectorMgr::get_block_list(const T &src_key,
|
|||||||
return ret;
|
return ret;
|
||||||
#undef PRINT_WRAPPER
|
#undef PRINT_WRAPPER
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
int ObDeadLockDetectorMgr::dec_count_down_allow_detect(const T &src_key)
|
||||||
|
{
|
||||||
|
CHECK_INIT();
|
||||||
|
CHECK_ENABLED();
|
||||||
|
#define PRINT_WRAPPER KR(ret)
|
||||||
|
int ret = common::OB_SUCCESS;
|
||||||
|
DetectorRefGuard ref_guard;
|
||||||
|
UserBinaryKey src_user_key;
|
||||||
|
|
||||||
|
if (OB_FAIL(src_user_key.set_user_key(src_key))) {
|
||||||
|
DETECT_LOG(WARN, "src_key serialzation failed", PRINT_WRAPPER);
|
||||||
|
} else if (OB_FAIL(get_detector_(src_user_key, ref_guard))) {
|
||||||
|
DETECT_LOG(WARN, "get_detector failed", PRINT_WRAPPER);
|
||||||
|
} else {
|
||||||
|
ref_guard.get_detector()->dec_count_down_allow_detect();
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
#undef PRINT_WRAPPER
|
||||||
|
}
|
||||||
// call for removing directed dependency relationship between two detector(both in local)
|
// call for removing directed dependency relationship between two detector(both in local)
|
||||||
// thread-safe guaranteed
|
// thread-safe guaranteed
|
||||||
//
|
//
|
||||||
|
|||||||
@ -10,6 +10,7 @@
|
|||||||
* See the Mulan PubL v2 for more details.
|
* See the Mulan PubL v2 for more details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "lib/atomic/ob_atomic.h"
|
||||||
#include "share/config/ob_server_config.h"
|
#include "share/config/ob_server_config.h"
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include "share/ob_occam_time_guard.h"
|
#include "share/ob_occam_time_guard.h"
|
||||||
@ -42,6 +43,7 @@ ObLCLNode::ObLCLNode(const UserBinaryKey &user_key,
|
|||||||
const CollectCallBack &on_collect_operation,
|
const CollectCallBack &on_collect_operation,
|
||||||
const ObDetectorPriority &priority,
|
const ObDetectorPriority &priority,
|
||||||
const uint64_t start_delay,
|
const uint64_t start_delay,
|
||||||
|
const uint32_t count_down_allow_detect,
|
||||||
const bool auto_activate_when_detected)
|
const bool auto_activate_when_detected)
|
||||||
:push_state_task_(*this),
|
:push_state_task_(*this),
|
||||||
self_key_(user_key),
|
self_key_(user_key),
|
||||||
@ -56,6 +58,7 @@ ObLCLNode::ObLCLNode(const UserBinaryKey &user_key,
|
|||||||
lcl_period_(0),
|
lcl_period_(0),
|
||||||
last_report_waiting_for_period_(0),
|
last_report_waiting_for_period_(0),
|
||||||
last_send_collect_info_period_(0),
|
last_send_collect_info_period_(0),
|
||||||
|
count_down_allow_detect_(count_down_allow_detect),
|
||||||
lock_(ObLatchIds::DEADLOCK_LOCK)
|
lock_(ObLatchIds::DEADLOCK_LOCK)
|
||||||
{
|
{
|
||||||
#define PRINT_WRAPPER K(*this), K(resource_id), K(on_detect_operation),\
|
#define PRINT_WRAPPER K(*this), K(resource_id), K(on_detect_operation),\
|
||||||
@ -131,6 +134,18 @@ void ObLCLNode::unregister_timer_task()
|
|||||||
ATOMIC_STORE(&is_timer_task_canceled_, true);
|
ATOMIC_STORE(&is_timer_task_canceled_, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ObLCLNode::dec_count_down_allow_detect()
|
||||||
|
{
|
||||||
|
uint32_t cnt = 0;
|
||||||
|
bool cas_failed = false;
|
||||||
|
do {
|
||||||
|
cnt = ATOMIC_LOAD(&count_down_allow_detect_);
|
||||||
|
if (cnt > 0) {
|
||||||
|
cas_failed = (ATOMIC_CAS(&count_down_allow_detect_, cnt, cnt - 1) != cnt);
|
||||||
|
}
|
||||||
|
} while (cnt > 0 && cas_failed);
|
||||||
|
}
|
||||||
|
|
||||||
int ObLCLNode::register_timer_with_necessary_retry_with_lock_()
|
int ObLCLNode::register_timer_with_necessary_retry_with_lock_()
|
||||||
{
|
{
|
||||||
int ret = OB_SUCCESS;
|
int ret = OB_SUCCESS;
|
||||||
@ -805,7 +820,11 @@ int ObLCLNode::push_state_to_downstreams_with_lock_()
|
|||||||
}
|
}
|
||||||
|
|
||||||
CLICK();
|
CLICK();
|
||||||
if (OB_FAIL(broadcast_(blocklist_snapshot, lclv_snapshot, public_label_snapshot))) {
|
if (ATOMIC_LOAD(&count_down_allow_detect_) != 0) {
|
||||||
|
DETECT_LOG_(INFO, "not allow do detect cause count_down_allow_detect_ is not dec to 0 yet",
|
||||||
|
K(blocklist_snapshot), K(lclv_snapshot), K(public_label_snapshot),
|
||||||
|
K(*this));
|
||||||
|
} else if (OB_FAIL(broadcast_(blocklist_snapshot, lclv_snapshot, public_label_snapshot))) {
|
||||||
DETECT_LOG_(WARN, "boardcast failed",
|
DETECT_LOG_(WARN, "boardcast failed",
|
||||||
K(blocklist_snapshot), K(lclv_snapshot), K(public_label_snapshot),
|
K(blocklist_snapshot), K(lclv_snapshot), K(public_label_snapshot),
|
||||||
K(*this));
|
K(*this));
|
||||||
|
|||||||
@ -97,6 +97,7 @@ public:
|
|||||||
const CollectCallBack &on_collect_operation,
|
const CollectCallBack &on_collect_operation,
|
||||||
const ObDetectorPriority &priority,
|
const ObDetectorPriority &priority,
|
||||||
const uint64_t start_delay,
|
const uint64_t start_delay,
|
||||||
|
const uint32_t count_down_allow_detect,
|
||||||
const bool auto_activate_when_detected);
|
const bool auto_activate_when_detected);
|
||||||
~ObLCLNode();
|
~ObLCLNode();
|
||||||
public:
|
public:
|
||||||
@ -104,6 +105,7 @@ public:
|
|||||||
void set_timeout(const uint64_t timeout) override;
|
void set_timeout(const uint64_t timeout) override;
|
||||||
int register_timer_task() override;
|
int register_timer_task() override;
|
||||||
void unregister_timer_task() override;
|
void unregister_timer_task() override;
|
||||||
|
void dec_count_down_allow_detect() override;
|
||||||
bool is_successfully_constructed() const { return successfully_constructed_; }
|
bool is_successfully_constructed() const { return successfully_constructed_; }
|
||||||
const ObDetectorPriority &get_priority() const override;// return detector's priority
|
const ObDetectorPriority &get_priority() const override;// return detector's priority
|
||||||
// build a directed dependency relationship to other
|
// build a directed dependency relationship to other
|
||||||
@ -124,7 +126,8 @@ public:
|
|||||||
K_(public_label), K_(detect_callback),
|
K_(public_label), K_(detect_callback),
|
||||||
K_(auto_activate_when_detected), KTIME_(created_time), KTIME_(allow_detect_time),
|
K_(auto_activate_when_detected), KTIME_(created_time), KTIME_(allow_detect_time),
|
||||||
K_(is_timer_task_canceled), K_(block_list), K_(parent_list),
|
K_(is_timer_task_canceled), K_(block_list), K_(parent_list),
|
||||||
K_(lcl_period), K_(last_send_collect_info_period), K(block_callback_list_.count()))
|
K_(lcl_period), K_(last_send_collect_info_period), K(block_callback_list_.count()),
|
||||||
|
K(ATOMIC_LOAD(&count_down_allow_detect_)))
|
||||||
private:
|
private:
|
||||||
class PushStateTask : public common::ObTimeWheelTask
|
class PushStateTask : public common::ObTimeWheelTask
|
||||||
{
|
{
|
||||||
@ -183,6 +186,7 @@ private:
|
|||||||
int64_t last_report_waiting_for_period_;
|
int64_t last_report_waiting_for_period_;
|
||||||
int64_t last_send_collect_info_period_;
|
int64_t last_send_collect_info_period_;
|
||||||
bool successfully_constructed_;
|
bool successfully_constructed_;
|
||||||
|
uint32_t count_down_allow_detect_;
|
||||||
mutable common::ObSpinLock lock_;
|
mutable common::ObSpinLock lock_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -232,7 +232,6 @@ bool ObLockWaitMgr::post_process(bool need_retry, bool& need_wait)
|
|||||||
}
|
}
|
||||||
if (need_retry) {
|
if (need_retry) {
|
||||||
if ((need_wait = node->need_wait())) {
|
if ((need_wait = node->need_wait())) {
|
||||||
TLOCAL_NEED_WAIT_IN_LOCK_WAIT_MGR = true;
|
|
||||||
// FIXME(xuwang.txw):create detector in check_timeout process
|
// FIXME(xuwang.txw):create detector in check_timeout process
|
||||||
// below code must keep current order to fix concurrency bug
|
// below code must keep current order to fix concurrency bug
|
||||||
// more info see
|
// more info see
|
||||||
@ -578,6 +577,7 @@ int ObLockWaitMgr::post_lock(const int tmp_ret,
|
|||||||
ObFunction<int(bool&, bool&)> &rechecker)
|
ObFunction<int(bool&, bool&)> &rechecker)
|
||||||
{
|
{
|
||||||
int ret = OB_SUCCESS;
|
int ret = OB_SUCCESS;
|
||||||
|
TLOCAL_NEED_WAIT_IN_LOCK_WAIT_MGR = false;
|
||||||
Node *node = NULL;
|
Node *node = NULL;
|
||||||
if (OB_NOT_NULL(node = get_thread_node())) {
|
if (OB_NOT_NULL(node = get_thread_node())) {
|
||||||
Key key(&row_key);
|
Key key(&row_key);
|
||||||
@ -609,6 +609,7 @@ int ObLockWaitMgr::post_lock(const int tmp_ret,
|
|||||||
tx_id,
|
tx_id,
|
||||||
holder_tx_id);
|
holder_tx_id);
|
||||||
node->set_need_wait();
|
node->set_need_wait();
|
||||||
|
TLOCAL_NEED_WAIT_IN_LOCK_WAIT_MGR = true;// to tell end_stmt() not register deadlock
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -629,6 +630,7 @@ int ObLockWaitMgr::post_lock(const int tmp_ret,
|
|||||||
ObFunction<int(bool&)> &check_need_wait)
|
ObFunction<int(bool&)> &check_need_wait)
|
||||||
{
|
{
|
||||||
int ret = OB_SUCCESS;
|
int ret = OB_SUCCESS;
|
||||||
|
TLOCAL_NEED_WAIT_IN_LOCK_WAIT_MGR = false;
|
||||||
Node *node = NULL;
|
Node *node = NULL;
|
||||||
|
|
||||||
if (OB_UNLIKELY(!is_inited_)) {
|
if (OB_UNLIKELY(!is_inited_)) {
|
||||||
@ -665,6 +667,7 @@ int ObLockWaitMgr::post_lock(const int tmp_ret,
|
|||||||
holder_tx_id);
|
holder_tx_id);
|
||||||
node->set_need_wait();
|
node->set_need_wait();
|
||||||
node->set_lock_mode(lock_mode);
|
node->set_lock_mode(lock_mode);
|
||||||
|
TLOCAL_NEED_WAIT_IN_LOCK_WAIT_MGR = true;// to tell end_stmt() not register deadlock
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
|
|||||||
@ -365,8 +365,7 @@ int UserMdsNode<K, V>::fill_event_(observer::MdsEvent &event,
|
|||||||
if (FALSE_IT(databuff_printf(stack_buffer, buffer_size, pos, "%s", to_cstring(user_data_)))) {
|
if (FALSE_IT(databuff_printf(stack_buffer, buffer_size, pos, "%s", to_cstring(user_data_)))) {
|
||||||
} else if (FALSE_IT(event.info_str_.assign_ptr(stack_buffer, pos))) {
|
} else if (FALSE_IT(event.info_str_.assign_ptr(stack_buffer, pos))) {
|
||||||
} else if (FALSE_IT(last_pos = pos)) {
|
} else if (FALSE_IT(last_pos = pos)) {
|
||||||
} else if (MDS_FAIL(databuff_printf(stack_buffer, buffer_size, pos, "%s", p_mds_row_ ? to_cstring(*p_mds_row_->key_) : "NULL"))) {
|
} else if (FALSE_IT(databuff_printf(stack_buffer, buffer_size, pos, "%s", p_mds_row_ ? to_cstring(*p_mds_row_->key_) : "NULL"))) {
|
||||||
MDS_LOG(WARN, "fail to_string user key", K(*this));
|
|
||||||
} else if (FALSE_IT(event.key_str_.assign_ptr(&stack_buffer[last_pos], pos - last_pos))) {
|
} else if (FALSE_IT(event.key_str_.assign_ptr(&stack_buffer[last_pos], pos - last_pos))) {
|
||||||
} else if (FALSE_IT(last_pos = pos)) {
|
} else if (FALSE_IT(last_pos = pos)) {
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@ -354,7 +354,8 @@ int ObTransDeadlockDetectorAdapter::register_remote_execution_to_deadlock_detect
|
|||||||
on_detect_op,
|
on_detect_op,
|
||||||
on_collect_op,
|
on_collect_op,
|
||||||
~session_guard->get_tx_desc()->get_active_ts(),
|
~session_guard->get_tx_desc()->get_active_ts(),
|
||||||
3_s))) {
|
3_s,
|
||||||
|
10))) {
|
||||||
DETECT_LOG(WARN, "fail to register deadlock", PRINT_WRAPPER);
|
DETECT_LOG(WARN, "fail to register deadlock", PRINT_WRAPPER);
|
||||||
} else {
|
} else {
|
||||||
MTL(ObDeadLockDetectorMgr*)->set_timeout(self_tx_id, query_timeout);
|
MTL(ObDeadLockDetectorMgr*)->set_timeout(self_tx_id, query_timeout);
|
||||||
@ -406,6 +407,7 @@ int ObTransDeadlockDetectorAdapter::remote_execution_replace_conflict_trans_ids_
|
|||||||
if (OB_FAIL(MTL(ObDeadLockDetectorMgr*)->replace_block_list(self_tx_id, blocked_resources))) {
|
if (OB_FAIL(MTL(ObDeadLockDetectorMgr*)->replace_block_list(self_tx_id, blocked_resources))) {
|
||||||
DETECT_LOG(WARN, "replace block list failed", PRINT_WRAPPER);
|
DETECT_LOG(WARN, "replace block list failed", PRINT_WRAPPER);
|
||||||
}
|
}
|
||||||
|
(void) MTL(ObDeadLockDetectorMgr*)->dec_count_down_allow_detect(self_tx_id);
|
||||||
} else {
|
} else {
|
||||||
unregister_from_deadlock_detector(self_tx_id,
|
unregister_from_deadlock_detector(self_tx_id,
|
||||||
UnregisterPath::REPLACE_MEET_TOTAL_DIFFERENT_LIST);
|
UnregisterPath::REPLACE_MEET_TOTAL_DIFFERENT_LIST);
|
||||||
@ -642,6 +644,8 @@ int ObTransDeadlockDetectorAdapter::maintain_deadlock_info_when_end_stmt(sql::Ob
|
|||||||
DETECT_LOG(ERROR, "session is NULL", PRINT_WRAPPER);
|
DETECT_LOG(ERROR, "session is NULL", PRINT_WRAPPER);
|
||||||
} else if (++step && session->is_inner()) {
|
} else if (++step && session->is_inner()) {
|
||||||
DETECT_LOG(TRACE, "inner session no need register to deadlock", PRINT_WRAPPER);
|
DETECT_LOG(TRACE, "inner session no need register to deadlock", PRINT_WRAPPER);
|
||||||
|
} else if (++step && memtable::TLOCAL_NEED_WAIT_IN_LOCK_WAIT_MGR) {
|
||||||
|
DETECT_LOG(TRACE, "will register deadlock in LockWaitMgr::post_process after end_stmt()", PRINT_WRAPPER);
|
||||||
} else if (++step && OB_ISNULL(desc = session->get_tx_desc())) {
|
} else if (++step && OB_ISNULL(desc = session->get_tx_desc())) {
|
||||||
ret = OB_BAD_NULL_ERROR;
|
ret = OB_BAD_NULL_ERROR;
|
||||||
DETECT_LOG(ERROR, "desc in session is NULL", PRINT_WRAPPER);
|
DETECT_LOG(ERROR, "desc in session is NULL", PRINT_WRAPPER);
|
||||||
@ -659,8 +663,6 @@ int ObTransDeadlockDetectorAdapter::maintain_deadlock_info_when_end_stmt(sql::Ob
|
|||||||
} else if (++step && exec_ctx.get_errcode() != OB_TRY_LOCK_ROW_CONFLICT) {
|
} else if (++step && exec_ctx.get_errcode() != OB_TRY_LOCK_ROW_CONFLICT) {
|
||||||
unregister_from_deadlock_detector(desc->tid(), UnregisterPath::END_STMT_OTHER_ERR);
|
unregister_from_deadlock_detector(desc->tid(), UnregisterPath::END_STMT_OTHER_ERR);
|
||||||
DETECT_LOG(INFO, "try unregister deadlock detecotr cause meet non-lock error", PRINT_WRAPPER);
|
DETECT_LOG(INFO, "try unregister deadlock detecotr cause meet non-lock error", PRINT_WRAPPER);
|
||||||
} else if (++step && memtable::TLOCAL_NEED_WAIT_IN_LOCK_WAIT_MGR) {
|
|
||||||
DETECT_LOG(INFO, "thread local flag marked local execution, no need register to deadlock here", PRINT_WRAPPER);
|
|
||||||
} else if (++step && OB_FAIL(register_remote_execution_or_replace_conflict_trans_ids(desc->tid(),
|
} else if (++step && OB_FAIL(register_remote_execution_or_replace_conflict_trans_ids(desc->tid(),
|
||||||
session->get_sessid(),
|
session->get_sessid(),
|
||||||
conflict_txs))) {
|
conflict_txs))) {
|
||||||
|
|||||||
Reference in New Issue
Block a user