diff --git a/deps/oblib/src/rpc/ob_lock_wait_node.cpp b/deps/oblib/src/rpc/ob_lock_wait_node.cpp index 56deabf88f..6f32fe964d 100644 --- a/deps/oblib/src/rpc/ob_lock_wait_node.cpp +++ b/deps/oblib/src/rpc/ob_lock_wait_node.cpp @@ -20,25 +20,31 @@ namespace rpc ObLockWaitNode::ObLockWaitNode() : hold_key_(0), need_wait_(false), addr_(NULL), recv_ts_(0), lock_ts_(0), lock_seq_(0), abs_timeout_(0), tablet_id_(common::OB_INVALID_ID), try_lock_times_(0), sessid_(0), - block_sessid_(0), tx_id_(0), holder_tx_id_(0), run_ts_(0), is_standalone_task_(false), - last_compact_cnt_(0), total_update_cnt_(0) {} + holder_sessid_(0), block_sessid_(0), tx_id_(0), holder_tx_id_(0), run_ts_(0), + is_standalone_task_(false), last_compact_cnt_(0), total_update_cnt_(0) {} -void ObLockWaitNode::set(void* addr, +void ObLockWaitNode::set(void *addr, int64_t hash, int64_t lock_seq, int64_t timeout, uint64_t tablet_id, const int64_t last_compact_cnt, const int64_t total_trans_node_cnt, - const char* key, + const char *key, + const uint32_t sess_id, + const uint32_t holder_sess_id, int64_t tx_id, - int64_t holder_tx_id) { + int64_t holder_tx_id, + const share::ObLSID &ls_id) +{ hash_ = hash | 1; addr_ = addr; lock_ts_ = common::ObTimeUtil::current_time(); lock_seq_ = lock_seq; abs_timeout_ = timeout; tablet_id_ = tablet_id;//used for gv$lock_wait_stat + sessid_ = sess_id; + holder_sessid_ = holder_sess_id; tx_id_ = tx_id;//requester used for deadlock detection holder_tx_id_ = holder_tx_id; // txn id of lock holder last_compact_cnt_ = last_compact_cnt, diff --git a/deps/oblib/src/rpc/ob_lock_wait_node.h b/deps/oblib/src/rpc/ob_lock_wait_node.h index eccccee425..eb41ac89e4 100644 --- a/deps/oblib/src/rpc/ob_lock_wait_node.h +++ b/deps/oblib/src/rpc/ob_lock_wait_node.h @@ -19,6 +19,10 @@ namespace oceanbase { +namespace share +{ +class ObLSID; +} namespace rpc { @@ -27,16 +31,19 @@ struct ObLockWaitNode: public common::SpHashNode ObLockWaitNode(); ~ObLockWaitNode() {} void reset_need_wait() { need_wait_ = false; } - void set(void* addr, + void set(void *addr, int64_t hash, int64_t lock_seq, int64_t timeout, uint64_t tablet_id, const int64_t last_compact_cnt, const int64_t total_trans_node_cnt, - const char* key, + const char *key, + const uint32_t sess_id, + const uint32_t holder_sess_id, int64_t tx_id, - int64_t holder_tx_id); + int64_t holder_tx_id, + const share::ObLSID &ls_id); void change_hash(const int64_t hash, const int64_t lock_seq); void update_run_ts(const int64_t run_ts) { run_ts_ = run_ts; } int64_t get_run_ts() const { return run_ts_; } @@ -70,6 +77,7 @@ struct ObLockWaitNode: public common::SpHashNode K_(try_lock_times), KCSTRING_(key), K_(sessid), + K_(holder_sessid), K_(block_sessid), K_(run_ts), K_(lock_mode), @@ -91,6 +99,7 @@ struct ObLockWaitNode: public common::SpHashNode uint64_t tablet_id_; int64_t try_lock_times_; uint32_t sessid_; + uint32_t holder_sessid_; uint32_t block_sessid_; int64_t tx_id_; int64_t holder_tx_id_; diff --git a/src/observer/mysql/obmp_query.cpp b/src/observer/mysql/obmp_query.cpp index 9e1d4594b7..2a4fb3d422 100644 --- a/src/observer/mysql/obmp_query.cpp +++ b/src/observer/mysql/obmp_query.cpp @@ -216,8 +216,6 @@ int ObMPQuery::process() retry_ctrl_.set_sys_global_schema_version(sys_version); session.partition_hit().reset(); session.set_pl_can_retry(true); - ObLockWaitNode &lock_wait_node = req_->get_lock_wait_node(); - lock_wait_node.set_session_info(session.get_sessid()); bool has_more = false; bool force_sync_resp = false; diff --git a/src/observer/mysql/obmp_stmt_execute.cpp b/src/observer/mysql/obmp_stmt_execute.cpp index a0bbba8888..a1e8d8386f 100644 --- a/src/observer/mysql/obmp_stmt_execute.cpp +++ b/src/observer/mysql/obmp_stmt_execute.cpp @@ -1910,8 +1910,6 @@ int ObMPStmtExecute::process() retry_ctrl_.set_sys_global_schema_version(sys_version); session.partition_hit().reset(); session.set_pl_can_retry(true); - ObLockWaitNode &lock_wait_node = req_->get_lock_wait_node(); - lock_wait_node.set_session_info(session.get_sessid()); need_response_error = false; need_disconnect = false; diff --git a/src/observer/virtual_table/ob_all_virtual_lock_wait_stat.cpp b/src/observer/virtual_table/ob_all_virtual_lock_wait_stat.cpp index 1b64106572..ef8a7f030e 100644 --- a/src/observer/virtual_table/ob_all_virtual_lock_wait_stat.cpp +++ b/src/observer/virtual_table/ob_all_virtual_lock_wait_stat.cpp @@ -139,6 +139,9 @@ int ObAllVirtualLockWaitStat::process_curr_tenant(ObNewRow *&row) case SESSION_ID: cur_row_.cells_[i].set_int(node_iter_->sessid_); break; + case HOLDER_SESSION_ID: + cur_row_.cells_[i].set_int(node_iter_->holder_sessid_); + break; case BLOCK_SESSION_ID: cur_row_.cells_[i].set_int(node_iter_->block_sessid_); break; diff --git a/src/observer/virtual_table/ob_all_virtual_lock_wait_stat.h b/src/observer/virtual_table/ob_all_virtual_lock_wait_stat.h index 0dd7e4156b..581364afa3 100644 --- a/src/observer/virtual_table/ob_all_virtual_lock_wait_stat.h +++ b/src/observer/virtual_table/ob_all_virtual_lock_wait_stat.h @@ -55,6 +55,7 @@ private: TRY_LOCK_TIMES, TIME_AFTER_RECV, SESSION_ID, + HOLDER_SESSION_ID, BLOCK_SESSION_ID, TYPE, LMODE, diff --git a/src/share/inner_table/ob_inner_table_schema.12001_12050.cpp b/src/share/inner_table/ob_inner_table_schema.12001_12050.cpp index c058b15e30..28c74b7618 100644 --- a/src/share/inner_table/ob_inner_table_schema.12001_12050.cpp +++ b/src/share/inner_table/ob_inner_table_schema.12001_12050.cpp @@ -1670,6 +1670,21 @@ int ObInnerTableSchema::all_virtual_lock_wait_stat_schema(ObTableSchema &table_s false); //is_autoincrement } + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("holder_session_id", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + if (OB_SUCC(ret)) { ADD_COLUMN_SCHEMA("block_session_id", //column_name ++column_id, //column_id diff --git a/src/share/inner_table/ob_inner_table_schema.15101_15150.cpp b/src/share/inner_table/ob_inner_table_schema.15101_15150.cpp index fe0a383024..afdba03eba 100644 --- a/src/share/inner_table/ob_inner_table_schema.15101_15150.cpp +++ b/src/share/inner_table/ob_inner_table_schema.15101_15150.cpp @@ -1852,6 +1852,21 @@ int ObInnerTableSchema::all_virtual_lock_wait_stat_ora_schema(ObTableSchema &tab false); //is_autoincrement } + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("HOLDER_SESSION_ID", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + if (OB_SUCC(ret)) { ADD_COLUMN_SCHEMA("BLOCK_SESSION_ID", //column_name ++column_id, //column_id diff --git a/src/share/inner_table/ob_inner_table_schema.21351_21400.cpp b/src/share/inner_table/ob_inner_table_schema.21351_21400.cpp index 850a2ef764..93d0e2934d 100644 --- a/src/share/inner_table/ob_inner_table_schema.21351_21400.cpp +++ b/src/share/inner_table/ob_inner_table_schema.21351_21400.cpp @@ -2160,7 +2160,7 @@ int ObInnerTableSchema::gv_ob_locks_schema(ObTableSchema &table_schema) table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); if (OB_SUCC(ret)) { - if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT SVR_IP AS SVR_IP, SVR_PORT AS SVR_PORT, TENANT_ID AS TENANT_ID, TRANS_ID AS TRANS_ID, CASE WHEN TYPE = 1 THEN 'TR' WHEN TYPE = 2 THEN 'TX' WHEN TYPE = 3 THEN 'TM' ELSE 'UNDEFINED' END AS TYPE, CASE WHEN TYPE = 1 THEN TABLET_ID WHEN TYPE = 2 THEN HOLDER_TRANS_ID WHEN TYPE = 3 THEN (SELECT DISTINCT OBJ_ID FROM oceanbase.__ALL_VIRTUAL_OBJ_LOCK WHERE oceanbase.__ALL_VIRTUAL_OBJ_LOCK.LOCK_ID = oceanbase.__ALL_VIRTUAL_LOCK_WAIT_STAT.ROWKEY) ELSE -1 END AS ID1, CASE WHEN TYPE = 1 THEN CONCAT(CONCAT(HOLDER_TRANS_ID, '-'), ROWKEY) WHEN TYPE = 2 OR TYPE = 3 THEN NULL ELSE 'ERROR' END AS ID2, 'NONE' AS LMODE, LOCK_MODE AS REQUEST, TIME_AFTER_RECV AS CTIME, 1 AS BLOCK FROM oceanbase.__ALL_VIRTUAL_LOCK_WAIT_STAT UNION ALL SELECT SVR_IP AS SVR_IP, SVR_PORT AS SVR_PORT, TENANT_ID AS TENANT_ID, TRANS_ID AS TRANS_ID, 'TX' AS TYPE, HOLDER_TRANS_ID AS ID1, NULL AS ID2, 'NONE' AS LMODE, LOCK_MODE AS REQUEST, TIME_AFTER_RECV AS CTIME, 1 AS BLOCK FROM oceanbase.__ALL_VIRTUAL_LOCK_WAIT_STAT WHERE TYPE = 1 UNION ALL SELECT SVR_IP AS SVR_IP, SVR_PORT AS SVR_PORT, TENANT_ID AS TENANT_ID, TRANS_ID AS TRANS_ID, 'TR' AS TYPE, TABLET_ID AS ID1, CONCAT(CONCAT(HOLDER_TRANS_ID, '-'), ROWKEY) AS ID2, 'NONE' AS LMODE, LOCK_MODE AS REQUEST, TIME_AFTER_RECV AS CTIME, 1 AS BLOCK FROM oceanbase.__ALL_VIRTUAL_LOCK_WAIT_STAT WHERE TYPE = 2 UNION ALL SELECT SVR_IP AS SVR_IP, SVR_PORT AS SVR_PORT, TENANT_ID AS TENANT_ID, TRANS_ID AS TRANS_ID, 'TR' AS TYPE, TABLET_ID AS ID1, CONCAT(CONCAT(TRANS_ID, '-'), ROWKEY) AS ID2, 'X' AS LMODE, 'NONE' AS REQUEST, TIME_AFTER_RECV AS CTIME, 0 AS BLOCK FROM oceanbase.__ALL_VIRTUAL_TRANS_LOCK_STAT WHERE ROWKEY IS NOT NULL AND ROWKEY <> '' UNION ALL SELECT SVR_IP AS SVR_IP, SVR_PORT AS SVR_PORT, TENANT_ID AS TENANT_ID, TRANS_ID AS TRANS_ID, 'TX' AS TYPE, TRANS_ID AS ID1, NULL AS ID2, 'X' AS LMODE, 'NONE' AS REQUEST, MIN(TIME_AFTER_RECV) AS CTIME, 0 AS BLOCK FROM oceanbase.__ALL_VIRTUAL_TRANS_LOCK_STAT GROUP BY SVR_IP, SVR_PORT, TENANT_ID, TRANS_ID UNION ALL SELECT OBJ_LOCK.SVR_IP AS SVR_IP, OBJ_LOCK.SVR_PORT AS SVR_PORT, OBJ_LOCK.TENANT_ID AS TENANT_ID, OBJ_LOCK.CREATE_TRANS_ID AS TRANS_ID, CASE WHEN OBJ_LOCK.OBJ_TYPE IN ('TABLE', 'TABLET') THEN 'TM' WHEN OBJ_LOCK.OBJ_TYPE = 'DBMS_LOCK' THEN 'UL' ELSE 'UNKONWN' END AS TYPE, OBJ_LOCK.OBJ_ID AS ID1, NULL AS ID2, OBJ_LOCK.LOCK_MODE AS LMODE, 'NONE' AS REQUEST, OBJ_LOCK.TIME_AFTER_CREATE AS CTIME, 0 AS BLOCK FROM oceanbase.__ALL_VIRTUAL_OBJ_LOCK AS OBJ_LOCK INNER JOIN oceanbase.__ALL_VIRTUAL_LS_INFO AS LS_INFO ON OBJ_LOCK.SVR_IP = LS_INFO.SVR_IP AND OBJ_LOCK.SVR_PORT = LS_INFO.SVR_PORT AND OBJ_LOCK.TENANT_ID = LS_INFO.TENANT_ID AND OBJ_LOCK.LS_ID = LS_INFO.LS_ID WHERE OBJ_LOCK.OBJ_TYPE IN ('TABLE', 'TABLET', 'DBMS_LOCK') AND OBJ_LOCK.EXTRA_INFO LIKE '%tx_ctx%' AND LS_INFO.LS_STATE = 'LEADER' )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT SVR_IP AS SVR_IP, SVR_PORT AS SVR_PORT, TENANT_ID AS TENANT_ID, TRANS_ID AS TRANS_ID, SESSION_ID AS SESSION_ID, CASE WHEN TYPE = 1 THEN 'TR' WHEN TYPE = 2 THEN 'TX' WHEN TYPE = 3 THEN 'TM' ELSE 'UNDEFINED' END AS TYPE, HOLDER_TRANS_ID AS ID1, HOLDER_SESSION_ID AS ID2, CASE WHEN TYPE = 1 THEN CONCAT(CONCAT(TABLET_ID, '-'), ROWKEY) WHEN TYPE = 2 OR TYPE = 3 THEN NULL ELSE 'ERROR' END AS ID3, 'NONE' AS LMODE, LOCK_MODE AS REQUEST, TIME_AFTER_RECV AS CTIME, 1 AS BLOCK FROM oceanbase.__ALL_VIRTUAL_LOCK_WAIT_STAT UNION ALL SELECT SVR_IP AS SVR_IP, SVR_PORT AS SVR_PORT, TENANT_ID AS TENANT_ID, TRANS_ID AS TRANS_ID, SESSION_ID AS SESSION_ID, 'TR' AS TYPE, TRANS_ID AS ID1, SESSION_ID AS ID2, CONCAT(CONCAT(TABLET_ID, '-'), ROWKEY) AS ID3, 'X' AS LMODE, 'NONE' AS REQUEST, TIME_AFTER_RECV AS CTIME, 0 AS BLOCK FROM oceanbase.__ALL_VIRTUAL_TRANS_LOCK_STAT WHERE ROWKEY IS NOT NULL AND ROWKEY <> '' UNION ALL SELECT SVR_IP AS SVR_IP, SVR_PORT AS SVR_PORT, TENANT_ID AS TENANT_ID, TRANS_ID AS TRANS_ID, SESSION_ID AS SESSION_ID, 'TX' AS TYPE, TRANS_ID AS ID1, SESSION_ID AS ID2, NULL AS ID3, 'X' AS LMODE, 'NONE' AS REQUEST, MIN(TIME_AFTER_RECV) AS CTIME, 0 AS BLOCK FROM oceanbase.__ALL_VIRTUAL_TRANS_LOCK_STAT GROUP BY SVR_IP, SVR_PORT, TENANT_ID, TRANS_ID, SESSION_ID UNION ALL SELECT OBJ_LOCK.SVR_IP AS SVR_IP, OBJ_LOCK.SVR_PORT AS SVR_PORT, OBJ_LOCK.TENANT_ID AS TENANT_ID, OBJ_LOCK.CREATE_TRANS_ID AS TRANS_ID, TRX_PART.SESSION_ID AS SESSION_ID, CASE WHEN OBJ_LOCK.OBJ_TYPE IN ('TABLE', 'TABLET') THEN 'TM' WHEN OBJ_LOCK.OBJ_TYPE = 'DBMS_LOCK' THEN 'UL' ELSE 'UNKONWN' END AS TYPE, OBJ_LOCK.CREATE_TRANS_ID AS ID1, TRX_PART.SESSION_ID AS ID2, OBJ_LOCK.OBJ_ID AS ID3, OBJ_LOCK.LOCK_MODE AS LMODE, 'NONE' AS REQUEST, OBJ_LOCK.TIME_AFTER_CREATE AS CTIME, 0 AS BLOCK FROM oceanbase.__ALL_VIRTUAL_OBJ_LOCK AS OBJ_LOCK LEFT JOIN oceanbase.GV$OB_TRANSACTION_PARTICIPANTS TRX_PART ON TRX_PART.TENANT_ID = OBJ_LOCK.TENANT_ID AND TRX_PART.LS_ID = OBJ_LOCK.LS_ID AND TRX_PART.TX_ID = OBJ_LOCK.CREATE_TRANS_ID INNER JOIN oceanbase.__ALL_VIRTUAL_LS_INFO AS LS_INFO ON OBJ_LOCK.SVR_IP = LS_INFO.SVR_IP AND OBJ_LOCK.SVR_PORT = LS_INFO.SVR_PORT AND OBJ_LOCK.TENANT_ID = LS_INFO.TENANT_ID AND OBJ_LOCK.LS_ID = LS_INFO.LS_ID WHERE OBJ_LOCK.OBJ_TYPE IN ('TABLE', 'TABLET', 'DBMS_LOCK') AND OBJ_LOCK.EXTRA_INFO LIKE '%tx_ctx%' AND LS_INFO.LS_STATE = 'LEADER' )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } diff --git a/src/share/inner_table/ob_inner_table_schema.21401_21450.cpp b/src/share/inner_table/ob_inner_table_schema.21401_21450.cpp index 446971d8e2..ba5f9e4e5e 100644 --- a/src/share/inner_table/ob_inner_table_schema.21401_21450.cpp +++ b/src/share/inner_table/ob_inner_table_schema.21401_21450.cpp @@ -60,7 +60,7 @@ int ObInnerTableSchema::v_ob_locks_schema(ObTableSchema &table_schema) table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); if (OB_SUCC(ret)) { - if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT SVR_IP, SVR_PORT, TENANT_ID, TRANS_ID, TYPE, ID1, ID2, LMODE, REQUEST, CTIME, BLOCK FROM oceanbase.GV$OB_LOCKS WHERE SVR_IP = HOST_IP() AND SVR_PORT = RPC_PORT() )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT SVR_IP, SVR_PORT, TENANT_ID, TRANS_ID, SESSION_ID, TYPE, ID1, ID2, ID3, LMODE, REQUEST, CTIME, BLOCK FROM oceanbase.GV$OB_LOCKS WHERE SVR_IP = HOST_IP() AND SVR_PORT = RPC_PORT() )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } diff --git a/src/share/inner_table/ob_inner_table_schema.28151_28200.cpp b/src/share/inner_table/ob_inner_table_schema.28151_28200.cpp index ec6cf40659..30ff463c4c 100644 --- a/src/share/inner_table/ob_inner_table_schema.28151_28200.cpp +++ b/src/share/inner_table/ob_inner_table_schema.28151_28200.cpp @@ -710,7 +710,7 @@ int ObInnerTableSchema::gv_ob_locks_ora_schema(ObTableSchema &table_schema) table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); if (OB_SUCC(ret)) { - if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT SVR_IP AS SVR_IP, SVR_PORT AS SVR_PORT, TENANT_ID AS TENANT_ID, TRANS_ID AS TRANS_ID, CASE WHEN TYPE = 1 THEN 'TR' WHEN TYPE = 2 THEN 'TX' WHEN TYPE = 3 THEN 'TM' ELSE 'UNDEFINED' END AS TYPE, CASE WHEN TYPE = 1 THEN TABLET_ID WHEN TYPE = 2 THEN HOLDER_TRANS_ID WHEN TYPE = 3 THEN (SELECT DISTINCT OBJ_ID FROM SYS.ALL_VIRTUAL_OBJ_LOCK WHERE SYS.ALL_VIRTUAL_OBJ_LOCK.LOCK_ID = SYS.ALL_VIRTUAL_LOCK_WAIT_STAT.ROWKEY) ELSE -1 END AS ID1, CASE WHEN TYPE = 1 THEN CONCAT(CONCAT(HOLDER_TRANS_ID, '-'), ROWKEY) WHEN TYPE = 2 THEN NULL WHEN TYPE = 3 THEN NULL ELSE 'ERROR' END AS ID2, 'NONE' AS LMODE, LOCK_MODE AS REQUEST, TIME_AFTER_RECV AS CTIME, 1 AS BLOCK FROM SYS.ALL_VIRTUAL_LOCK_WAIT_STAT UNION ALL SELECT SVR_IP AS SVR_IP, SVR_PORT AS SVR_PORT, TENANT_ID AS TENANT_ID, TRANS_ID AS TRANS_ID, 'TX' AS TYPE, HOLDER_TRANS_ID AS ID1, NULL AS ID2, 'NONE' AS LMODE, LOCK_MODE AS REQUEST, TIME_AFTER_RECV AS CTIME, 1 AS BLOCK FROM SYS.ALL_VIRTUAL_LOCK_WAIT_STAT WHERE TYPE = 1 UNION ALL SELECT SVR_IP AS SVR_IP, SVR_PORT AS SVR_PORT, TENANT_ID AS TENANT_ID, TRANS_ID AS TRANS_ID, 'TR' AS TYPE, TABLET_ID AS ID1, CONCAT(CONCAT(HOLDER_TRANS_ID, '-'), ROWKEY) AS ID2, 'NONE' AS LMODE, LOCK_MODE AS REQUEST, TIME_AFTER_RECV AS CTIME, 1 AS BLOCK FROM SYS.ALL_VIRTUAL_LOCK_WAIT_STAT WHERE TYPE = 2 UNION ALL SELECT SVR_IP AS SVR_IP, SVR_PORT AS SVR_PORT, TENANT_ID AS TENANT_ID, TRANS_ID AS TRANS_ID, 'TR' AS TYPE, TABLET_ID AS ID1, CONCAT(CONCAT(TRANS_ID, '-'), ROWKEY) AS ID2, 'X' AS LMODE, 'NONE' AS REQUEST, TIME_AFTER_RECV AS CTIME, 0 AS BLOCK FROM SYS.ALL_VIRTUAL_TRANS_LOCK_STAT WHERE ROWKEY IS NOT NULL UNION ALL SELECT SVR_IP AS SVR_IP, SVR_PORT AS SVR_PORT, TENANT_ID AS TENANT_ID, TRANS_ID AS TRANS_ID, 'TX' AS TYPE, TRANS_ID AS ID1, NULL AS ID2, 'X' AS LMODE, 'NONE' AS REQUEST, MIN(TIME_AFTER_RECV) AS CTIME, 0 AS BLOCK FROM SYS.ALL_VIRTUAL_TRANS_LOCK_STAT GROUP BY SVR_IP, SVR_PORT, TENANT_ID, TRANS_ID UNION ALL SELECT OBJ_LOCK.SVR_IP AS SVR_IP, OBJ_LOCK.SVR_PORT AS SVR_PORT, OBJ_LOCK.TENANT_ID AS TENANT_ID, OBJ_LOCK.CREATE_TRANS_ID AS TRANS_ID, CASE WHEN OBJ_LOCK.OBJ_TYPE IN ('TABLE', 'TABLET') THEN 'TM' WHEN OBJ_LOCK.OBJ_TYPE = 'DBMS_LOCK' THEN 'UL' ELSE 'UNKOWN' END AS TYPE, OBJ_LOCK.OBJ_ID AS ID1, NULL AS ID2, OBJ_LOCK.LOCK_MODE AS LMODE, 'NONE' AS REQUEST, OBJ_LOCK.TIME_AFTER_CREATE AS CTIME, 0 AS BLOCK FROM SYS.ALL_VIRTUAL_OBJ_LOCK OBJ_LOCK INNER JOIN SYS.ALL_VIRTUAL_LS_INFO LS_INFO ON OBJ_LOCK.SVR_IP = LS_INFO.SVR_IP AND OBJ_LOCK.SVR_PORT = LS_INFO.SVR_PORT AND OBJ_LOCK.TENANT_ID = LS_INFO.TENANT_ID AND OBJ_LOCK.LS_ID = LS_INFO.LS_ID WHERE OBJ_LOCK.OBJ_TYPE IN ('TABLE', 'TABLET', 'DBMS_LOCK') AND OBJ_LOCK.EXTRA_INFO LIKE '%tx_ctx%' AND LS_INFO.LS_STATE = 'LEADER' )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT SVR_IP AS SVR_IP, SVR_PORT AS SVR_PORT, TENANT_ID AS TENANT_ID, TRANS_ID AS TRANS_ID, SESSION_ID AS SESSION_ID, CASE WHEN TYPE = 1 THEN 'TR' WHEN TYPE = 2 THEN 'TX' WHEN TYPE = 3 THEN 'TM' ELSE 'UNDEFINED' END AS TYPE, HOLDER_TRANS_ID AS ID1, HOLDER_SESSION_ID AS ID2, CASE WHEN TYPE = 1 THEN CONCAT(CONCAT(TABLET_ID, '-'), ROWKEY) WHEN TYPE = 2 OR TYPE = 3 THEN NULL ELSE 'ERROR' END AS ID3, 'NONE' AS LMODE, LOCK_MODE AS REQUEST, TIME_AFTER_RECV AS CTIME, 1 AS BLOCK FROM SYS.ALL_VIRTUAL_LOCK_WAIT_STAT UNION ALL SELECT SVR_IP AS SVR_IP, SVR_PORT AS SVR_PORT, TENANT_ID AS TENANT_ID, TRANS_ID AS TRANS_ID, SESSION_ID AS SESSION_ID, 'TR' AS TYPE, TRANS_ID AS ID1, SESSION_ID AS ID2, CONCAT(CONCAT(TABLET_ID, '-'), ROWKEY) AS ID3, 'X' AS LMODE, 'NONE' AS REQUEST, TIME_AFTER_RECV AS CTIME, 0 AS BLOCK FROM SYS.ALL_VIRTUAL_TRANS_LOCK_STAT WHERE ROWKEY IS NOT NULL UNION ALL SELECT SVR_IP AS SVR_IP, SVR_PORT AS SVR_PORT, TENANT_ID AS TENANT_ID, TRANS_ID AS TRANS_ID, SESSION_ID AS SESSION_ID, 'TX' AS TYPE, TRANS_ID AS ID1, SESSION_ID AS ID2, NULL AS ID3, 'X' AS LMODE, 'NONE' AS REQUEST, MIN(TIME_AFTER_RECV) AS CTIME, 0 AS BLOCK FROM SYS.ALL_VIRTUAL_TRANS_LOCK_STAT GROUP BY SVR_IP, SVR_PORT, TENANT_ID, TRANS_ID, SESSION_ID UNION ALL SELECT OBJ_LOCK.SVR_IP AS SVR_IP, OBJ_LOCK.SVR_PORT AS SVR_PORT, OBJ_LOCK.TENANT_ID AS TENANT_ID, OBJ_LOCK.CREATE_TRANS_ID AS TRANS_ID, TRX_PART.SESSION_ID AS SESSION_ID, CASE WHEN OBJ_LOCK.OBJ_TYPE IN ('TABLE', 'TABLET') THEN 'TM' WHEN OBJ_LOCK.OBJ_TYPE = 'DBMS_LOCK' THEN 'UL' ELSE 'UNKOWN' END AS TYPE, OBJ_LOCK.CREATE_TRANS_ID AS ID1, TRX_PART.SESSION_ID AS ID2, CAST(OBJ_LOCK.OBJ_ID AS VARCHAR2(32)) AS ID3, OBJ_LOCK.LOCK_MODE AS LMODE, 'NONE' AS REQUEST, OBJ_LOCK.TIME_AFTER_CREATE AS CTIME, 0 AS BLOCK FROM SYS.ALL_VIRTUAL_OBJ_LOCK OBJ_LOCK LEFT JOIN SYS.GV$OB_TRANSACTION_PARTICIPANTS TRX_PART ON TRX_PART.TENANT_ID = OBJ_LOCK.TENANT_ID AND TRX_PART.LS_ID = OBJ_LOCK.LS_ID AND TRX_PART.TX_ID = OBJ_LOCK.CREATE_TRANS_ID INNER JOIN SYS.ALL_VIRTUAL_LS_INFO LS_INFO ON OBJ_LOCK.SVR_IP = LS_INFO.SVR_IP AND OBJ_LOCK.SVR_PORT = LS_INFO.SVR_PORT AND OBJ_LOCK.TENANT_ID = LS_INFO.TENANT_ID AND OBJ_LOCK.LS_ID = LS_INFO.LS_ID WHERE OBJ_LOCK.OBJ_TYPE IN ('TABLE', 'TABLET', 'DBMS_LOCK') AND OBJ_LOCK.EXTRA_INFO LIKE '%tx_ctx%' AND LS_INFO.LS_STATE = 'LEADER' )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } @@ -760,7 +760,7 @@ int ObInnerTableSchema::v_ob_locks_ora_schema(ObTableSchema &table_schema) table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); if (OB_SUCC(ret)) { - if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT SVR_IP, SVR_PORT, TENANT_ID, TRANS_ID, TYPE, ID1, ID2, LMODE, REQUEST, CTIME, BLOCK FROM SYS.GV$OB_LOCKS WHERE SVR_IP = HOST_IP() AND SVR_PORT = RPC_PORT() )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT SVR_IP, SVR_PORT, TENANT_ID, TRANS_ID, SESSION_ID, TYPE, ID1, ID2, ID3, LMODE, REQUEST, CTIME, BLOCK FROM SYS.GV$OB_LOCKS WHERE SVR_IP = HOST_IP() AND SVR_PORT = RPC_PORT() )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } diff --git a/src/share/inner_table/ob_inner_table_schema_def.py b/src/share/inner_table/ob_inner_table_schema_def.py index 6f237ca524..d9716f2ecb 100644 --- a/src/share/inner_table/ob_inner_table_schema_def.py +++ b/src/share/inner_table/ob_inner_table_schema_def.py @@ -10165,6 +10165,7 @@ def_table_schema( ('try_lock_times', 'int'), ('time_after_recv', 'int'), ('session_id', 'int'), + ('holder_session_id', 'int'), ('block_session_id', 'int'), ('type', 'int'), ('lock_mode', 'varchar:MAX_LOCK_MODE_BUF_LENGTH'), @@ -30864,20 +30865,18 @@ def_table_schema( SVR_PORT AS SVR_PORT, TENANT_ID AS TENANT_ID, TRANS_ID AS TRANS_ID, + SESSION_ID AS SESSION_ID, CASE WHEN TYPE = 1 THEN 'TR' WHEN TYPE = 2 THEN 'TX' WHEN TYPE = 3 THEN 'TM' ELSE 'UNDEFINED' END AS TYPE, - CASE WHEN TYPE = 1 THEN TABLET_ID - WHEN TYPE = 2 THEN HOLDER_TRANS_ID - WHEN TYPE = 3 THEN (SELECT DISTINCT OBJ_ID FROM oceanbase.__ALL_VIRTUAL_OBJ_LOCK WHERE oceanbase.__ALL_VIRTUAL_OBJ_LOCK.LOCK_ID = oceanbase.__ALL_VIRTUAL_LOCK_WAIT_STAT.ROWKEY) - ELSE -1 END - AS ID1, - CASE WHEN TYPE = 1 THEN CONCAT(CONCAT(HOLDER_TRANS_ID, '-'), ROWKEY) + HOLDER_TRANS_ID AS ID1, + HOLDER_SESSION_ID AS ID2, + CASE WHEN TYPE = 1 THEN CONCAT(CONCAT(TABLET_ID, '-'), ROWKEY) WHEN TYPE = 2 OR TYPE = 3 THEN NULL ELSE 'ERROR' END - AS ID2, + AS ID3, 'NONE' AS LMODE, LOCK_MODE AS REQUEST, TIME_AFTER_RECV AS CTIME, @@ -30892,45 +30891,11 @@ def_table_schema( SVR_PORT AS SVR_PORT, TENANT_ID AS TENANT_ID, TRANS_ID AS TRANS_ID, - 'TX' AS TYPE, - HOLDER_TRANS_ID AS ID1, - NULL AS ID2, - 'NONE' AS LMODE, - LOCK_MODE AS REQUEST, - TIME_AFTER_RECV AS CTIME, - 1 AS BLOCK - FROM - oceanbase.__ALL_VIRTUAL_LOCK_WAIT_STAT - WHERE TYPE = 1 - - UNION ALL - - SELECT - SVR_IP AS SVR_IP, - SVR_PORT AS SVR_PORT, - TENANT_ID AS TENANT_ID, - TRANS_ID AS TRANS_ID, + SESSION_ID AS SESSION_ID, 'TR' AS TYPE, - TABLET_ID AS ID1, - CONCAT(CONCAT(HOLDER_TRANS_ID, '-'), ROWKEY) AS ID2, - 'NONE' AS LMODE, - LOCK_MODE AS REQUEST, - TIME_AFTER_RECV AS CTIME, - 1 AS BLOCK - FROM - oceanbase.__ALL_VIRTUAL_LOCK_WAIT_STAT - WHERE TYPE = 2 - - UNION ALL - - SELECT - SVR_IP AS SVR_IP, - SVR_PORT AS SVR_PORT, - TENANT_ID AS TENANT_ID, - TRANS_ID AS TRANS_ID, - 'TR' AS TYPE, - TABLET_ID AS ID1, - CONCAT(CONCAT(TRANS_ID, '-'), ROWKEY) AS ID2, + TRANS_ID AS ID1, + SESSION_ID AS ID2, + CONCAT(CONCAT(TABLET_ID, '-'), ROWKEY) AS ID3, 'X' AS LMODE, 'NONE' AS REQUEST, TIME_AFTER_RECV AS CTIME, @@ -30946,16 +30911,18 @@ def_table_schema( SVR_PORT AS SVR_PORT, TENANT_ID AS TENANT_ID, TRANS_ID AS TRANS_ID, + SESSION_ID AS SESSION_ID, 'TX' AS TYPE, TRANS_ID AS ID1, - NULL AS ID2, + SESSION_ID AS ID2, + NULL AS ID3, 'X' AS LMODE, 'NONE' AS REQUEST, MIN(TIME_AFTER_RECV) AS CTIME, 0 AS BLOCK FROM oceanbase.__ALL_VIRTUAL_TRANS_LOCK_STAT - GROUP BY SVR_IP, SVR_PORT, TENANT_ID, TRANS_ID + GROUP BY SVR_IP, SVR_PORT, TENANT_ID, TRANS_ID, SESSION_ID UNION ALL @@ -30964,18 +30931,26 @@ def_table_schema( OBJ_LOCK.SVR_PORT AS SVR_PORT, OBJ_LOCK.TENANT_ID AS TENANT_ID, OBJ_LOCK.CREATE_TRANS_ID AS TRANS_ID, + TRX_PART.SESSION_ID AS SESSION_ID, CASE WHEN OBJ_LOCK.OBJ_TYPE IN ('TABLE', 'TABLET') THEN 'TM' WHEN OBJ_LOCK.OBJ_TYPE = 'DBMS_LOCK' THEN 'UL' ELSE 'UNKONWN' END AS TYPE, - OBJ_LOCK.OBJ_ID AS ID1, - NULL AS ID2, + OBJ_LOCK.CREATE_TRANS_ID AS ID1, + TRX_PART.SESSION_ID AS ID2, + OBJ_LOCK.OBJ_ID AS ID3, OBJ_LOCK.LOCK_MODE AS LMODE, 'NONE' AS REQUEST, OBJ_LOCK.TIME_AFTER_CREATE AS CTIME, 0 AS BLOCK FROM oceanbase.__ALL_VIRTUAL_OBJ_LOCK AS OBJ_LOCK + LEFT JOIN + oceanbase.GV$OB_TRANSACTION_PARTICIPANTS TRX_PART + ON + TRX_PART.TENANT_ID = OBJ_LOCK.TENANT_ID AND + TRX_PART.LS_ID = OBJ_LOCK.LS_ID AND + TRX_PART.TX_ID = OBJ_LOCK.CREATE_TRANS_ID INNER JOIN oceanbase.__ALL_VIRTUAL_LS_INFO AS LS_INFO ON @@ -31003,9 +30978,11 @@ def_table_schema( SVR_PORT, TENANT_ID, TRANS_ID, + SESSION_ID, TYPE, ID1, ID2, + ID3, LMODE, REQUEST, CTIME, @@ -61649,45 +61626,24 @@ SELECT SVR_PORT AS SVR_PORT, TENANT_ID AS TENANT_ID, TRANS_ID AS TRANS_ID, + SESSION_ID AS SESSION_ID, CASE WHEN TYPE = 1 THEN 'TR' WHEN TYPE = 2 THEN 'TX' WHEN TYPE = 3 THEN 'TM' ELSE 'UNDEFINED' END AS TYPE, - CASE WHEN TYPE = 1 THEN TABLET_ID - WHEN TYPE = 2 THEN HOLDER_TRANS_ID - WHEN TYPE = 3 THEN (SELECT DISTINCT OBJ_ID FROM SYS.ALL_VIRTUAL_OBJ_LOCK WHERE SYS.ALL_VIRTUAL_OBJ_LOCK.LOCK_ID = SYS.ALL_VIRTUAL_LOCK_WAIT_STAT.ROWKEY) - ELSE -1 END - AS ID1, - CASE WHEN TYPE = 1 THEN CONCAT(CONCAT(HOLDER_TRANS_ID, '-'), ROWKEY) - WHEN TYPE = 2 THEN NULL - WHEN TYPE = 3 THEN NULL - ELSE 'ERROR' END - AS ID2, - 'NONE' AS LMODE, - LOCK_MODE AS REQUEST, - TIME_AFTER_RECV AS CTIME, - 1 AS BLOCK -FROM - SYS.ALL_VIRTUAL_LOCK_WAIT_STAT - -UNION ALL - -SELECT - SVR_IP AS SVR_IP, - SVR_PORT AS SVR_PORT, - TENANT_ID AS TENANT_ID, - TRANS_ID AS TRANS_ID, - 'TX' AS TYPE, HOLDER_TRANS_ID AS ID1, - NULL AS ID2, + HOLDER_SESSION_ID AS ID2, + CASE WHEN TYPE = 1 THEN CONCAT(CONCAT(TABLET_ID, '-'), ROWKEY) + WHEN TYPE = 2 OR TYPE = 3 THEN NULL + ELSE 'ERROR' END + AS ID3, 'NONE' AS LMODE, LOCK_MODE AS REQUEST, TIME_AFTER_RECV AS CTIME, 1 AS BLOCK FROM SYS.ALL_VIRTUAL_LOCK_WAIT_STAT -WHERE TYPE = 1 UNION ALL @@ -61696,27 +61652,11 @@ SELECT SVR_PORT AS SVR_PORT, TENANT_ID AS TENANT_ID, TRANS_ID AS TRANS_ID, + SESSION_ID AS SESSION_ID, 'TR' AS TYPE, - TABLET_ID AS ID1, - CONCAT(CONCAT(HOLDER_TRANS_ID, '-'), ROWKEY) AS ID2, - 'NONE' AS LMODE, - LOCK_MODE AS REQUEST, - TIME_AFTER_RECV AS CTIME, - 1 AS BLOCK -FROM - SYS.ALL_VIRTUAL_LOCK_WAIT_STAT -WHERE TYPE = 2 - -UNION ALL - -SELECT - SVR_IP AS SVR_IP, - SVR_PORT AS SVR_PORT, - TENANT_ID AS TENANT_ID, - TRANS_ID AS TRANS_ID, - 'TR' AS TYPE, - TABLET_ID AS ID1, - CONCAT(CONCAT(TRANS_ID, '-'), ROWKEY) AS ID2, + TRANS_ID AS ID1, + SESSION_ID AS ID2, + CONCAT(CONCAT(TABLET_ID, '-'), ROWKEY) AS ID3, 'X' AS LMODE, 'NONE' AS REQUEST, TIME_AFTER_RECV AS CTIME, @@ -61732,16 +61672,18 @@ SELECT SVR_PORT AS SVR_PORT, TENANT_ID AS TENANT_ID, TRANS_ID AS TRANS_ID, + SESSION_ID AS SESSION_ID, 'TX' AS TYPE, TRANS_ID AS ID1, - NULL AS ID2, + SESSION_ID AS ID2, + NULL AS ID3, 'X' AS LMODE, 'NONE' AS REQUEST, MIN(TIME_AFTER_RECV) AS CTIME, 0 AS BLOCK FROM SYS.ALL_VIRTUAL_TRANS_LOCK_STAT -GROUP BY SVR_IP, SVR_PORT, TENANT_ID, TRANS_ID +GROUP BY SVR_IP, SVR_PORT, TENANT_ID, TRANS_ID, SESSION_ID UNION ALL @@ -61750,18 +61692,26 @@ SELECT OBJ_LOCK.SVR_PORT AS SVR_PORT, OBJ_LOCK.TENANT_ID AS TENANT_ID, OBJ_LOCK.CREATE_TRANS_ID AS TRANS_ID, + TRX_PART.SESSION_ID AS SESSION_ID, CASE WHEN OBJ_LOCK.OBJ_TYPE IN ('TABLE', 'TABLET') THEN 'TM' WHEN OBJ_LOCK.OBJ_TYPE = 'DBMS_LOCK' THEN 'UL' ELSE 'UNKOWN' END AS TYPE, - OBJ_LOCK.OBJ_ID AS ID1, - NULL AS ID2, + OBJ_LOCK.CREATE_TRANS_ID AS ID1, + TRX_PART.SESSION_ID AS ID2, + CAST(OBJ_LOCK.OBJ_ID AS VARCHAR2(32)) AS ID3, OBJ_LOCK.LOCK_MODE AS LMODE, 'NONE' AS REQUEST, OBJ_LOCK.TIME_AFTER_CREATE AS CTIME, 0 AS BLOCK FROM SYS.ALL_VIRTUAL_OBJ_LOCK OBJ_LOCK +LEFT JOIN + SYS.GV$OB_TRANSACTION_PARTICIPANTS TRX_PART +ON + TRX_PART.TENANT_ID = OBJ_LOCK.TENANT_ID AND + TRX_PART.LS_ID = OBJ_LOCK.LS_ID AND + TRX_PART.TX_ID = OBJ_LOCK.CREATE_TRANS_ID INNER JOIN SYS.ALL_VIRTUAL_LS_INFO LS_INFO ON @@ -61789,15 +61739,17 @@ SELECT SVR_IP, SVR_PORT, TENANT_ID, TRANS_ID, + SESSION_ID, TYPE, ID1, ID2, + ID3, LMODE, REQUEST, CTIME, BLOCK - FROM SYS.GV$OB_LOCKS - WHERE SVR_IP = HOST_IP() AND SVR_PORT = RPC_PORT() +FROM SYS.GV$OB_LOCKS +WHERE SVR_IP = HOST_IP() AND SVR_PORT = RPC_PORT() """.replace("\n", " "), ) diff --git a/src/storage/memtable/ob_lock_wait_mgr.cpp b/src/storage/memtable/ob_lock_wait_mgr.cpp index a9f2c08a7f..902c2fa8de 100644 --- a/src/storage/memtable/ob_lock_wait_mgr.cpp +++ b/src/storage/memtable/ob_lock_wait_mgr.cpp @@ -574,14 +574,16 @@ void ObLockWaitMgr::delay_header_node_run_ts(const uint64_t hash) int ObLockWaitMgr::post_lock(const int tmp_ret, const ObTabletID &tablet_id, - const ObStoreRowkey& row_key, + const ObStoreRowkey &row_key, const int64_t timeout, const bool is_remote_sql, const int64_t last_compact_cnt, const int64_t total_trans_node_cnt, + const uint32_t sess_id, const ObTransID &tx_id, const ObTransID &holder_tx_id, - ObFunction &rechecker) + const ObLSID &ls_id, + ObFunction &rechecker) { int ret = OB_SUCCESS; Node *node = NULL; @@ -604,17 +606,29 @@ int ObLockWaitMgr::post_lock(const int tmp_ret, if (is_remote_sql) { delay_header_node_run_ts(hash); } - node->set((void*)node, - hash, - wait_on_row ? row_lock_seq : tx_lock_seq, - timeout, - tablet_id.id(), - last_compact_cnt, - total_trans_node_cnt, - to_cstring(row_key),// just for virtual table display - tx_id, - holder_tx_id); - node->set_need_wait(); + transaction::ObTransService *tx_service = nullptr; + uint32_t holder_session_id = sql::ObSQLSessionInfo::INVALID_SESSID; + if (OB_ISNULL(tx_service = MTL(transaction::ObTransService *))) { + ret = OB_ERR_UNEXPECTED; + TRANS_LOG(ERROR, "ObTransService is null", K(sess_id), K(tx_id), K(holder_tx_id), K(ls_id)); + } else if (OB_FAIL(tx_service->get_trans_start_session_id(ls_id, holder_tx_id, holder_session_id))) { + TRANS_LOG(WARN, "get transaction start session_id failed", K(sess_id), K(tx_id), K(holder_tx_id), K(ls_id)); + } else { + node->set((void *)node, + hash, + wait_on_row ? row_lock_seq : tx_lock_seq, + timeout, + tablet_id.id(), + last_compact_cnt, + total_trans_node_cnt, + to_cstring(row_key), // just for virtual table display + sess_id, + holder_session_id, + tx_id, + holder_tx_id, + ls_id); + node->set_need_wait(); + } } } } @@ -629,9 +643,11 @@ int ObLockWaitMgr::post_lock(const int tmp_ret, const bool is_remote_sql, const int64_t last_compact_cnt, const int64_t total_trans_node_cnt, + const uint32_t sess_id, const transaction::ObTransID &tx_id, const transaction::ObTransID &holder_tx_id, const ObTableLockMode &lock_mode, + const ObLSID &ls_id, ObFunction &check_need_wait) { int ret = OB_SUCCESS; @@ -659,18 +675,30 @@ int ObLockWaitMgr::post_lock(const int tmp_ret, if (OB_FAIL(check_need_wait(need_wait))) { TRANS_LOG(WARN, "check need wait failed", K(ret)); } else if (need_wait) { - node->set((void*)node, - hash, - lock_seq, - timeout, - tablet_id.id(), - last_compact_cnt, - total_trans_node_cnt, - lock_id_buf, // just for virtual table display - tx_id, - holder_tx_id); - node->set_need_wait(); - node->set_lock_mode(lock_mode); + transaction::ObTransService *tx_service = nullptr; + uint32_t holder_session_id = sql::ObSQLSessionInfo::INVALID_SESSID; + if (OB_ISNULL(tx_service = MTL(transaction::ObTransService *))) { + ret = OB_ERR_UNEXPECTED; + TRANS_LOG(ERROR, "ObTransService is null", K(sess_id), K(tx_id), K(holder_tx_id), K(ls_id)); + } else if (OB_FAIL(tx_service->get_trans_start_session_id(ls_id, holder_tx_id, holder_session_id))) { + TRANS_LOG(WARN, "get transaction start session_id failed", K(sess_id), K(tx_id), K(holder_tx_id), K(ls_id)); + } else { + node->set((void*)node, + hash, + lock_seq, + timeout, + tablet_id.id(), + last_compact_cnt, + total_trans_node_cnt, + lock_id_buf, // just for virtual table display + sess_id, + holder_session_id, + tx_id, + holder_tx_id, + ls_id); + node->set_need_wait(); + node->set_lock_mode(lock_mode); + } } } return ret; diff --git a/src/storage/memtable/ob_lock_wait_mgr.h b/src/storage/memtable/ob_lock_wait_mgr.h index 10d2f612d4..2cb796cb1e 100644 --- a/src/storage/memtable/ob_lock_wait_mgr.h +++ b/src/storage/memtable/ob_lock_wait_mgr.h @@ -237,9 +237,11 @@ public: const bool is_remote_sql, const int64_t last_compact_cnt, const int64_t total_trans_node_cnt, + const uint32_t sess_id, const transaction::ObTransID &tx_id, const transaction::ObTransID &holder_tx_id, - ObFunction &rechecker); + const ObLSID &ls_id, + ObFunction &rechecker); int post_lock(const int tmp_ret, const ObTabletID &tablet_id, const transaction::tablelock::ObLockID &lock_id, @@ -247,9 +249,11 @@ public: const bool is_remote_sql, const int64_t last_compact_cnt, const int64_t total_trans_node_cnt, + const uint32_t sess_id, const transaction::ObTransID &tx_id, const transaction::ObTransID &holder_tx_id, const transaction::tablelock::ObTableLockMode &lock_mode, + const ObLSID &ls_id, ObFunction &check_need_wait); // when removing the callbacks of uncommitted transaction, we need transfer // the conflict dependency from rows to transactions diff --git a/src/storage/memtable/ob_memtable.cpp b/src/storage/memtable/ob_memtable.cpp index 17287421d1..8605e6c58f 100644 --- a/src/storage/memtable/ob_memtable.cpp +++ b/src/storage/memtable/ob_memtable.cpp @@ -3036,8 +3036,10 @@ int ObMemtable::post_row_write_conflict_(ObMvccAccessCtx &acc_ctx, remote_tx, last_compact_cnt, total_trans_node_cnt, + acc_ctx.tx_desc_->get_assoc_session_id(), tx_id, conflict_tx_id, + get_ls_id(), recheck_func); if (OB_SUCCESS != tmp_ret) { TRANS_LOG(WARN, "post_lock after tx conflict failed", diff --git a/src/storage/memtable/ob_row_conflict_handler.cpp b/src/storage/memtable/ob_row_conflict_handler.cpp index fdf89f3c9d..05dcedc59f 100644 --- a/src/storage/memtable/ob_row_conflict_handler.cpp +++ b/src/storage/memtable/ob_row_conflict_handler.cpp @@ -331,8 +331,10 @@ int ObRowConflictHandler::post_row_read_conflict(ObMvccAccessCtx &acc_ctx, remote_tx, last_compact_cnt, total_trans_node_cnt, + tx_desc->get_assoc_session_id(), tx_id, conflict_tx_id, + ls_id, recheck_func); if (OB_SUCCESS != tmp_ret) { TRANS_LOG(WARN, "post_lock after tx conflict failed", diff --git a/src/storage/tablelock/ob_lock_memtable.cpp b/src/storage/tablelock/ob_lock_memtable.cpp index 42a909c82c..d521782880 100644 --- a/src/storage/tablelock/ob_lock_memtable.cpp +++ b/src/storage/tablelock/ob_lock_memtable.cpp @@ -471,16 +471,18 @@ int ObLockMemtable::post_obj_lock_conflict_(ObMvccAccessCtx &acc_ctx, // TODO: one thread only can wait at one lock now. // this may be not enough. if (OB_TMP_FAIL(lock_wait_mgr->post_lock(OB_TRY_LOCK_ROW_CONFLICT, - LS_LOCK_TABLET, - lock_id, - lock_wait_expire_ts, - remote_tx, - -1, - -1, // total_trans_node_cnt - tx_id, - conflict_tx_id, - lock_mode, - recheck_f))) { + LS_LOCK_TABLET, + lock_id, + lock_wait_expire_ts, + remote_tx, + -1, + -1, // total_trans_node_cnt + acc_ctx.tx_desc_->get_assoc_session_id(), + tx_id, + conflict_tx_id, + lock_mode, + ls_id_, + recheck_f))) { LOG_WARN("post_lock after tx conflict failed", K(tmp_ret), K(tx_id), K(conflict_tx_id)); } diff --git a/src/storage/tx/ob_trans_define_v4.h b/src/storage/tx/ob_trans_define_v4.h index d8f0462344..f1d4160538 100644 --- a/src/storage/tx/ob_trans_define_v4.h +++ b/src/storage/tx/ob_trans_define_v4.h @@ -689,6 +689,7 @@ public: void set_cluster_id(uint64_t cluster_id) { cluster_id_ = cluster_id; } uint64_t get_cluster_id() const { return cluster_id_; } uint32_t get_session_id() const { return sess_id_; } + uint32_t get_assoc_session_id() const { return assoc_sess_id_; } ObAddr get_addr() const { return addr_; } uint64_t get_cluster_version() const { return cluster_version_; } ObTxConsistencyType get_tx_consistency_type() const { return tx_consistency_type_; } diff --git a/src/storage/tx/ob_trans_part_ctx.h b/src/storage/tx/ob_trans_part_ctx.h index 0cf8d5280b..319c1451ea 100644 --- a/src/storage/tx/ob_trans_part_ctx.h +++ b/src/storage/tx/ob_trans_part_ctx.h @@ -268,6 +268,7 @@ public: bool is_table_lock_killed() const; share::ObLSID get_ls_id() const { return ls_id_; } + uint32_t get_session_id() const { return session_id_; } // for elr bool is_can_elr() const { return can_elr_; } diff --git a/src/storage/tx/ob_trans_service.cpp b/src/storage/tx/ob_trans_service.cpp index 76c0956fa0..b96e1c108e 100644 --- a/src/storage/tx/ob_trans_service.cpp +++ b/src/storage/tx/ob_trans_service.cpp @@ -439,6 +439,28 @@ int ObTransService::iterate_trans_memory_stat(ObTransMemStatIterator &mem_stat_i return ret; } +int ObTransService::get_trans_start_session_id(const share::ObLSID &ls_id, const ObTransID &tx_id, uint32_t &session_id) +{ + int ret = OB_SUCCESS; + transaction::ObPartTransCtx *part_ctx = nullptr; + if (IS_NOT_INIT) { + TRANS_LOG(WARN, "ObTransService not inited"); + ret = OB_NOT_INIT; + } else if (OB_UNLIKELY(!is_running_)) { + TRANS_LOG(WARN, "ObTransService is not running"); + ret = OB_NOT_RUNNING; + } else if (OB_FAIL(tx_ctx_mgr_.get_tx_ctx(ls_id, tx_id, false, part_ctx))) { + TRANS_LOG(WARN, "get ObPartTransCtx by ls_id and tx_id failed", K(ls_id), K(tx_id)); + } else if (OB_ISNULL(part_ctx)) { + ret = OB_ERR_UNEXPECTED; + TRANS_LOG(WARN, "ObPartTransCtx is null", K(ls_id), K(tx_id)); + } else { + session_id = part_ctx->get_session_id(); + tx_ctx_mgr_.revert_tx_ctx(part_ctx); + } + + return ret; +} int ObTransService::end_1pc_trans(ObTxDesc &trans_desc, ObITxCallback *endTransCb, diff --git a/src/storage/tx/ob_trans_service.h b/src/storage/tx/ob_trans_service.h index 7453ede85d..468c0aa675 100644 --- a/src/storage/tx/ob_trans_service.h +++ b/src/storage/tx/ob_trans_service.h @@ -203,6 +203,7 @@ public: int check_dup_table_lease_valid(const share::ObLSID ls_id, bool &is_dup_ls, bool &is_lease_valid); //get the memory used condition of transaction module int iterate_trans_memory_stat(ObTransMemStatIterator &mem_stat_iter); + int get_trans_start_session_id(const share::ObLSID &ls_id, const ObTransID &tx_id, uint32_t &session_id); int dump_elr_statistic(); int remove_callback_for_uncommited_txn( const share::ObLSID ls_id, diff --git a/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/desc_sys_views_in_mysql.result b/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/desc_sys_views_in_mysql.result index d422706e3c..b7eed71fb1 100644 --- a/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/desc_sys_views_in_mysql.result +++ b/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/desc_sys_views_in_mysql.result @@ -5135,9 +5135,11 @@ SVR_IP varchar(46) NO NULL SVR_PORT bigint(20) NO NULL TENANT_ID bigint(20) NO NULL TRANS_ID bigint(20) NO NULL +SESSION_ID bigint(20) NO NULL TYPE varchar(9) NO ID1 bigint(20) NO NULL -ID2 varchar(533) NO +ID2 bigint(20) NO NULL +ID3 varchar(533) NO LMODE varchar(4) NO REQUEST varchar(8) NO NULL CTIME bigint(20) NO NULL @@ -5151,9 +5153,11 @@ SVR_IP varchar(46) NO SVR_PORT bigint(20) NO TENANT_ID bigint(20) NO TRANS_ID bigint(20) NO +SESSION_ID bigint(20) NO TYPE varchar(9) NO ID1 bigint(20) NO -ID2 varchar(533) NO +ID2 bigint(20) NO +ID3 varchar(533) NO LMODE varchar(8) NO REQUEST varchar(8) NO CTIME bigint(20) NO diff --git a/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/desc_sys_views_in_sys.result b/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/desc_sys_views_in_sys.result index a0cc3e7ed0..af69d1b2f1 100644 --- a/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/desc_sys_views_in_sys.result +++ b/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/desc_sys_views_in_sys.result @@ -7142,9 +7142,11 @@ SVR_IP varchar(46) NO NULL SVR_PORT bigint(20) NO NULL TENANT_ID bigint(20) NO NULL TRANS_ID bigint(20) NO NULL +SESSION_ID bigint(20) NO NULL TYPE varchar(9) NO ID1 bigint(20) NO NULL -ID2 varchar(533) NO +ID2 bigint(20) NO NULL +ID3 varchar(533) NO LMODE varchar(4) NO REQUEST varchar(8) NO NULL CTIME bigint(20) NO NULL @@ -7158,9 +7160,11 @@ SVR_IP varchar(46) NO SVR_PORT bigint(20) NO TENANT_ID bigint(20) NO TRANS_ID bigint(20) NO +SESSION_ID bigint(20) NO TYPE varchar(9) NO ID1 bigint(20) NO -ID2 varchar(533) NO +ID2 bigint(20) NO +ID3 varchar(533) NO LMODE varchar(8) NO REQUEST varchar(8) NO CTIME bigint(20) NO diff --git a/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/desc_virtual_table_in_mysql.result b/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/desc_virtual_table_in_mysql.result index a60c6f6ead..183325c16d 100644 --- a/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/desc_virtual_table_in_mysql.result +++ b/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/desc_virtual_table_in_mysql.result @@ -1594,6 +1594,7 @@ abs_timeout bigint(20) NO NULL try_lock_times bigint(20) NO NULL time_after_recv bigint(20) NO NULL session_id bigint(20) NO NULL +holder_session_id bigint(20) NO NULL block_session_id bigint(20) NO NULL type bigint(20) NO NULL lock_mode varchar(8) NO NULL diff --git a/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/desc_virtual_table_in_sys.result b/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/desc_virtual_table_in_sys.result index 730c820224..e3feba63d7 100644 --- a/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/desc_virtual_table_in_sys.result +++ b/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/desc_virtual_table_in_sys.result @@ -2091,6 +2091,7 @@ abs_timeout bigint(20) NO NULL try_lock_times bigint(20) NO NULL time_after_recv bigint(20) NO NULL session_id bigint(20) NO NULL +holder_session_id bigint(20) NO NULL block_session_id bigint(20) NO NULL type bigint(20) NO NULL lock_mode varchar(8) NO NULL