~vlad-lesin/percona-server/pintables

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