]>
Commit | Line | Data |
---|---|---|
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 |
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 | |
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; | |
d8778560 | 40 | + if (block_hash_byte >= DPAH_SIZE) |
d4e9320e | 41 | + fprintf(stderr, "!!! block_hash_byte = %lu block_hash_offset = %d !!!\n", block_hash_byte, block_hash_offset); |
d8778560 | 42 | + if (block_hash_offset > 7) |
d4e9320e AM |
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 | |
df1b5770 | 52 | @@ -2399,11 +2433,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 (;;) { | |
df1b5770 | 72 | @@ -2421,7 +2463,7 @@ |
b4e1fa2c AM |
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()); | |
df1b5770 | 81 | @@ -2498,6 +2540,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 | ||
df1b5770 | 95 | @@ -2512,6 +2561,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 | |
df1b5770 | 108 | @@ -2824,6 +2879,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); | |
df1b5770 | 120 | @@ -2842,6 +2902,9 @@ |
d8778560 AM |
121 | ut_ad(!ibuf_inside() || ibuf_page_low(space, zip_size, offset, |
122 | FALSE, file, line, NULL)); | |
d4e9320e AM |
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: |
df1b5770 | 130 | @@ -2915,7 +2978,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; | |
d8778560 | 139 | @@ -3217,6 +3280,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 | ||
d8778560 | 153 | @@ -3231,6 +3301,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; | |
d8778560 | 166 | @@ -3256,13 +3332,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 | ||
d8778560 | 185 | @@ -3286,6 +3366,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); | |
d8778560 | 193 | @@ -3363,13 +3444,17 @@ |
df1b5770 | 194 | #if defined UNIV_DEBUG_FILE_ACCESSES || defined UNIV_DEBUG |
d4e9320e AM |
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 | |
d8778560 | 212 | @@ -3379,6 +3464,9 @@ |
b4e1fa2c | 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 | ||
d8778560 | 222 | @@ -3401,6 +3489,7 @@ |
b4e1fa2c | 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); | |
d8778560 | 230 | @@ -3487,6 +3576,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 |
242 | diff -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 |
338 | diff -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 | |
d8778560 | 341 | @@ -4423,7 +4423,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; | |
d8778560 | 350 | @@ -4750,7 +4750,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 | |
d8778560 | 359 | @@ -4775,8 +4775,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; | |
d8778560 | 370 | @@ -4946,7 +4947,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 |
379 | diff -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 | |
df1b5770 | 382 | @@ -1546,6 +1546,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 | ||
df1b5770 | 399 | @@ -1600,6 +1610,32 @@ |
b4e1fa2c | 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 */ | |
df1b5770 | 432 | @@ -9280,6 +9316,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 |
458 | diff -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 |
490 | diff -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 |
518 | diff -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) \ | |
d8778560 | 569 | @@ -692,6 +700,7 @@ |
b4e1fa2c AM |
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 | ||
d8778560 | 577 | @@ -746,6 +755,7 @@ |
b4e1fa2c AM |
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 | /*******************************************************************//** | |
d8778560 | 585 | @@ -887,7 +897,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 | |
d8778560 | 595 | @@ -1046,10 +1057,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 |
608 | diff -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 | ||
645 | diff -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 | + | |
d8778560 AM |
655 | /* This is set to the MySQL server value for this variable. */ |
656 | extern uint srv_lower_case_table_names; | |
d4e9320e | 657 | |
b4e1fa2c AM |
658 | diff -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 |
679 | diff -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 | ||
d8778560 | 702 | @@ -3764,6 +3770,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 | ||
d8778560 | 711 | @@ -3819,6 +3827,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 |
722 | diff -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" | |
d8778560 | 734 | @@ -2202,13 +2204,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 | ||
d8778560 | 754 | @@ -2229,6 +2236,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++; | |
d8778560 | 770 | @@ -2242,6 +2258,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 | { | |
d8778560 | 784 | @@ -2278,6 +2301,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 | |
d8778560 | 798 | @@ -2418,7 +2448,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; | |
d8778560 | 808 | @@ -2493,7 +2524,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 | ||
d8778560 | 817 | @@ -2622,7 +2653,7 @@ |
b4e1fa2c AM |
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 | ||
d8778560 | 826 | @@ -4016,10 +4047,11 @@ |
d4e9320e AM |
827 | (can be used to identify a completed |
828 | aio operation); ignored if mode is | |
829 | OS_AIO_SYNC */ | |
830 | - void* message2)/*!< in: message for the aio handler | |
831 | + void* message2,/*!< in: message for the aio handler | |
832 | (can be used to identify a completed | |
833 | aio operation); ignored if mode is | |
834 | OS_AIO_SYNC */ | |
835 | + trx_t* trx) | |
836 | { | |
837 | os_aio_array_t* array; | |
838 | os_aio_slot_t* slot; | |
d8778560 | 839 | @@ -4060,8 +4092,8 @@ |
d4e9320e AM |
840 | wait in the Windows case. */ |
841 | ||
842 | if (type == OS_FILE_READ) { | |
843 | - return(os_file_read(file, buf, offset, | |
844 | - offset_high, n)); | |
b4e1fa2c | 845 | + return(os_file_read_trx(file, buf, offset, |
d4e9320e AM |
846 | + offset_high, n, trx)); |
847 | } | |
848 | ||
849 | ut_a(type == OS_FILE_WRITE); | |
d8778560 | 850 | @@ -4099,6 +4131,11 @@ |
d4e9320e AM |
851 | ut_error; |
852 | } | |
853 | ||
854 | + if (trx && type == OS_FILE_READ) | |
855 | + { | |
856 | + trx->io_reads++; | |
857 | + trx->io_read += n; | |
858 | + } | |
859 | slot = os_aio_array_reserve_slot(type, array, message1, message2, file, | |
d8778560 | 860 | name, buf, offset, offset_high, n); |
d4e9320e | 861 | if (type == OS_FILE_READ) { |
b4e1fa2c AM |
862 | diff -ruN a/storage/innobase/srv/srv0srv.c b/storage/innobase/srv/srv0srv.c |
863 | --- a/storage/innobase/srv/srv0srv.c 2010-12-03 17:32:15.648024399 +0900 | |
864 | +++ b/storage/innobase/srv/srv0srv.c 2010-12-03 17:45:05.067023254 +0900 | |
865 | @@ -88,6 +88,9 @@ | |
866 | #include "mysql/plugin.h" | |
867 | #include "mysql/service_thd_wait.h" | |
d4e9320e AM |
868 | |
869 | +/* prototypes for new functions added to ha_innodb.cc */ | |
870 | +ibool innobase_get_slow_log(); | |
871 | + | |
d8778560 AM |
872 | /* This is set to the MySQL server value for this variable. It is only |
873 | needed for FOREIGN KEY definition parsing since FOREIGN KEY names are not | |
874 | stored in the server metadata. The server stores and enforces it for | |
df1b5770 | 875 | @@ -1257,6 +1260,10 @@ |
d4e9320e AM |
876 | ibool has_slept = FALSE; |
877 | srv_conc_slot_t* slot = NULL; | |
878 | ulint i; | |
879 | + ib_uint64_t start_time = 0L; | |
880 | + ib_uint64_t finish_time = 0L; | |
881 | + ulint sec; | |
882 | + ulint ms; | |
883 | ||
884 | if (trx->mysql_thd != NULL | |
885 | && thd_is_replication_slave_thread(trx->mysql_thd)) { | |
df1b5770 | 886 | @@ -1333,6 +1340,7 @@ |
d4e9320e AM |
887 | switches. */ |
888 | if (SRV_THREAD_SLEEP_DELAY > 0) { | |
889 | os_thread_sleep(SRV_THREAD_SLEEP_DELAY); | |
890 | + trx->innodb_que_wait_timer += SRV_THREAD_SLEEP_DELAY; | |
891 | } | |
892 | ||
893 | trx->op_info = ""; | |
df1b5770 | 894 | @@ -1388,6 +1396,13 @@ |
d4e9320e AM |
895 | /* Go to wait for the event; when a thread leaves InnoDB it will |
896 | release this thread */ | |
897 | ||
898 | + if (innobase_get_slow_log() && trx->take_stats) { | |
899 | + ut_usectime(&sec, &ms); | |
900 | + start_time = (ib_uint64_t)sec * 1000000 + ms; | |
901 | + } else { | |
902 | + start_time = 0; | |
903 | + } | |
904 | + | |
905 | trx->op_info = "waiting in InnoDB queue"; | |
906 | ||
b4e1fa2c | 907 | thd_wait_begin(trx->mysql_thd, THD_WAIT_ROW_TABLE_LOCK); |
df1b5770 | 908 | @@ -1396,6 +1411,12 @@ |
d4e9320e AM |
909 | |
910 | trx->op_info = ""; | |
911 | ||
912 | + if (innobase_get_slow_log() && trx->take_stats && start_time) { | |
913 | + ut_usectime(&sec, &ms); | |
914 | + finish_time = (ib_uint64_t)sec * 1000000 + ms; | |
915 | + trx->innodb_que_wait_timer += (ulint)(finish_time - start_time); | |
916 | + } | |
917 | + | |
918 | os_fast_mutex_lock(&srv_conc_mutex); | |
919 | ||
920 | srv_conc_n_waiting_threads--; | |
b4e1fa2c AM |
921 | diff -ruN a/storage/innobase/trx/trx0trx.c b/storage/innobase/trx/trx0trx.c |
922 | --- a/storage/innobase/trx/trx0trx.c 2010-12-03 15:41:52.053955669 +0900 | |
923 | +++ b/storage/innobase/trx/trx0trx.c 2010-12-03 17:42:42.127023410 +0900 | |
924 | @@ -185,6 +185,15 @@ | |
d4e9320e AM |
925 | trx->global_read_view = NULL; |
926 | trx->read_view = NULL; | |
927 | ||
928 | + trx->io_reads = 0; | |
929 | + trx->io_read = 0; | |
930 | + trx->io_reads_wait_timer = 0; | |
931 | + trx->lock_que_wait_timer = 0; | |
932 | + trx->innodb_que_wait_timer = 0; | |
933 | + trx->distinct_page_access = 0; | |
934 | + trx->distinct_page_access_hash = NULL; | |
935 | + trx->take_stats = FALSE; | |
936 | + | |
937 | /* Set X/Open XA transaction identification to NULL */ | |
938 | memset(&trx->xid, 0, sizeof(trx->xid)); | |
939 | trx->xid.formatID = -1; | |
b4e1fa2c | 940 | @@ -222,6 +231,11 @@ |
d4e9320e AM |
941 | |
942 | trx->mysql_process_no = os_proc_get_number(); | |
943 | ||
944 | + if (innobase_get_slow_log() && trx->take_stats) { | |
945 | + trx->distinct_page_access_hash = mem_alloc(DPAH_SIZE); | |
946 | + memset(trx->distinct_page_access_hash, 0, DPAH_SIZE); | |
947 | + } | |
948 | + | |
949 | return(trx); | |
950 | } | |
951 | ||
b4e1fa2c | 952 | @@ -353,6 +367,12 @@ |
d4e9320e AM |
953 | /*===============*/ |
954 | trx_t* trx) /*!< in, own: trx object */ | |
955 | { | |
956 | + if (trx->distinct_page_access_hash) | |
957 | + { | |
958 | + mem_free(trx->distinct_page_access_hash); | |
959 | + trx->distinct_page_access_hash= NULL; | |
960 | + } | |
961 | + | |
962 | mutex_enter(&kernel_mutex); | |
963 | ||
964 | UT_LIST_REMOVE(mysql_trx_list, trx_sys->mysql_trx_list, trx); | |
b4e1fa2c | 965 | @@ -374,6 +394,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 | trx_free(trx); | |
b4e1fa2c | 978 | @@ -1091,6 +1117,9 @@ |
d4e9320e AM |
979 | trx_t* trx) /*!< in: transaction */ |
980 | { | |
981 | que_thr_t* thr; | |
982 | + ulint sec; | |
983 | + ulint ms; | |
984 | + ib_uint64_t now; | |
985 | ||
986 | ut_ad(mutex_own(&kernel_mutex)); | |
987 | ut_ad(trx->que_state == TRX_QUE_LOCK_WAIT); | |
b4e1fa2c | 988 | @@ -1105,6 +1134,11 @@ |
d4e9320e AM |
989 | thr = UT_LIST_GET_FIRST(trx->wait_thrs); |
990 | } | |
991 | ||
992 | + if (innobase_get_slow_log() && trx->take_stats) { | |
993 | + ut_usectime(&sec, &ms); | |
994 | + now = (ib_uint64_t)sec * 1000000 + ms; | |
995 | + trx->lock_que_wait_timer += (ulint)(now - trx->lock_que_wait_ustarted); | |
996 | + } | |
997 | trx->que_state = TRX_QUE_RUNNING; | |
998 | } | |
999 | ||
b4e1fa2c | 1000 | @@ -1118,6 +1152,9 @@ |
d4e9320e AM |
1001 | trx_t* trx) /*!< in: transaction in the TRX_QUE_LOCK_WAIT state */ |
1002 | { | |
1003 | que_thr_t* thr; | |
1004 | + ulint sec; | |
1005 | + ulint ms; | |
1006 | + ib_uint64_t now; | |
1007 | ||
1008 | ut_ad(mutex_own(&kernel_mutex)); | |
1009 | ut_ad(trx->que_state == TRX_QUE_LOCK_WAIT); | |
b4e1fa2c | 1010 | @@ -1132,6 +1169,11 @@ |
d4e9320e AM |
1011 | thr = UT_LIST_GET_FIRST(trx->wait_thrs); |
1012 | } | |
1013 | ||
1014 | + if (innobase_get_slow_log() && trx->take_stats) { | |
1015 | + ut_usectime(&sec, &ms); | |
1016 | + now = (ib_uint64_t)sec * 1000000 + ms; | |
1017 | + trx->lock_que_wait_timer += (ulint)(now - trx->lock_que_wait_ustarted); | |
1018 | + } | |
1019 | trx->que_state = TRX_QUE_RUNNING; | |
1020 | } | |
1021 |