]> git.pld-linux.org Git - packages/mysql.git/blame - innodb_extend_slow.patch
- rel 2; force rebuild anyway (libmysqlclient_r.so.* lib is gone)
[packages/mysql.git] / innodb_extend_slow.patch
CommitLineData
d4e9320e
AM
1# name : innodb_extend_slow.patch
2# introduced : 11 or before
3# maintainer : Yasufumi
4#
5#!!! notice !!!
6# Any small change to this file in the main branch
7# should be done or reviewed by the maintainer!
b4e1fa2c
AM
8diff -ruN a/storage/innobase/buf/buf0buf.c b/storage/innobase/buf/buf0buf.c
9--- a/storage/innobase/buf/buf0buf.c 2010-12-03 15:49:59.175955882 +0900
10+++ b/storage/innobase/buf/buf0buf.c 2010-12-03 17:42:42.074307123 +0900
d4e9320e
AM
11@@ -51,6 +51,40 @@
12 #include "dict0dict.h"
13 #include "log0recv.h"
14 #include "page0zip.h"
15+#include "trx0trx.h"
16+
17+/* prototypes for new functions added to ha_innodb.cc */
18+trx_t* innobase_get_trx();
19+
20+inline void _increment_page_get_statistics(buf_block_t* block, trx_t* trx)
21+{
22+ ulint block_hash;
23+ ulint block_hash_byte;
24+ byte block_hash_offset;
25+
26+ ut_ad(block);
27+
28+ if (!innobase_get_slow_log() || !trx || !trx->take_stats)
29+ return;
30+
31+ if (!trx->distinct_page_access_hash) {
32+ trx->distinct_page_access_hash = mem_alloc(DPAH_SIZE);
33+ memset(trx->distinct_page_access_hash, 0, DPAH_SIZE);
34+ }
35+
36+ block_hash = ut_hash_ulint((block->page.space << 20) + block->page.space +
37+ block->page.offset, DPAH_SIZE << 3);
38+ block_hash_byte = block_hash >> 3;
39+ block_hash_offset = (byte) block_hash & 0x07;
40+ if (block_hash_byte < 0 || block_hash_byte >= DPAH_SIZE)
41+ fprintf(stderr, "!!! block_hash_byte = %lu block_hash_offset = %d !!!\n", block_hash_byte, block_hash_offset);
42+ if (block_hash_offset < 0 || block_hash_offset > 7)
43+ fprintf(stderr, "!!! block_hash_byte = %lu block_hash_offset = %d !!!\n", block_hash_byte, block_hash_offset);
44+ if ((trx->distinct_page_access_hash[block_hash_byte] & ((byte) 0x01 << block_hash_offset)) == 0)
45+ trx->distinct_page_access++;
46+ trx->distinct_page_access_hash[block_hash_byte] |= (byte) 0x01 << block_hash_offset;
47+ return;
48+}
49
50 /*
51 IMPLEMENTATION OF THE BUFFER POOL
b4e1fa2c 52@@ -2397,11 +2431,19 @@
d4e9320e
AM
53 mutex_t* block_mutex;
54 ibool must_read;
55 unsigned access_time;
56+ trx_t* trx = NULL;
57+ ulint sec;
58+ ulint ms;
59+ ib_uint64_t start_time;
60+ ib_uint64_t finish_time;
b4e1fa2c 61 buf_pool_t* buf_pool = buf_pool_get(space, offset);
d4e9320e
AM
62
63 #ifndef UNIV_LOG_DEBUG
64 ut_ad(!ibuf_inside());
65 #endif
66+ if (innobase_get_slow_log()) {
67+ trx = innobase_get_trx();
68+ }
69 buf_pool->stat.n_page_gets++;
70
71 for (;;) {
b4e1fa2c
AM
72@@ -2419,7 +2461,7 @@
73 //buf_pool_mutex_exit(buf_pool);
74 rw_lock_s_unlock(&buf_pool->page_hash_latch);
d4e9320e
AM
75
76- buf_read_page(space, zip_size, offset);
77+ buf_read_page(space, zip_size, offset, trx);
78
79 #if defined UNIV_DEBUG || defined UNIV_BUF_DEBUG
80 ut_a(++buf_dbg_counter % 37 || buf_validate());
b4e1fa2c 81@@ -2497,6 +2539,13 @@
d4e9320e
AM
82 /* Let us wait until the read operation
83 completes */
84
85+ if (innobase_get_slow_log() && trx && trx->take_stats)
86+ {
87+ ut_usectime(&sec, &ms);
88+ start_time = (ib_uint64_t)sec * 1000000 + ms;
89+ } else {
90+ start_time = 0;
91+ }
92 for (;;) {
93 enum buf_io_fix io_fix;
94
b4e1fa2c 95@@ -2511,6 +2560,12 @@
d4e9320e
AM
96 break;
97 }
98 }
99+ if (innobase_get_slow_log() && trx && trx->take_stats && start_time)
100+ {
101+ ut_usectime(&sec, &ms);
102+ finish_time = (ib_uint64_t)sec * 1000000 + ms;
103+ trx->io_reads_wait_timer += (ulint)(finish_time - start_time);
104+ }
105 }
106
107 #ifdef UNIV_IBUF_COUNT_DEBUG
b4e1fa2c 108@@ -2823,6 +2878,11 @@
d4e9320e
AM
109 ibool must_read;
110 ulint retries = 0;
b4e1fa2c
AM
111 mutex_t* block_mutex = NULL;
112+ trx_t* trx = NULL;
113+ ulint sec;
114+ ulint ms;
115+ ib_uint64_t start_time;
116+ ib_uint64_t finish_time;
117 buf_pool_t* buf_pool = buf_pool_get(space, offset);
d4e9320e
AM
118
119 ut_ad(mtr);
b4e1fa2c 120@@ -2840,6 +2900,9 @@
d4e9320e
AM
121 #ifndef UNIV_LOG_DEBUG
122 ut_ad(!ibuf_inside() || ibuf_page(space, zip_size, offset, NULL));
123 #endif
124+ if (innobase_get_slow_log()) {
125+ trx = innobase_get_trx();
126+ }
127 buf_pool->stat.n_page_gets++;
b4e1fa2c 128 fold = buf_page_address_fold(space, offset);
d4e9320e 129 loop:
b4e1fa2c 130@@ -2913,7 +2976,7 @@
d4e9320e
AM
131 return(NULL);
132 }
133
134- if (buf_read_page(space, zip_size, offset)) {
135+ if (buf_read_page(space, zip_size, offset, trx)) {
136 retries = 0;
137 } else if (retries < BUF_PAGE_READ_MAX_RETRIES) {
138 ++retries;
b4e1fa2c 139@@ -3216,6 +3279,13 @@
d4e9320e
AM
140 /* Let us wait until the read operation
141 completes */
142
143+ if (innobase_get_slow_log() && trx && trx->take_stats)
144+ {
145+ ut_usectime(&sec, &ms);
146+ start_time = (ib_uint64_t)sec * 1000000 + ms;
147+ } else {
148+ start_time = 0;
149+ }
150 for (;;) {
151 enum buf_io_fix io_fix;
152
b4e1fa2c 153@@ -3230,6 +3300,12 @@
d4e9320e
AM
154 break;
155 }
156 }
157+ if (innobase_get_slow_log() && trx && trx->take_stats && start_time)
158+ {
159+ ut_usectime(&sec, &ms);
160+ finish_time = (ib_uint64_t)sec * 1000000 + ms;
161+ trx->io_reads_wait_timer += (ulint)(finish_time - start_time);
162+ }
163 }
164
165 fix_type = MTR_MEMO_BUF_FIX;
b4e1fa2c 166@@ -3255,13 +3331,17 @@
d4e9320e
AM
167 /* In the case of a first access, try to apply linear
168 read-ahead */
169
170- buf_read_ahead_linear(space, zip_size, offset);
171+ buf_read_ahead_linear(space, zip_size, offset, trx);
172 }
173
174 #ifdef UNIV_IBUF_COUNT_DEBUG
175 ut_a(ibuf_count_get(buf_block_get_space(block),
176 buf_block_get_page_no(block)) == 0);
177 #endif
178+ if (innobase_get_slow_log()) {
179+ _increment_page_get_statistics(block, trx);
180+ }
181+
182 return(block);
183 }
184
b4e1fa2c 185@@ -3285,6 +3365,7 @@
d4e9320e
AM
186 unsigned access_time;
187 ibool success;
188 ulint fix_type;
189+ trx_t* trx = NULL;
190
191 ut_ad(block);
192 ut_ad(mtr);
b4e1fa2c 193@@ -3362,13 +3443,17 @@
d4e9320e
AM
194 #ifdef UNIV_DEBUG_FILE_ACCESSES
195 ut_a(block->page.file_page_was_freed == FALSE);
196 #endif
197+ if (innobase_get_slow_log()) {
198+ trx = innobase_get_trx();
199+ }
200+
201 if (UNIV_UNLIKELY(!access_time)) {
202 /* In the case of a first access, try to apply linear
203 read-ahead */
204
205 buf_read_ahead_linear(buf_block_get_space(block),
206 buf_block_get_zip_size(block),
207- buf_block_get_page_no(block));
208+ buf_block_get_page_no(block), trx);
209 }
210
211 #ifdef UNIV_IBUF_COUNT_DEBUG
b4e1fa2c
AM
212@@ -3378,6 +3463,9 @@
213 buf_pool = buf_pool_from_block(block);
d4e9320e
AM
214 buf_pool->stat.n_page_gets++;
215
216+ if (innobase_get_slow_log()) {
217+ _increment_page_get_statistics(block, trx);
218+ }
219 return(TRUE);
220 }
221
b4e1fa2c
AM
222@@ -3400,6 +3488,7 @@
223 buf_pool_t* buf_pool;
d4e9320e
AM
224 ibool success;
225 ulint fix_type;
226+ trx_t* trx = NULL;
227
228 ut_ad(mtr);
229 ut_ad(mtr->state == MTR_ACTIVE);
b4e1fa2c 230@@ -3486,6 +3575,11 @@
d4e9320e
AM
231 #endif
232 buf_pool->stat.n_page_gets++;
233
234+ if (innobase_get_slow_log()) {
235+ trx = innobase_get_trx();
236+ _increment_page_get_statistics(block, trx);
237+ }
238+
239 return(TRUE);
240 }
241
b4e1fa2c
AM
242diff -ruN a/storage/innobase/buf/buf0rea.c b/storage/innobase/buf/buf0rea.c
243--- a/storage/innobase/buf/buf0rea.c 2010-12-03 17:32:15.617037263 +0900
244+++ b/storage/innobase/buf/buf0rea.c 2010-12-03 17:42:42.075297193 +0900
245@@ -77,7 +77,8 @@
d4e9320e
AM
246 treat the tablespace as dropped; this is a timestamp we
247 use to stop dangling page reads from a tablespace
248 which we have DISCARDed + IMPORTed back */
249- ulint offset) /*!< in: page number */
250+ ulint offset, /*!< in: page number */
251+ trx_t* trx)
252 {
253 buf_page_t* bpage;
254 ulint wake_later;
b4e1fa2c 255@@ -179,15 +180,15 @@
d4e9320e 256
b4e1fa2c 257 thd_wait_begin(NULL, THD_WAIT_DISKIO);
d4e9320e
AM
258 if (zip_size) {
259- *err = fil_io(OS_FILE_READ | wake_later,
260+ *err = _fil_io(OS_FILE_READ | wake_later,
261 sync, space, zip_size, offset, 0, zip_size,
262- bpage->zip.data, bpage);
263+ bpage->zip.data, bpage, trx);
264 } else {
265 ut_a(buf_page_get_state(bpage) == BUF_BLOCK_FILE_PAGE);
266
267- *err = fil_io(OS_FILE_READ | wake_later,
268+ *err = _fil_io(OS_FILE_READ | wake_later,
269 sync, space, 0, offset, 0, UNIV_PAGE_SIZE,
270- ((buf_block_t*) bpage)->frame, bpage);
271+ ((buf_block_t*) bpage)->frame, bpage, trx);
272 }
b4e1fa2c 273 thd_wait_end(NULL);
d4e9320e 274 ut_a(*err == DB_SUCCESS);
b4e1fa2c 275@@ -213,7 +214,8 @@
d4e9320e
AM
276 /*==========*/
277 ulint space, /*!< in: space id */
278 ulint zip_size,/*!< in: compressed page size in bytes, or 0 */
279- ulint offset) /*!< in: page number */
280+ ulint offset, /*!< in: page number */
281+ trx_t* trx)
282 {
b4e1fa2c 283 buf_pool_t* buf_pool = buf_pool_get(space, offset);
d4e9320e 284 ib_int64_t tablespace_version;
b4e1fa2c 285@@ -227,7 +229,7 @@
d4e9320e
AM
286
287 count = buf_read_page_low(&err, TRUE, BUF_READ_ANY_PAGE, space,
288 zip_size, FALSE,
289- tablespace_version, offset);
290+ tablespace_version, offset, trx);
291 srv_buf_pool_reads += count;
292 if (err == DB_TABLESPACE_DELETED) {
293 ut_print_timestamp(stderr);
b4e1fa2c 294@@ -278,8 +280,9 @@
d4e9320e
AM
295 /*==================*/
296 ulint space, /*!< in: space id */
297 ulint zip_size,/*!< in: compressed page size in bytes, or 0 */
298- ulint offset) /*!< in: page number of a page; NOTE: the current thread
299+ ulint offset, /*!< in: page number of a page; NOTE: the current thread
300 must want access to this page (see NOTE 3 above) */
301+ trx_t* trx)
302 {
b4e1fa2c 303 buf_pool_t* buf_pool = buf_pool_get(space, offset);
d4e9320e 304 ib_int64_t tablespace_version;
b4e1fa2c 305@@ -500,7 +503,7 @@
d4e9320e
AM
306 count += buf_read_page_low(
307 &err, FALSE,
308 ibuf_mode | OS_AIO_SIMULATED_WAKE_LATER,
309- space, zip_size, FALSE, tablespace_version, i);
310+ space, zip_size, FALSE, tablespace_version, i, trx);
311 if (err == DB_TABLESPACE_DELETED) {
312 ut_print_timestamp(stderr);
313 fprintf(stderr,
b4e1fa2c 314@@ -594,7 +597,7 @@
d4e9320e
AM
315 buf_read_page_low(&err, sync && (i + 1 == n_stored),
316 BUF_READ_ANY_PAGE, space_ids[i],
317 zip_size, TRUE, space_versions[i],
318- page_nos[i]);
319+ page_nos[i], NULL);
320
321 if (UNIV_UNLIKELY(err == DB_TABLESPACE_DELETED)) {
322 tablespace_deleted:
b4e1fa2c 323@@ -736,12 +739,12 @@
d4e9320e
AM
324 if ((i + 1 == n_stored) && sync) {
325 buf_read_page_low(&err, TRUE, BUF_READ_ANY_PAGE, space,
326 zip_size, TRUE, tablespace_version,
327- page_nos[i]);
328+ page_nos[i], NULL);
329 } else {
330 buf_read_page_low(&err, FALSE, BUF_READ_ANY_PAGE
331 | OS_AIO_SIMULATED_WAKE_LATER,
332 space, zip_size, TRUE,
333- tablespace_version, page_nos[i]);
334+ tablespace_version, page_nos[i], NULL);
335 }
336 }
337
b4e1fa2c
AM
338diff -ruN a/storage/innobase/fil/fil0fil.c b/storage/innobase/fil/fil0fil.c
339--- a/storage/innobase/fil/fil0fil.c 2010-12-03 15:53:54.610037199 +0900
340+++ b/storage/innobase/fil/fil0fil.c 2010-12-03 17:42:42.079064198 +0900
341@@ -4395,7 +4395,7 @@
d4e9320e
AM
342 node->name, node->handle, buf,
343 offset_low, offset_high,
344 page_size * n_pages,
345- NULL, NULL);
346+ NULL, NULL, NULL);
347 #endif
348 if (success) {
349 node->size += n_pages;
b4e1fa2c 350@@ -4722,7 +4722,7 @@
d4e9320e
AM
351 i/o on a tablespace which does not exist */
352 UNIV_INTERN
353 ulint
354-fil_io(
355+_fil_io(
356 /*===*/
357 ulint type, /*!< in: OS_FILE_READ or OS_FILE_WRITE,
358 ORed to OS_FILE_LOG, if a log i/o
b4e1fa2c 359@@ -4747,8 +4747,9 @@
d4e9320e
AM
360 void* buf, /*!< in/out: buffer where to store read data
361 or from where to write; in aio this must be
362 appropriately aligned */
363- void* message) /*!< in: message for aio handler if non-sync
364+ void* message, /*!< in: message for aio handler if non-sync
365 aio used, else ignored */
366+ trx_t* trx)
367 {
368 ulint mode;
369 fil_space_t* space;
b4e1fa2c 370@@ -4918,7 +4919,7 @@
d4e9320e
AM
371 #else
372 /* Queue the aio request */
373 ret = os_aio(type, mode | wake_later, node->name, node->handle, buf,
374- offset_low, offset_high, len, node, message);
375+ offset_low, offset_high, len, node, message, trx);
376 #endif
377 ut_a(ret);
378
b4e1fa2c
AM
379diff -ruN a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc
380--- a/storage/innobase/handler/ha_innodb.cc 2010-12-03 17:36:44.293955189 +0900
381+++ b/storage/innobase/handler/ha_innodb.cc 2010-12-03 17:42:42.090024586 +0900
382@@ -1526,6 +1526,16 @@
d4e9320e
AM
383 trx->check_unique_secondary = !thd_test_options(
384 thd, OPTION_RELAXED_UNIQUE_CHECKS);
385
386+#ifdef EXTENDED_SLOWLOG
387+ if (thd_log_slow_verbosity(thd) & SLOG_V_INNODB) {
388+ trx->take_stats = TRUE;
389+ } else {
390+ trx->take_stats = FALSE;
391+ }
392+#else
393+ trx->take_stats = FALSE;
394+#endif
395+
396 DBUG_VOID_RETURN;
397 }
398
b4e1fa2c
AM
399@@ -1580,6 +1590,32 @@
400 return(trx);
d4e9320e
AM
401 }
402
d4e9320e
AM
403+/*************************************************************************
404+Gets current trx. */
405+extern "C"
406+trx_t*
407+innobase_get_trx()
408+{
409+ THD *thd=current_thd;
410+ if (likely(thd != 0)) {
411+ trx_t*& trx = thd_to_trx(thd);
412+ return(trx);
413+ } else {
414+ return(NULL);
415+ }
416+}
417+
418+extern "C"
419+ibool
420+innobase_get_slow_log()
421+{
422+#ifdef EXTENDED_SLOWLOG
423+ return((ibool) thd_opt_slow_log());
424+#else
425+ return(FALSE);
426+#endif
427+}
428+
429 /*********************************************************************//**
b4e1fa2c
AM
430 Note that a transaction has been registered with MySQL.
431 @return true if transaction is registered with MySQL 2PC coordinator */
432@@ -9200,6 +9236,25 @@
d4e9320e
AM
433 statement has ended */
434
435 if (trx->n_mysql_tables_in_use == 0) {
436+#ifdef EXTENDED_SLOWLOG
437+ increment_thd_innodb_stats(thd,
b4e1fa2c 438+ (unsigned long long) trx->id,
d4e9320e
AM
439+ trx->io_reads,
440+ trx->io_read,
441+ trx->io_reads_wait_timer,
442+ trx->lock_que_wait_timer,
443+ trx->innodb_que_wait_timer,
444+ trx->distinct_page_access);
445+
446+ trx->io_reads = 0;
447+ trx->io_read = 0;
448+ trx->io_reads_wait_timer = 0;
449+ trx->lock_que_wait_timer = 0;
450+ trx->innodb_que_wait_timer = 0;
451+ trx->distinct_page_access = 0;
452+ if (trx->distinct_page_access_hash)
453+ memset(trx->distinct_page_access_hash, 0, DPAH_SIZE);
454+#endif
455
456 trx->mysql_n_tables_locked = 0;
457 prebuilt->used_in_HANDLER = FALSE;
b4e1fa2c
AM
458diff -ruN a/storage/innobase/include/buf0rea.h b/storage/innobase/include/buf0rea.h
459--- a/storage/innobase/include/buf0rea.h 2010-12-03 15:18:48.891024406 +0900
460+++ b/storage/innobase/include/buf0rea.h 2010-12-03 17:42:42.096026873 +0900
d4e9320e
AM
461@@ -27,6 +27,7 @@
462 #define buf0rea_h
463
464 #include "univ.i"
465+#include "trx0types.h"
466 #include "buf0types.h"
467
468 /********************************************************************//**
469@@ -41,7 +42,8 @@
470 /*==========*/
471 ulint space, /*!< in: space id */
472 ulint zip_size,/*!< in: compressed page size in bytes, or 0 */
473- ulint offset);/*!< in: page number */
474+ ulint offset, /*!< in: page number */
475+ trx_t* trx);
476 /********************************************************************//**
477 Applies linear read-ahead if in the buf_pool the page is a border page of
478 a linear read-ahead area and all the pages in the area have been accessed.
479@@ -72,8 +74,9 @@
480 /*==================*/
481 ulint space, /*!< in: space id */
482 ulint zip_size,/*!< in: compressed page size in bytes, or 0 */
483- ulint offset);/*!< in: page number of a page; NOTE: the current thread
484+ ulint offset, /*!< in: page number of a page; NOTE: the current thread
485 must want access to this page (see NOTE 3 above) */
486+ trx_t* trx);
487 /********************************************************************//**
488 Issues read requests for pages which the ibuf module wants to read in, in
489 order to contract the insert buffer tree. Technically, this function is like
b4e1fa2c
AM
490diff -ruN a/storage/innobase/include/fil0fil.h b/storage/innobase/include/fil0fil.h
491--- a/storage/innobase/include/fil0fil.h 2010-12-03 15:09:51.290958543 +0900
492+++ b/storage/innobase/include/fil0fil.h 2010-12-03 17:42:42.097027548 +0900
493@@ -611,9 +611,12 @@
d4e9320e
AM
494 Reads or writes data. This operation is asynchronous (aio).
495 @return DB_SUCCESS, or DB_TABLESPACE_DELETED if we are trying to do
496 i/o on a tablespace which does not exist */
497+#define fil_io(type, sync, space_id, zip_size, block_offset, byte_offset, len, buf, message) \
498+ _fil_io(type, sync, space_id, zip_size, block_offset, byte_offset, len, buf, message, NULL)
499+
500 UNIV_INTERN
501 ulint
502-fil_io(
503+_fil_io(
504 /*===*/
505 ulint type, /*!< in: OS_FILE_READ or OS_FILE_WRITE,
506 ORed to OS_FILE_LOG, if a log i/o
b4e1fa2c 507@@ -638,8 +641,9 @@
d4e9320e
AM
508 void* buf, /*!< in/out: buffer where to store read data
509 or from where to write; in aio this must be
510 appropriately aligned */
511- void* message); /*!< in: message for aio handler if non-sync
512+ void* message, /*!< in: message for aio handler if non-sync
513 aio used, else ignored */
514+ trx_t* trx);
515 /**********************************************************************//**
516 Waits for an aio operation to complete. This function is used to write the
517 handler for completed requests. The aio array of pending requests is divided
b4e1fa2c
AM
518diff -ruN a/storage/innobase/include/os0file.h b/storage/innobase/include/os0file.h
519--- a/storage/innobase/include/os0file.h 2010-11-03 07:01:13.000000000 +0900
520+++ b/storage/innobase/include/os0file.h 2010-12-03 17:42:42.100023783 +0900
d4e9320e
AM
521@@ -36,6 +36,7 @@
522 #define os0file_h
523
524 #include "univ.i"
525+#include "trx0types.h"
526
527 #ifndef __WIN__
528 #include <dirent.h>
b4e1fa2c
AM
529@@ -277,13 +278,17 @@
530 pfs_os_file_close_func(file, __FILE__, __LINE__)
531
532 # define os_aio(type, mode, name, file, buf, offset, offset_high, \
533- n, message1, message2) \
534+ n, message1, message2, trx) \
535 pfs_os_aio_func(type, mode, name, file, buf, offset, \
536- offset_high, n, message1, message2, \
537+ offset_high, n, message1, message2, trx, \
538 __FILE__, __LINE__)
539
540 # define os_file_read(file, buf, offset, offset_high, n) \
541- pfs_os_file_read_func(file, buf, offset, offset_high, n, \
542+ pfs_os_file_read_func(file, buf, offset, offset_high, n, NULL, \
543+ __FILE__, __LINE__)
7023c87b 544+
b4e1fa2c
AM
545+# define os_file_read_trx(file, buf, offset, offset_high, n, trx) \
546+ pfs_os_file_read_func(file, buf, offset, offset_high, n, trx, \
547 __FILE__, __LINE__)
548
549 # define os_file_read_no_error_handling(file, buf, offset, \
550@@ -319,12 +324,15 @@
551 # define os_file_close(file) os_file_close_func(file)
552
553 # define os_aio(type, mode, name, file, buf, offset, offset_high, \
554- n, message1, message2) \
555+ n, message1, message2, trx) \
556 os_aio_func(type, mode, name, file, buf, offset, offset_high, n,\
557- message1, message2)
558+ message1, message2, trx)
559
560 # define os_file_read(file, buf, offset, offset_high, n) \
561- os_file_read_func(file, buf, offset, offset_high, n)
562+ os_file_read_func(file, buf, offset, offset_high, n, NULL)
563+
564+# define os_file_read_trx(file, buf, offset, offset_high, n, trx) \
565+ os_file_read_func(file, buf, offset, offset_high, n, trx)
566
567 # define os_file_read_no_error_handling(file, buf, offset, \
568 offset_high, n) \
569@@ -690,6 +698,7 @@
570 ulint offset_high,/*!< in: most significant 32 bits of
571 offset */
572 ulint n, /*!< in: number of bytes to read */
573+ trx_t* trx,
574 const char* src_file,/*!< in: file name where func invoked */
575 ulint src_line);/*!< in: line where the func invoked */
576
577@@ -744,6 +753,7 @@
578 (can be used to identify a completed
579 aio operation); ignored if mode is
580 OS_AIO_SYNC */
581+ trx_t* trx,
582 const char* src_file,/*!< in: file name where func invoked */
583 ulint src_line);/*!< in: line where the func invoked */
584 /*******************************************************************//**
585@@ -885,7 +895,8 @@
d4e9320e
AM
586 offset where to read */
587 ulint offset_high,/*!< in: most significant 32 bits of
588 offset */
589- ulint n); /*!< in: number of bytes to read */
590+ ulint n, /*!< in: number of bytes to read */
591+ trx_t* trx);
592 /*******************************************************************//**
593 Rewind file to its start, read at most size - 1 bytes from it to str, and
594 NUL-terminate str. All errors are silently ignored. This function is
b4e1fa2c 595@@ -1044,10 +1055,11 @@
d4e9320e
AM
596 (can be used to identify a completed
597 aio operation); ignored if mode is
598 OS_AIO_SYNC */
599- void* message2);/*!< in: message for the aio handler
600+ void* message2,/*!< in: message for the aio handler
601 (can be used to identify a completed
602 aio operation); ignored if mode is
603 OS_AIO_SYNC */
604+ trx_t* trx);
605 /************************************************************************//**
606 Wakes up all async i/o threads so that they know to exit themselves in
607 shutdown. */
b4e1fa2c
AM
608diff -ruN a/storage/innobase/include/os0file.ic b/storage/innobase/include/os0file.ic
609--- a/storage/innobase/include/os0file.ic 2010-11-03 07:01:13.000000000 +0900
610+++ b/storage/innobase/include/os0file.ic 2010-12-03 17:42:42.102024458 +0900
611@@ -229,6 +229,7 @@
612 (can be used to identify a completed
613 aio operation); ignored if mode is
614 OS_AIO_SYNC */
615+ trx_t* trx,
616 const char* src_file,/*!< in: file name where func invoked */
617 ulint src_line)/*!< in: line where the func invoked */
618 {
619@@ -244,7 +245,7 @@
620 src_file, src_line);
621
622 result = os_aio_func(type, mode, name, file, buf, offset, offset_high,
623- n, message1, message2);
624+ n, message1, message2, trx);
625
626 register_pfs_file_io_end(locker, n);
627
628@@ -268,6 +269,7 @@
629 ulint offset_high,/*!< in: most significant 32 bits of
630 offset */
631 ulint n, /*!< in: number of bytes to read */
632+ trx_t* trx,
633 const char* src_file,/*!< in: file name where func invoked */
634 ulint src_line)/*!< in: line where the func invoked */
635 {
636@@ -278,7 +280,7 @@
637 register_pfs_file_io_begin(&state, locker, file, n, PSI_FILE_READ,
638 src_file, src_line);
639
640- result = os_file_read_func(file, buf, offset, offset_high, n);
641+ result = os_file_read_func(file, buf, offset, offset_high, n, trx);
642
643 register_pfs_file_io_end(locker, n);
644
645diff -ruN a/storage/innobase/include/srv0srv.h b/storage/innobase/include/srv0srv.h
646--- a/storage/innobase/include/srv0srv.h 2010-12-03 17:32:15.634987408 +0900
647+++ b/storage/innobase/include/srv0srv.h 2010-12-03 17:42:42.104028644 +0900
648@@ -71,6 +71,9 @@
d4e9320e
AM
649 #define SRV_AUTO_EXTEND_INCREMENT \
650 (srv_auto_extend_increment * ((1024 * 1024) / UNIV_PAGE_SIZE))
651
652+/* prototypes for new functions added to ha_innodb.cc */
653+ibool innobase_get_slow_log();
654+
655 /* This is set to TRUE if the MySQL user has set it in MySQL */
656 extern ibool srv_lower_case_table_names;
657
b4e1fa2c
AM
658diff -ruN a/storage/innobase/include/trx0trx.h b/storage/innobase/include/trx0trx.h
659--- a/storage/innobase/include/trx0trx.h 2010-12-03 15:41:52.049372966 +0900
660+++ b/storage/innobase/include/trx0trx.h 2010-12-03 17:42:42.107024532 +0900
7023c87b 661@@ -738,6 +738,17 @@
d4e9320e
AM
662 /*------------------------------*/
663 char detailed_error[256]; /*!< detailed error message for last
664 error, or empty. */
665+ /*------------------------------*/
666+ ulint io_reads;
667+ ib_uint64_t io_read;
668+ ulint io_reads_wait_timer;
669+ ib_uint64_t lock_que_wait_ustarted;
670+ ulint lock_que_wait_timer;
671+ ulint innodb_que_wait_timer;
672+ ulint distinct_page_access;
673+#define DPAH_SIZE 8192
674+ byte* distinct_page_access_hash;
675+ ibool take_stats;
676 };
677
678 #define TRX_MAX_N_THREADS 32 /* maximum number of
b4e1fa2c
AM
679diff -ruN a/storage/innobase/lock/lock0lock.c b/storage/innobase/lock/lock0lock.c
680--- a/storage/innobase/lock/lock0lock.c 2010-12-03 15:09:51.297986437 +0900
681+++ b/storage/innobase/lock/lock0lock.c 2010-12-03 17:42:42.111024587 +0900
682@@ -1755,6 +1755,8 @@
d4e9320e
AM
683 {
684 lock_t* lock;
685 trx_t* trx;
686+ ulint sec;
687+ ulint ms;
688
689 ut_ad(mutex_own(&kernel_mutex));
690
b4e1fa2c 691@@ -1813,6 +1815,10 @@
d4e9320e
AM
692 trx->que_state = TRX_QUE_LOCK_WAIT;
693 trx->was_chosen_as_deadlock_victim = FALSE;
694 trx->wait_started = time(NULL);
695+ if (innobase_get_slow_log() && trx->take_stats) {
696+ ut_usectime(&sec, &ms);
697+ trx->lock_que_wait_ustarted = (ib_uint64_t)sec * 1000000 + ms;
698+ }
699
700 ut_a(que_thr_stop(thr));
701
b4e1fa2c 702@@ -3692,6 +3698,8 @@
d4e9320e
AM
703 {
704 lock_t* lock;
705 trx_t* trx;
706+ ulint sec;
707+ ulint ms;
708
709 ut_ad(mutex_own(&kernel_mutex));
710
b4e1fa2c 711@@ -3747,6 +3755,10 @@
d4e9320e
AM
712 return(DB_SUCCESS);
713 }
714
715+ if (innobase_get_slow_log() && trx->take_stats) {
716+ ut_usectime(&sec, &ms);
717+ trx->lock_que_wait_ustarted = (ib_uint64_t)sec * 1000000 + ms;
718+ }
719 trx->que_state = TRX_QUE_LOCK_WAIT;
720 trx->was_chosen_as_deadlock_victim = FALSE;
721 trx->wait_started = time(NULL);
b4e1fa2c
AM
722diff -ruN a/storage/innobase/os/os0file.c b/storage/innobase/os/os0file.c
723--- a/storage/innobase/os/os0file.c 2010-12-03 17:32:15.644024974 +0900
724+++ b/storage/innobase/os/os0file.c 2010-12-03 17:42:42.117023467 +0900
725@@ -43,6 +43,8 @@
d4e9320e
AM
726 #include "srv0start.h"
727 #include "fil0fil.h"
728 #include "buf0buf.h"
729+#include "trx0sys.h"
730+#include "trx0trx.h"
731 #include "log0recv.h"
732 #ifndef UNIV_HOTBACKUP
733 # include "os0sync.h"
b4e1fa2c 734@@ -2177,13 +2179,18 @@
d4e9320e
AM
735 ulint n, /*!< in: number of bytes to read */
736 ulint offset, /*!< in: least significant 32 bits of file
737 offset from where to read */
738- ulint offset_high) /*!< in: most significant 32 bits of
739+ ulint offset_high, /*!< in: most significant 32 bits of
740 offset */
741+ trx_t* trx)
742 {
743 off_t offs;
744 #if defined(HAVE_PREAD) && !defined(HAVE_BROKEN_PREAD)
745 ssize_t n_bytes;
746 #endif /* HAVE_PREAD && !HAVE_BROKEN_PREAD */
747+ ulint sec;
748+ ulint ms;
749+ ib_uint64_t start_time;
750+ ib_uint64_t finish_time;
751
752 ut_a((offset & 0xFFFFFFFFUL) == offset);
753
b4e1fa2c 754@@ -2204,6 +2211,15 @@
d4e9320e
AM
755
756 os_n_file_reads++;
757
758+ if (innobase_get_slow_log() && trx && trx->take_stats)
759+ {
760+ trx->io_reads++;
761+ trx->io_read += n;
762+ ut_usectime(&sec, &ms);
763+ start_time = (ib_uint64_t)sec * 1000000 + ms;
764+ } else {
765+ start_time = 0;
766+ }
767 #if defined(HAVE_PREAD) && !defined(HAVE_BROKEN_PREAD)
768 os_mutex_enter(os_file_count_mutex);
769 os_file_n_pending_preads++;
b4e1fa2c 770@@ -2217,6 +2233,13 @@
d4e9320e
AM
771 os_n_pending_reads--;
772 os_mutex_exit(os_file_count_mutex);
773
774+ if (innobase_get_slow_log() && trx && trx->take_stats && start_time)
775+ {
776+ ut_usectime(&sec, &ms);
777+ finish_time = (ib_uint64_t)sec * 1000000 + ms;
778+ trx->io_reads_wait_timer += (ulint)(finish_time - start_time);
779+ }
780+
781 return(n_bytes);
782 #else
783 {
b4e1fa2c 784@@ -2253,6 +2276,13 @@
d4e9320e
AM
785 os_n_pending_reads--;
786 os_mutex_exit(os_file_count_mutex);
787
788+ if (innobase_get_slow_log() && trx && trx->take_stats && start_time)
789+ {
790+ ut_usectime(&sec, &ms);
791+ finish_time = (ib_uint64_t)sec * 1000000 + ms;
792+ trx->io_reads_wait_timer += (ulint)(finish_time - start_time);
793+ }
794+
795 return(ret);
796 }
797 #endif
b4e1fa2c 798@@ -2393,7 +2423,8 @@
d4e9320e
AM
799 offset where to read */
800 ulint offset_high, /*!< in: most significant 32 bits of
801 offset */
802- ulint n) /*!< in: number of bytes to read */
803+ ulint n, /*!< in: number of bytes to read */
804+ trx_t* trx)
805 {
806 #ifdef __WIN__
807 BOOL ret;
b4e1fa2c 808@@ -2468,7 +2499,7 @@
d4e9320e
AM
809 os_bytes_read_since_printout += n;
810
811 try_again:
812- ret = os_file_pread(file, buf, n, offset, offset_high);
b4e1fa2c 813+ ret = os_file_pread(file, buf, n, offset, offset_high, trx);
d4e9320e
AM
814
815 if ((ulint)ret == n) {
816
b4e1fa2c
AM
817@@ -2597,7 +2628,7 @@
818 os_bytes_read_since_printout += n;
819
820 try_again:
821- ret = os_file_pread(file, buf, n, offset, offset_high);
822+ ret = os_file_pread(file, buf, n, offset, offset_high, NULL);
823
824 if ((ulint)ret == n) {
825
826@@ -3619,7 +3650,8 @@
d4e9320e
AM
827 offset */
828 ulint offset_high, /*!< in: most significant 32 bits of
829 offset */
830- ulint len) /*!< in: length of the block to read or write */
831+ ulint len, /*!< in: length of the block to read or write */
832+ trx_t* trx)
833 {
b4e1fa2c
AM
834 os_aio_slot_t* slot = NULL;
835 #ifdef WIN_ASYNC_IO
836@@ -3991,10 +4023,11 @@
d4e9320e
AM
837 (can be used to identify a completed
838 aio operation); ignored if mode is
839 OS_AIO_SYNC */
840- void* message2)/*!< in: message for the aio handler
841+ void* message2,/*!< in: message for the aio handler
842 (can be used to identify a completed
843 aio operation); ignored if mode is
844 OS_AIO_SYNC */
845+ trx_t* trx)
846 {
847 os_aio_array_t* array;
848 os_aio_slot_t* slot;
b4e1fa2c 849@@ -4035,8 +4068,8 @@
d4e9320e
AM
850 wait in the Windows case. */
851
852 if (type == OS_FILE_READ) {
853- return(os_file_read(file, buf, offset,
854- offset_high, n));
b4e1fa2c 855+ return(os_file_read_trx(file, buf, offset,
d4e9320e
AM
856+ offset_high, n, trx));
857 }
858
859 ut_a(type == OS_FILE_WRITE);
b4e1fa2c 860@@ -4074,8 +4107,13 @@
d4e9320e
AM
861 ut_error;
862 }
863
864+ if (trx && type == OS_FILE_READ)
865+ {
866+ trx->io_reads++;
867+ trx->io_read += n;
868+ }
869 slot = os_aio_array_reserve_slot(type, array, message1, message2, file,
870- name, buf, offset, offset_high, n);
871+ name, buf, offset, offset_high, n, trx);
872 if (type == OS_FILE_READ) {
b4e1fa2c
AM
873 if (srv_use_native_aio) {
874 os_n_file_reads++;
875diff -ruN a/storage/innobase/srv/srv0srv.c b/storage/innobase/srv/srv0srv.c
876--- a/storage/innobase/srv/srv0srv.c 2010-12-03 17:32:15.648024399 +0900
877+++ b/storage/innobase/srv/srv0srv.c 2010-12-03 17:45:05.067023254 +0900
878@@ -88,6 +88,9 @@
879 #include "mysql/plugin.h"
880 #include "mysql/service_thd_wait.h"
d4e9320e
AM
881
882+/* prototypes for new functions added to ha_innodb.cc */
883+ibool innobase_get_slow_log();
884+
885 /* This is set to TRUE if the MySQL user has set it in MySQL; currently
886 affects only FOREIGN KEY definition parsing */
887 UNIV_INTERN ibool srv_lower_case_table_names = FALSE;
b4e1fa2c 888@@ -1219,6 +1222,10 @@
d4e9320e
AM
889 ibool has_slept = FALSE;
890 srv_conc_slot_t* slot = NULL;
891 ulint i;
892+ ib_uint64_t start_time = 0L;
893+ ib_uint64_t finish_time = 0L;
894+ ulint sec;
895+ ulint ms;
896
897 if (trx->mysql_thd != NULL
898 && thd_is_replication_slave_thread(trx->mysql_thd)) {
b4e1fa2c 899@@ -1295,6 +1302,7 @@
d4e9320e
AM
900 switches. */
901 if (SRV_THREAD_SLEEP_DELAY > 0) {
902 os_thread_sleep(SRV_THREAD_SLEEP_DELAY);
903+ trx->innodb_que_wait_timer += SRV_THREAD_SLEEP_DELAY;
904 }
905
906 trx->op_info = "";
b4e1fa2c 907@@ -1350,6 +1358,13 @@
d4e9320e
AM
908 /* Go to wait for the event; when a thread leaves InnoDB it will
909 release this thread */
910
911+ if (innobase_get_slow_log() && trx->take_stats) {
912+ ut_usectime(&sec, &ms);
913+ start_time = (ib_uint64_t)sec * 1000000 + ms;
914+ } else {
915+ start_time = 0;
916+ }
917+
918 trx->op_info = "waiting in InnoDB queue";
919
b4e1fa2c
AM
920 thd_wait_begin(trx->mysql_thd, THD_WAIT_ROW_TABLE_LOCK);
921@@ -1358,6 +1373,12 @@
d4e9320e
AM
922
923 trx->op_info = "";
924
925+ if (innobase_get_slow_log() && trx->take_stats && start_time) {
926+ ut_usectime(&sec, &ms);
927+ finish_time = (ib_uint64_t)sec * 1000000 + ms;
928+ trx->innodb_que_wait_timer += (ulint)(finish_time - start_time);
929+ }
930+
931 os_fast_mutex_lock(&srv_conc_mutex);
932
933 srv_conc_n_waiting_threads--;
b4e1fa2c
AM
934diff -ruN a/storage/innobase/trx/trx0trx.c b/storage/innobase/trx/trx0trx.c
935--- a/storage/innobase/trx/trx0trx.c 2010-12-03 15:41:52.053955669 +0900
936+++ b/storage/innobase/trx/trx0trx.c 2010-12-03 17:42:42.127023410 +0900
937@@ -185,6 +185,15 @@
d4e9320e
AM
938 trx->global_read_view = NULL;
939 trx->read_view = NULL;
940
941+ trx->io_reads = 0;
942+ trx->io_read = 0;
943+ trx->io_reads_wait_timer = 0;
944+ trx->lock_que_wait_timer = 0;
945+ trx->innodb_que_wait_timer = 0;
946+ trx->distinct_page_access = 0;
947+ trx->distinct_page_access_hash = NULL;
948+ trx->take_stats = FALSE;
949+
950 /* Set X/Open XA transaction identification to NULL */
951 memset(&trx->xid, 0, sizeof(trx->xid));
952 trx->xid.formatID = -1;
b4e1fa2c 953@@ -222,6 +231,11 @@
d4e9320e
AM
954
955 trx->mysql_process_no = os_proc_get_number();
956
957+ if (innobase_get_slow_log() && trx->take_stats) {
958+ trx->distinct_page_access_hash = mem_alloc(DPAH_SIZE);
959+ memset(trx->distinct_page_access_hash, 0, DPAH_SIZE);
960+ }
961+
962 return(trx);
963 }
964
b4e1fa2c 965@@ -353,6 +367,12 @@
d4e9320e
AM
966 /*===============*/
967 trx_t* trx) /*!< in, own: trx object */
968 {
969+ if (trx->distinct_page_access_hash)
970+ {
971+ mem_free(trx->distinct_page_access_hash);
972+ trx->distinct_page_access_hash= NULL;
973+ }
974+
975 mutex_enter(&kernel_mutex);
976
977 UT_LIST_REMOVE(mysql_trx_list, trx_sys->mysql_trx_list, trx);
b4e1fa2c 978@@ -374,6 +394,12 @@
d4e9320e
AM
979 /*====================*/
980 trx_t* trx) /*!< in, own: trx object */
981 {
982+ if (trx->distinct_page_access_hash)
983+ {
984+ mem_free(trx->distinct_page_access_hash);
985+ trx->distinct_page_access_hash= NULL;
986+ }
987+
988 mutex_enter(&kernel_mutex);
989
990 trx_free(trx);
b4e1fa2c 991@@ -1091,6 +1117,9 @@
d4e9320e
AM
992 trx_t* trx) /*!< in: transaction */
993 {
994 que_thr_t* thr;
995+ ulint sec;
996+ ulint ms;
997+ ib_uint64_t now;
998
999 ut_ad(mutex_own(&kernel_mutex));
1000 ut_ad(trx->que_state == TRX_QUE_LOCK_WAIT);
b4e1fa2c 1001@@ -1105,6 +1134,11 @@
d4e9320e
AM
1002 thr = UT_LIST_GET_FIRST(trx->wait_thrs);
1003 }
1004
1005+ if (innobase_get_slow_log() && trx->take_stats) {
1006+ ut_usectime(&sec, &ms);
1007+ now = (ib_uint64_t)sec * 1000000 + ms;
1008+ trx->lock_que_wait_timer += (ulint)(now - trx->lock_que_wait_ustarted);
1009+ }
1010 trx->que_state = TRX_QUE_RUNNING;
1011 }
1012
b4e1fa2c 1013@@ -1118,6 +1152,9 @@
d4e9320e
AM
1014 trx_t* trx) /*!< in: transaction in the TRX_QUE_LOCK_WAIT state */
1015 {
1016 que_thr_t* thr;
1017+ ulint sec;
1018+ ulint ms;
1019+ ib_uint64_t now;
1020
1021 ut_ad(mutex_own(&kernel_mutex));
1022 ut_ad(trx->que_state == TRX_QUE_LOCK_WAIT);
b4e1fa2c 1023@@ -1132,6 +1169,11 @@
d4e9320e
AM
1024 thr = UT_LIST_GET_FIRST(trx->wait_thrs);
1025 }
1026
1027+ if (innobase_get_slow_log() && trx->take_stats) {
1028+ ut_usectime(&sec, &ms);
1029+ now = (ib_uint64_t)sec * 1000000 + ms;
1030+ trx->lock_que_wait_timer += (ulint)(now - trx->lock_que_wait_ustarted);
1031+ }
1032 trx->que_state = TRX_QUE_RUNNING;
1033 }
1034
This page took 0.139019 seconds and 4 git commands to generate.