1 # name : innodb_deadlock_count.patch
2 # introduced : 11 or before
3 # maintainer : Yasufumi
6 # Any small change to this file in the main branch
7 # should be done or reviewed by the maintainer!
8 --- a/storage/innobase/handler/ha_innodb.cc
9 +++ b/storage/innobase/handler/ha_innodb.cc
11 (char*) &export_vars.innodb_dblwr_pages_written, SHOW_LONG},
13 (char*) &export_vars.innodb_dblwr_writes, SHOW_LONG},
15 + (char*) &export_vars.innodb_deadlocks, SHOW_LONG},
17 (char*) &export_vars.innodb_dict_tables, SHOW_LONG},
18 {"have_atomic_builtins",
19 --- a/storage/innobase/include/lock0lock.h
20 +++ b/storage/innobase/include/lock0lock.h
22 #endif /* UNIV_DEBUG */
23 /* Buffer for storing information about the most recent deadlock error */
24 extern FILE* lock_latest_err_file;
25 +extern ulint srv_n_lock_deadlock_count;
27 /*********************************************************************//**
28 Gets the size of a lock struct.
29 --- a/storage/innobase/include/srv0srv.h
30 +++ b/storage/innobase/include/srv0srv.h
32 ulint innodb_buffer_pool_read_ahead_evicted;/*!< srv_read_ahead evicted*/
33 ulint innodb_dblwr_pages_written; /*!< srv_dblwr_pages_written */
34 ulint innodb_dblwr_writes; /*!< srv_dblwr_writes */
35 + ulint innodb_deadlocks;
36 ibool innodb_have_atomic_builtins; /*!< HAVE_ATOMIC_BUILTINS */
37 ulint innodb_log_waits; /*!< srv_log_waits */
38 ulint innodb_log_write_requests; /*!< srv_log_write_requests */
39 --- a/storage/innobase/lock/lock0lock.c
40 +++ b/storage/innobase/lock/lock0lock.c
44 case LOCK_VICTIM_IS_START:
45 + srv_n_lock_deadlock_count++;
46 fputs("*** WE ROLL BACK TRANSACTION (2)\n",
47 lock_latest_err_file);
49 --- a/storage/innobase/srv/srv0srv.c
50 +++ b/storage/innobase/srv/srv0srv.c
52 static ulint srv_n_rows_deleted_old = 0;
53 static ulint srv_n_rows_read_old = 0;
55 +UNIV_INTERN ulint srv_n_lock_deadlock_count = 0;
56 UNIV_INTERN ulint srv_n_lock_wait_count = 0;
57 UNIV_INTERN ulint srv_n_lock_wait_current_count = 0;
58 UNIV_INTERN ib_int64_t srv_n_lock_wait_time = 0;
60 export_vars.innodb_buffer_pool_pages_data = LRU_len;
61 export_vars.innodb_buffer_pool_pages_dirty = flush_list_len;
62 export_vars.innodb_buffer_pool_pages_free = free_len;
63 + export_vars.innodb_deadlocks = srv_n_lock_deadlock_count;
65 export_vars.innodb_buffer_pool_pages_latched
66 = buf_get_latched_pages_number();
68 +++ b/mysql-test/r/percona_innodb_deadlock_count.result
70 +# Establish connection con1 (user=root)
71 +# Establish connection con2 (user=root)
72 +# Establish connection con3 (user=root)
74 +drop table if exists t;
76 +create table t(a INT PRIMARY KEY, b INT) engine=InnoDB;
77 +# Insert two rows to test table
78 +insert into t values(2,1);
79 +insert into t values(1,2);
80 +# Switch to connection con1
82 +SELECT b FROM t WHERE a=1 FOR UPDATE;
83 +# Switch to connection con2
85 +SELECT b FROM t WHERE a=2 FOR UPDATE;
86 +# Switch to connection con1
87 +SELECT b FROM t WHERE a=2 FOR UPDATE;
88 +# Switch to connection con2
89 +SELECT b FROM t WHERE a=1 FOR UPDATE;
90 +# Switch to connection con1
92 +# Switch to connection con2
94 +# Switch to connection con3
99 +++ b/mysql-test/t/percona_innodb_deadlock_count.test
101 +--source include/have_innodb.inc
102 +--echo # Establish connection con1 (user=root)
103 +connect (con1,localhost,root,,);
104 +--echo # Establish connection con2 (user=root)
105 +connect (con2,localhost,root,,);
106 +--echo # Establish connection con3 (user=root)
107 +connect (con3,localhost,root,,);
108 +--echo # Drop test table
110 +drop table if exists t;
113 +--echo # Create test table
114 +create table t(a INT PRIMARY KEY, b INT) engine=InnoDB;
115 +--echo # Insert two rows to test table
116 +insert into t values(2,1);
117 +insert into t values(1,2);
119 +#--echo # Save current deadlock count
120 +let $current = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'Innodb_deadlocks'`;
122 +--disable_result_log
124 +--echo # Switch to connection con1
126 +BEGIN; SELECT b FROM t WHERE a=1 FOR UPDATE;
128 +--echo # Switch to connection con2
130 +BEGIN; SELECT b FROM t WHERE a=2 FOR UPDATE;
132 +--echo # Switch to connection con1
134 +SEND SELECT b FROM t WHERE a=2 FOR UPDATE;
136 +--echo # Switch to connection con2
138 +SEND SELECT b FROM t WHERE a=1 FOR UPDATE;
140 +--echo # Switch to connection con1
142 +--error 0, ER_LOCK_DEADLOCK
146 +--echo # Switch to connection con2
148 +--error 0, ER_LOCK_DEADLOCK
152 +--echo # Switch to connection con3
154 +let $result = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'Innodb_deadlocks'`;
158 +let $diff = `SELECT $result - $current`;
159 +echo Deadlocks: $diff;
160 +--echo # Drop test table