1
1
/*****************************************************************************
3
Copyright (c) 2007, 2010, Innobase Oy. All Rights Reserved.
3
Copyright (C) 2007, 2010, Innobase Oy. All Rights Reserved.
5
5
This program is free software; you can redistribute it and/or modify it under
6
6
the terms of the GNU General Public License as published by the Free Software
196
196
code in handler/i_s.cc. */
197
197
UNIV_INTERN trx_i_s_cache_t* trx_i_s_cache = &trx_i_s_cache_static;
199
/* Key to register the lock/mutex with performance schema */
200
#ifdef UNIV_PFS_RWLOCK
201
UNIV_INTERN mysql_pfs_key_t trx_i_s_cache_lock_key;
202
#endif /* UNIV_PFS_RWLOCK */
204
#ifdef UNIV_PFS_MUTEX
205
UNIV_INTERN mysql_pfs_key_t cache_last_read_mutex_key;
206
#endif /* UNIV_PFS_MUTEX */
199
208
/*******************************************************************//**
200
209
For a record lock that is in waiting state retrieves the only bit that
201
210
is set, for a table lock returns ULINT_UNDEFINED.
424
/*******************************************************************//**
425
Validates a row in the locks cache.
426
@return TRUE if valid */
429
i_s_locks_row_validate(
430
/*===================*/
431
const i_s_locks_row_t* row) /*!< in: row to validate */
433
ut_ad(row->lock_trx_id != 0);
434
ut_ad(row->lock_mode != NULL);
435
ut_ad(row->lock_type != NULL);
436
ut_ad(row->lock_table != NULL);
437
ut_ad(row->lock_table_id != 0);
439
if (row->lock_space == ULINT_UNDEFINED) {
441
ut_ad(!strcmp("TABLE", row->lock_type));
442
ut_ad(row->lock_index == NULL);
443
ut_ad(row->lock_data == NULL);
444
ut_ad(row->lock_page == ULINT_UNDEFINED);
445
ut_ad(row->lock_rec == ULINT_UNDEFINED);
448
ut_ad(!strcmp("RECORD", row->lock_type));
449
ut_ad(row->lock_index != NULL);
450
ut_ad(row->lock_data != NULL);
451
ut_ad(row->lock_page != ULINT_UNDEFINED);
452
ut_ad(row->lock_rec != ULINT_UNDEFINED);
457
#endif /* UNIV_DEBUG */
414
459
/*******************************************************************//**
415
460
Fills i_s_trx_row_t object.
416
461
If memory can not be allocated then FALSE is returned.
435
480
const char* stmt;
438
row->trx_id = trx_get_id(trx);
484
ut_ad(mutex_own(&kernel_mutex));
486
row->trx_id = trx->id;
439
487
row->trx_started = (ib_time_t) trx->start_time;
440
488
row->trx_state = trx_get_que_state_str(trx);
489
row->requested_lock_row = requested_lock_row;
490
ut_ad(requested_lock_row == NULL
491
|| i_s_locks_row_validate(requested_lock_row));
442
493
if (trx->wait_lock != NULL) {
444
494
ut_a(requested_lock_row != NULL);
446
row->requested_lock_row = requested_lock_row;
447
495
row->trx_wait_started = (ib_time_t) trx->wait_started;
450
497
ut_a(requested_lock_row == NULL);
452
row->requested_lock_row = NULL;
453
498
row->trx_wait_started = 0;
456
row->trx_weight = (ullint) ut_conv_dulint_to_longlong(TRX_WEIGHT(trx));
501
row->trx_weight = (ullint) TRX_WEIGHT(trx);
458
503
if (trx->mysql_thd == NULL) {
459
504
/* For internal transactions e.g., purge and transactions
460
505
being recovered at startup there is no associated MySQL
461
506
thread data structure. */
462
507
row->trx_mysql_thread_id = 0;
463
row->trx_query = NULL;
508
row->trx_query = NULL;
467
row->trx_mysql_thread_id = session_get_thread_id(trx->mysql_thd);
468
stmt = innobase_get_stmt(trx->mysql_thd, &stmt_len);
512
row->trx_mysql_thread_id = trx->session()->getSessionId();
513
stmt= trx->mysql_thd->getQueryStringCopy(stmt_len);
470
515
if (stmt != NULL) {
478
523
memcpy(query, stmt, stmt_len);
479
524
query[stmt_len] = '\0';
481
row->trx_query = ha_storage_put_memlim(
526
row->trx_query = static_cast<const char *>(ha_storage_put_memlim(
482
527
cache->storage, stmt, stmt_len + 1,
483
MAX_ALLOWED_FOR_STORAGE(cache));
528
MAX_ALLOWED_FOR_STORAGE(cache)));
485
530
if (row->trx_query == NULL) {
491
536
row->trx_query = NULL;
542
if (s != NULL && s[0] != '\0') {
544
TRX_I_S_STRING_COPY(s, row->trx_operation_state,
545
TRX_I_S_TRX_OP_STATE_MAX_LEN, cache);
547
if (row->trx_operation_state == NULL) {
553
row->trx_operation_state = NULL;
556
// row->trx_tables_in_use = trx->n_mysql_tables_in_use;
558
row->trx_tables_locked = trx->mysql_n_tables_locked;
560
row->trx_lock_structs = UT_LIST_GET_LEN(trx->trx_locks);
562
row->trx_lock_memory_bytes = mem_heap_get_size(trx->lock_heap);
564
row->trx_rows_locked = lock_number_of_rows_locked(trx);
566
row->trx_rows_modified = trx->undo_no;
568
row->trx_concurrency_tickets = trx->n_tickets_to_enter_innodb;
570
switch (trx->isolation_level) {
571
case TRX_ISO_READ_UNCOMMITTED:
572
row->trx_isolation_level = "READ UNCOMMITTED";
574
case TRX_ISO_READ_COMMITTED:
575
row->trx_isolation_level = "READ COMMITTED";
577
case TRX_ISO_REPEATABLE_READ:
578
row->trx_isolation_level = "REPEATABLE READ";
580
case TRX_ISO_SERIALIZABLE:
581
row->trx_isolation_level = "SERIALIZABLE";
583
/* Should not happen as TRX_ISO_READ_COMMITTED is default */
585
row->trx_isolation_level = "UNKNOWN";
588
row->trx_unique_checks = (ibool) trx->check_unique_secondary;
590
row->trx_foreign_key_checks = (ibool) trx->check_foreigns;
592
s = trx->detailed_error;
594
if (s != NULL && s[0] != '\0') {
596
TRX_I_S_STRING_COPY(s,
597
row->trx_foreign_key_error,
598
TRX_I_S_TRX_FK_ERROR_MAX_LEN, cache);
600
if (row->trx_foreign_key_error == NULL) {
605
row->trx_foreign_key_error = NULL;
608
row->trx_has_search_latch = (ibool) trx->has_search_latch;
610
row->trx_search_latch_timeout = trx->search_latch_timeout;
880
1003
/* auxiliary variable */
882
1005
/* assertion on every traversed item */
1006
ut_ad(i_s_locks_row_validate(hash_chain->value)),
884
1007
/* this determines if we have found the lock */
885
1008
locks_row_eq_lock(hash_chain->value, lock, heap_no));
1254
1379
release trx_i_s_cache_t::last_read_mutex
1255
1380
release trx_i_s_cache_t::rw_lock */
1257
rw_lock_create(&cache->rw_lock, SYNC_TRX_I_S_RWLOCK);
1382
rw_lock_create(trx_i_s_cache_lock_key, &cache->rw_lock,
1383
SYNC_TRX_I_S_RWLOCK);
1259
1385
cache->last_read = 0;
1261
mutex_create(&cache->last_read_mutex, SYNC_TRX_I_S_LAST_READ);
1387
mutex_create(cache_last_read_mutex_key,
1388
&cache->last_read_mutex, SYNC_TRX_I_S_LAST_READ);
1263
1390
table_cache_init(&cache->innodb_trx, sizeof(i_s_trx_row_t));
1264
1391
table_cache_init(&cache->innodb_locks, sizeof(i_s_locks_row_t));