mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
MDEV-8030 - Apc_target::disable() locks mutex twice
Moved Apc_target::destroy(), Apc_target::enable() and Apc_targe::disable() definitions to my_apc.h so that they can be inlined. Apc_targe::disable() now calls Apc_target::process_apc_requests() only if there're APC requests. This saves one pthread_mutex_lock() call. Overhead change: Apc_target::disable 0.04% -> out of radar Apc_target::enable 0.03% -> out of radar Apc_target::process_apc_requests 0.02% -> out of radar pthread_mutex_lock 0.43% -> 0.42% pthread_mutex_unlock 0.26% -> 0.25%
This commit is contained in:
@ -107,7 +107,7 @@ and (end_event_id <= @marker_end)
|
|||||||
) all_events
|
) all_events
|
||||||
order by relative_event_id asc;
|
order by relative_event_id asc;
|
||||||
relative_event_id relative_end_event_id event_name comment nesting_event_type relative_nesting_event_id
|
relative_event_id relative_end_event_id event_name comment nesting_event_type relative_nesting_event_id
|
||||||
0 19 statement/sql/select select "MARKER_BEGIN" as marker NULL NULL
|
0 18 statement/sql/select select "MARKER_BEGIN" as marker NULL NULL
|
||||||
1 4 stage/sql/init (stage) STATEMENT 0
|
1 4 stage/sql/init (stage) STATEMENT 0
|
||||||
2 2 wait/io/socket/sql/client_connection recv STAGE 1
|
2 2 wait/io/socket/sql/client_connection recv STAGE 1
|
||||||
3 3 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 1
|
3 3 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 1
|
||||||
@ -124,125 +124,118 @@ relative_event_id relative_end_event_id event_name comment nesting_event_type re
|
|||||||
14 14 stage/sql/freeing items (stage) STATEMENT 0
|
14 14 stage/sql/freeing items (stage) STATEMENT 0
|
||||||
15 15 wait/io/socket/sql/client_connection send STATEMENT 0
|
15 15 wait/io/socket/sql/client_connection send STATEMENT 0
|
||||||
16 16 wait/synch/mutex/sql/THD::LOCK_thd_data lock STATEMENT 0
|
16 16 wait/synch/mutex/sql/THD::LOCK_thd_data lock STATEMENT 0
|
||||||
17 17 wait/synch/mutex/sql/THD::LOCK_thd_data lock STATEMENT 0
|
17 18 stage/sql/cleaning up (stage) STATEMENT 0
|
||||||
18 19 stage/sql/cleaning up (stage) STATEMENT 0
|
18 18 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 17
|
||||||
19 19 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 18
|
19 19 idle idle NULL NULL
|
||||||
20 20 idle idle NULL NULL
|
20 38 statement/sql/select select "This is simple statement one" as payload NULL NULL
|
||||||
21 40 statement/sql/select select "This is simple statement one" as payload NULL NULL
|
21 24 stage/sql/init (stage) STATEMENT 20
|
||||||
22 25 stage/sql/init (stage) STATEMENT 21
|
22 22 wait/io/socket/sql/client_connection recv STAGE 21
|
||||||
23 23 wait/io/socket/sql/client_connection recv STAGE 22
|
23 23 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 21
|
||||||
24 24 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 22
|
24 24 wait/io/file/sql/query_log write STAGE 21
|
||||||
25 25 wait/io/file/sql/query_log write STAGE 22
|
25 25 stage/sql/checking permissions (stage) STATEMENT 20
|
||||||
26 26 stage/sql/checking permissions (stage) STATEMENT 21
|
26 26 stage/sql/Opening tables (stage) STATEMENT 20
|
||||||
27 27 stage/sql/Opening tables (stage) STATEMENT 21
|
27 27 stage/sql/After opening tables (stage) STATEMENT 20
|
||||||
28 28 stage/sql/After opening tables (stage) STATEMENT 21
|
28 28 stage/sql/init (stage) STATEMENT 20
|
||||||
29 29 stage/sql/init (stage) STATEMENT 21
|
29 29 stage/sql/optimizing (stage) STATEMENT 20
|
||||||
30 30 stage/sql/optimizing (stage) STATEMENT 21
|
30 30 stage/sql/executing (stage) STATEMENT 20
|
||||||
31 31 stage/sql/executing (stage) STATEMENT 21
|
31 31 stage/sql/end (stage) STATEMENT 20
|
||||||
32 32 stage/sql/end (stage) STATEMENT 21
|
32 32 stage/sql/query end (stage) STATEMENT 20
|
||||||
33 33 stage/sql/query end (stage) STATEMENT 21
|
33 33 stage/sql/closing tables (stage) STATEMENT 20
|
||||||
34 34 stage/sql/closing tables (stage) STATEMENT 21
|
34 34 stage/sql/freeing items (stage) STATEMENT 20
|
||||||
35 35 stage/sql/freeing items (stage) STATEMENT 21
|
35 35 wait/io/socket/sql/client_connection send STATEMENT 20
|
||||||
36 36 wait/io/socket/sql/client_connection send STATEMENT 21
|
36 36 wait/synch/mutex/sql/THD::LOCK_thd_data lock STATEMENT 20
|
||||||
37 37 wait/synch/mutex/sql/THD::LOCK_thd_data lock STATEMENT 21
|
37 38 stage/sql/cleaning up (stage) STATEMENT 20
|
||||||
38 38 wait/synch/mutex/sql/THD::LOCK_thd_data lock STATEMENT 21
|
38 38 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 37
|
||||||
39 40 stage/sql/cleaning up (stage) STATEMENT 21
|
39 39 idle idle NULL NULL
|
||||||
40 40 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 39
|
40 58 statement/sql/select select "This is simple statement two" as payload NULL NULL
|
||||||
41 41 idle idle NULL NULL
|
41 44 stage/sql/init (stage) STATEMENT 40
|
||||||
42 61 statement/sql/select select "This is simple statement two" as payload NULL NULL
|
42 42 wait/io/socket/sql/client_connection recv STAGE 41
|
||||||
43 46 stage/sql/init (stage) STATEMENT 42
|
43 43 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 41
|
||||||
44 44 wait/io/socket/sql/client_connection recv STAGE 43
|
44 44 wait/io/file/sql/query_log write STAGE 41
|
||||||
45 45 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 43
|
45 45 stage/sql/checking permissions (stage) STATEMENT 40
|
||||||
46 46 wait/io/file/sql/query_log write STAGE 43
|
46 46 stage/sql/Opening tables (stage) STATEMENT 40
|
||||||
47 47 stage/sql/checking permissions (stage) STATEMENT 42
|
47 47 stage/sql/After opening tables (stage) STATEMENT 40
|
||||||
48 48 stage/sql/Opening tables (stage) STATEMENT 42
|
48 48 stage/sql/init (stage) STATEMENT 40
|
||||||
49 49 stage/sql/After opening tables (stage) STATEMENT 42
|
49 49 stage/sql/optimizing (stage) STATEMENT 40
|
||||||
50 50 stage/sql/init (stage) STATEMENT 42
|
50 50 stage/sql/executing (stage) STATEMENT 40
|
||||||
51 51 stage/sql/optimizing (stage) STATEMENT 42
|
51 51 stage/sql/end (stage) STATEMENT 40
|
||||||
52 52 stage/sql/executing (stage) STATEMENT 42
|
52 52 stage/sql/query end (stage) STATEMENT 40
|
||||||
53 53 stage/sql/end (stage) STATEMENT 42
|
53 53 stage/sql/closing tables (stage) STATEMENT 40
|
||||||
54 54 stage/sql/query end (stage) STATEMENT 42
|
54 54 stage/sql/freeing items (stage) STATEMENT 40
|
||||||
55 55 stage/sql/closing tables (stage) STATEMENT 42
|
55 55 wait/io/socket/sql/client_connection send STATEMENT 40
|
||||||
56 56 stage/sql/freeing items (stage) STATEMENT 42
|
56 56 wait/synch/mutex/sql/THD::LOCK_thd_data lock STATEMENT 40
|
||||||
57 57 wait/io/socket/sql/client_connection send STATEMENT 42
|
57 58 stage/sql/cleaning up (stage) STATEMENT 40
|
||||||
58 58 wait/synch/mutex/sql/THD::LOCK_thd_data lock STATEMENT 42
|
58 58 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 57
|
||||||
59 59 wait/synch/mutex/sql/THD::LOCK_thd_data lock STATEMENT 42
|
59 59 idle idle NULL NULL
|
||||||
60 61 stage/sql/cleaning up (stage) STATEMENT 42
|
60 76 statement/sql/select select "This is the first part of a multi query" as payload;
|
||||||
61 61 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 60
|
|
||||||
62 62 idle idle NULL NULL
|
|
||||||
63 80 statement/sql/select select "This is the first part of a multi query" as payload;
|
|
||||||
select "And this is the second part of a multi query" as payload;
|
select "And this is the second part of a multi query" as payload;
|
||||||
select "With a third part to make things complete" as payload NULL NULL
|
select "With a third part to make things complete" as payload NULL NULL
|
||||||
64 67 stage/sql/init (stage) STATEMENT 63
|
61 64 stage/sql/init (stage) STATEMENT 60
|
||||||
65 65 wait/io/socket/sql/client_connection recv STAGE 64
|
62 62 wait/io/socket/sql/client_connection recv STAGE 61
|
||||||
66 66 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 64
|
63 63 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 61
|
||||||
67 67 wait/io/file/sql/query_log write STAGE 64
|
64 64 wait/io/file/sql/query_log write STAGE 61
|
||||||
68 68 stage/sql/checking permissions (stage) STATEMENT 63
|
65 65 stage/sql/checking permissions (stage) STATEMENT 60
|
||||||
69 69 stage/sql/Opening tables (stage) STATEMENT 63
|
66 66 stage/sql/Opening tables (stage) STATEMENT 60
|
||||||
70 70 stage/sql/After opening tables (stage) STATEMENT 63
|
67 67 stage/sql/After opening tables (stage) STATEMENT 60
|
||||||
71 71 stage/sql/init (stage) STATEMENT 63
|
68 68 stage/sql/init (stage) STATEMENT 60
|
||||||
72 72 stage/sql/optimizing (stage) STATEMENT 63
|
69 69 stage/sql/optimizing (stage) STATEMENT 60
|
||||||
73 73 stage/sql/executing (stage) STATEMENT 63
|
70 70 stage/sql/executing (stage) STATEMENT 60
|
||||||
74 74 stage/sql/end (stage) STATEMENT 63
|
71 71 stage/sql/end (stage) STATEMENT 60
|
||||||
75 75 stage/sql/query end (stage) STATEMENT 63
|
72 72 stage/sql/query end (stage) STATEMENT 60
|
||||||
76 76 stage/sql/closing tables (stage) STATEMENT 63
|
73 73 stage/sql/closing tables (stage) STATEMENT 60
|
||||||
77 80 stage/sql/freeing items (stage) STATEMENT 63
|
74 76 stage/sql/freeing items (stage) STATEMENT 60
|
||||||
78 78 wait/io/socket/sql/client_connection send STAGE 77
|
75 75 wait/io/socket/sql/client_connection send STAGE 74
|
||||||
79 79 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 77
|
76 76 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 74
|
||||||
80 80 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 77
|
77 91 statement/sql/select select "And this is the second part of a multi query" as payload;
|
||||||
81 96 statement/sql/select select "And this is the second part of a multi query" as payload;
|
|
||||||
select "With a third part to make things complete" as payload NULL NULL
|
select "With a third part to make things complete" as payload NULL NULL
|
||||||
82 83 stage/sql/init (stage) STATEMENT 81
|
78 79 stage/sql/init (stage) STATEMENT 77
|
||||||
83 83 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 82
|
79 79 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 78
|
||||||
84 84 stage/sql/checking permissions (stage) STATEMENT 81
|
80 80 stage/sql/checking permissions (stage) STATEMENT 77
|
||||||
85 85 stage/sql/Opening tables (stage) STATEMENT 81
|
81 81 stage/sql/Opening tables (stage) STATEMENT 77
|
||||||
86 86 stage/sql/After opening tables (stage) STATEMENT 81
|
82 82 stage/sql/After opening tables (stage) STATEMENT 77
|
||||||
87 87 stage/sql/init (stage) STATEMENT 81
|
83 83 stage/sql/init (stage) STATEMENT 77
|
||||||
88 88 stage/sql/optimizing (stage) STATEMENT 81
|
84 84 stage/sql/optimizing (stage) STATEMENT 77
|
||||||
89 89 stage/sql/executing (stage) STATEMENT 81
|
85 85 stage/sql/executing (stage) STATEMENT 77
|
||||||
90 90 stage/sql/end (stage) STATEMENT 81
|
86 86 stage/sql/end (stage) STATEMENT 77
|
||||||
91 91 stage/sql/query end (stage) STATEMENT 81
|
87 87 stage/sql/query end (stage) STATEMENT 77
|
||||||
92 92 stage/sql/closing tables (stage) STATEMENT 81
|
88 88 stage/sql/closing tables (stage) STATEMENT 77
|
||||||
93 96 stage/sql/freeing items (stage) STATEMENT 81
|
89 91 stage/sql/freeing items (stage) STATEMENT 77
|
||||||
94 94 wait/io/socket/sql/client_connection send STAGE 93
|
90 90 wait/io/socket/sql/client_connection send STAGE 89
|
||||||
95 95 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 93
|
91 91 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 89
|
||||||
96 96 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 93
|
92 108 statement/sql/select select "With a third part to make things complete" as payload NULL NULL
|
||||||
97 114 statement/sql/select select "With a third part to make things complete" as payload NULL NULL
|
93 94 stage/sql/init (stage) STATEMENT 92
|
||||||
98 99 stage/sql/init (stage) STATEMENT 97
|
94 94 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 93
|
||||||
99 99 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 98
|
95 95 stage/sql/checking permissions (stage) STATEMENT 92
|
||||||
100 100 stage/sql/checking permissions (stage) STATEMENT 97
|
96 96 stage/sql/Opening tables (stage) STATEMENT 92
|
||||||
101 101 stage/sql/Opening tables (stage) STATEMENT 97
|
97 97 stage/sql/After opening tables (stage) STATEMENT 92
|
||||||
102 102 stage/sql/After opening tables (stage) STATEMENT 97
|
98 98 stage/sql/init (stage) STATEMENT 92
|
||||||
103 103 stage/sql/init (stage) STATEMENT 97
|
99 99 stage/sql/optimizing (stage) STATEMENT 92
|
||||||
104 104 stage/sql/optimizing (stage) STATEMENT 97
|
100 100 stage/sql/executing (stage) STATEMENT 92
|
||||||
105 105 stage/sql/executing (stage) STATEMENT 97
|
101 101 stage/sql/end (stage) STATEMENT 92
|
||||||
106 106 stage/sql/end (stage) STATEMENT 97
|
102 102 stage/sql/query end (stage) STATEMENT 92
|
||||||
107 107 stage/sql/query end (stage) STATEMENT 97
|
103 103 stage/sql/closing tables (stage) STATEMENT 92
|
||||||
108 108 stage/sql/closing tables (stage) STATEMENT 97
|
104 104 stage/sql/freeing items (stage) STATEMENT 92
|
||||||
109 109 stage/sql/freeing items (stage) STATEMENT 97
|
105 105 wait/io/socket/sql/client_connection send STATEMENT 92
|
||||||
110 110 wait/io/socket/sql/client_connection send STATEMENT 97
|
106 106 wait/synch/mutex/sql/THD::LOCK_thd_data lock STATEMENT 92
|
||||||
111 111 wait/synch/mutex/sql/THD::LOCK_thd_data lock STATEMENT 97
|
107 108 stage/sql/cleaning up (stage) STATEMENT 92
|
||||||
112 112 wait/synch/mutex/sql/THD::LOCK_thd_data lock STATEMENT 97
|
108 108 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 107
|
||||||
113 114 stage/sql/cleaning up (stage) STATEMENT 97
|
109 109 idle idle NULL NULL
|
||||||
114 114 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 113
|
110 128 statement/sql/select select "MARKER_END" as marker NULL NULL
|
||||||
115 115 idle idle NULL NULL
|
111 114 stage/sql/init (stage) STATEMENT 110
|
||||||
116 135 statement/sql/select select "MARKER_END" as marker NULL NULL
|
112 112 wait/io/socket/sql/client_connection recv STAGE 111
|
||||||
117 120 stage/sql/init (stage) STATEMENT 116
|
113 113 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 111
|
||||||
118 118 wait/io/socket/sql/client_connection recv STAGE 117
|
114 114 wait/io/file/sql/query_log write STAGE 111
|
||||||
119 119 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 117
|
115 115 stage/sql/checking permissions (stage) STATEMENT 110
|
||||||
120 120 wait/io/file/sql/query_log write STAGE 117
|
116 116 stage/sql/Opening tables (stage) STATEMENT 110
|
||||||
121 121 stage/sql/checking permissions (stage) STATEMENT 116
|
117 117 stage/sql/After opening tables (stage) STATEMENT 110
|
||||||
122 122 stage/sql/Opening tables (stage) STATEMENT 116
|
118 118 stage/sql/init (stage) STATEMENT 110
|
||||||
123 123 stage/sql/After opening tables (stage) STATEMENT 116
|
119 119 stage/sql/optimizing (stage) STATEMENT 110
|
||||||
124 124 stage/sql/init (stage) STATEMENT 116
|
120 120 stage/sql/executing (stage) STATEMENT 110
|
||||||
125 125 stage/sql/optimizing (stage) STATEMENT 116
|
121 121 stage/sql/end (stage) STATEMENT 110
|
||||||
126 126 stage/sql/executing (stage) STATEMENT 116
|
122 122 stage/sql/query end (stage) STATEMENT 110
|
||||||
127 127 stage/sql/end (stage) STATEMENT 116
|
123 123 stage/sql/closing tables (stage) STATEMENT 110
|
||||||
128 128 stage/sql/query end (stage) STATEMENT 116
|
124 124 stage/sql/freeing items (stage) STATEMENT 110
|
||||||
129 129 stage/sql/closing tables (stage) STATEMENT 116
|
125 125 wait/io/socket/sql/client_connection send STATEMENT 110
|
||||||
130 130 stage/sql/freeing items (stage) STATEMENT 116
|
126 126 wait/synch/mutex/sql/THD::LOCK_thd_data lock STATEMENT 110
|
||||||
131 131 wait/io/socket/sql/client_connection send STATEMENT 116
|
127 128 stage/sql/cleaning up (stage) STATEMENT 110
|
||||||
132 132 wait/synch/mutex/sql/THD::LOCK_thd_data lock STATEMENT 116
|
128 128 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 127
|
||||||
133 133 wait/synch/mutex/sql/THD::LOCK_thd_data lock STATEMENT 116
|
|
||||||
134 135 stage/sql/cleaning up (stage) STATEMENT 116
|
|
||||||
135 135 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 134
|
|
||||||
|
@ -41,45 +41,6 @@ void Apc_target::init(mysql_mutex_t *target_mutex)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
Destroy the target. The target must be disabled when this call is made.
|
|
||||||
*/
|
|
||||||
void Apc_target::destroy()
|
|
||||||
{
|
|
||||||
DBUG_ASSERT(!enabled);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
Enter ther state where the target is available for serving APC requests
|
|
||||||
*/
|
|
||||||
void Apc_target::enable()
|
|
||||||
{
|
|
||||||
/* Ok to do without getting/releasing the mutex: */
|
|
||||||
enabled++;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
Make the target unavailable for serving APC requests.
|
|
||||||
|
|
||||||
@note
|
|
||||||
This call will serve all requests that were already enqueued
|
|
||||||
*/
|
|
||||||
|
|
||||||
void Apc_target::disable()
|
|
||||||
{
|
|
||||||
bool process= FALSE;
|
|
||||||
DBUG_ASSERT(enabled);
|
|
||||||
mysql_mutex_lock(LOCK_thd_data_ptr);
|
|
||||||
if (!(--enabled))
|
|
||||||
process= TRUE;
|
|
||||||
mysql_mutex_unlock(LOCK_thd_data_ptr);
|
|
||||||
if (process)
|
|
||||||
process_apc_requests();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* [internal] Put request qe into the request list */
|
/* [internal] Put request qe into the request list */
|
||||||
|
|
||||||
void Apc_target::enqueue_request(Call_request *qe)
|
void Apc_target::enqueue_request(Call_request *qe)
|
||||||
|
27
sql/my_apc.h
27
sql/my_apc.h
@ -50,10 +50,29 @@ public:
|
|||||||
~Apc_target() { DBUG_ASSERT(!enabled && !apc_calls);}
|
~Apc_target() { DBUG_ASSERT(!enabled && !apc_calls);}
|
||||||
|
|
||||||
void init(mysql_mutex_t *target_mutex);
|
void init(mysql_mutex_t *target_mutex);
|
||||||
void destroy();
|
|
||||||
void enable();
|
/* Destroy the target. The target must be disabled when this call is made. */
|
||||||
void disable();
|
void destroy() { DBUG_ASSERT(!enabled); }
|
||||||
|
|
||||||
|
/* Enter ther state where the target is available for serving APC requests */
|
||||||
|
void enable() { enabled++; }
|
||||||
|
|
||||||
|
/*
|
||||||
|
Make the target unavailable for serving APC requests.
|
||||||
|
|
||||||
|
@note
|
||||||
|
This call will serve all requests that were already enqueued
|
||||||
|
*/
|
||||||
|
void disable()
|
||||||
|
{
|
||||||
|
DBUG_ASSERT(enabled);
|
||||||
|
mysql_mutex_lock(LOCK_thd_data_ptr);
|
||||||
|
bool process= !--enabled && have_apc_requests();
|
||||||
|
mysql_mutex_unlock(LOCK_thd_data_ptr);
|
||||||
|
if (unlikely(process))
|
||||||
|
process_apc_requests();
|
||||||
|
}
|
||||||
|
|
||||||
void process_apc_requests();
|
void process_apc_requests();
|
||||||
/*
|
/*
|
||||||
A lightweight function, intended to be used in frequent checks like this:
|
A lightweight function, intended to be used in frequent checks like this:
|
||||||
|
Reference in New Issue
Block a user