Commit 98207ad5 authored by Marko Mäkelä's avatar Marko Mäkelä

Register waits in PERFORMANCE_SCHEMA even before trylock

parent 1218f68b
UPDATE performance_schema.setup_instruments SET enabled = 'NO', timed = 'YES';
UPDATE performance_schema.setup_instruments SET enabled = 'YES'
WHERE name like 'wait/synch/sxlock/%';
select distinct name from performance_schema.setup_instruments
where name like "wait/synch/rwlock/innodb%"
and name!='wait/synch/rwlock/innodb/btr_search_latch' order by name;
name
wait/synch/rwlock/innodb/dict_operation_lock
wait/synch/rwlock/innodb/fil_space_latch
wait/synch/rwlock/innodb/trx_i_s_cache_lock
wait/synch/rwlock/innodb/trx_purge_latch
select distinct name from performance_schema.rwlock_instances
where name like 'wait/synch/sxlock/%'
order by name;
TRUNCATE TABLE performance_schema.events_waits_history_long;
TRUNCATE TABLE performance_schema.events_waits_history;
TRUNCATE TABLE performance_schema.events_waits_current;
select name from performance_schema.setup_instruments
where name like "wait/synch/sxlock/%" order by name;
name
wait/synch/sxlock/innodb/index_tree_rw_lock
select name from performance_schema.rwlock_instances
where name in
(
'wait/synch/sxlock/innodb/btr_search_latch',
'wait/synch/sxlock/innodb/checkpoint_lock',
'wait/synch/sxlock/innodb/dict_operation_lock',
'wait/synch/sxlock/innodb/trx_i_s_cache_lock',
'wait/synch/sxlock/innodb/trx_purge_latch'
)
order by name;
name
drop table if exists t1;
create table t1(a int) engine=innodb;
begin;
insert into t1 values (1), (2), (3);
insert into t1 values (1), (2), (3);
insert into t1 values (1), (2), (3);
commit;
drop table t1;
select operation from performance_schema.events_waits_history_long
where event_name like "wait/synch/sxlock/%"
and operation = "shared_lock" limit 1;
operation
shared_lock
select operation from performance_schema.events_waits_history_long
where event_name like "wait/synch/sxlock/%"
and operation = "exclusive_lock" limit 1;
operation
exclusive_lock
UPDATE performance_schema.setup_instruments SET enabled = 'YES', timed = 'YES';
......@@ -11,13 +11,65 @@ UPDATE performance_schema.setup_instruments SET enabled = 'NO', timed = 'YES';
UPDATE performance_schema.setup_instruments SET enabled = 'YES'
WHERE name like 'wait/synch/sxlock/%';
select distinct name from performance_schema.setup_instruments
where name like "wait/synch/rwlock/innodb%"
and name!='wait/synch/rwlock/innodb/btr_search_latch' order by name;
TRUNCATE TABLE performance_schema.events_waits_history_long;
TRUNCATE TABLE performance_schema.events_waits_history;
TRUNCATE TABLE performance_schema.events_waits_current;
select distinct name from performance_schema.rwlock_instances
where name like 'wait/synch/sxlock/%'
# Check some SX-locks classes are instrumented
select name from performance_schema.setup_instruments
where name like "wait/synch/sxlock/%" order by name;
# Check some SX-locks instances are instrumented
select name from performance_schema.rwlock_instances
where name in
(
'wait/synch/sxlock/innodb/btr_search_latch',
'wait/synch/sxlock/innodb/checkpoint_lock',
'wait/synch/sxlock/innodb/dict_operation_lock',
'wait/synch/sxlock/innodb/trx_i_s_cache_lock',
'wait/synch/sxlock/innodb/trx_purge_latch'
)
order by name;
# Some Innodb payload, to produce data
--disable_warnings
drop table if exists t1;
--enable_warnings
create table t1(a int) engine=innodb;
begin;
insert into t1 values (1), (2), (3);
insert into t1 values (1), (2), (3);
insert into t1 values (1), (2), (3);
commit;
drop table t1;
# Make sure some shared_lock operations have been executed
select operation from performance_schema.events_waits_history_long
where event_name like "wait/synch/sxlock/%"
and operation = "shared_lock" limit 1;
# Make sure some exclusive_lock operations have been executed
select operation from performance_schema.events_waits_history_long
where event_name like "wait/synch/sxlock/%"
and operation = "exclusive_lock" limit 1;
# The following operations are not verified in this test:
# - shared_exclusive_lock
# - try_shared_lock
# - try_shared_exclusive_lock
# - try_exclusive_lock
# because to observe them:
# - there must be an actual code path using the operation
# (this affects try operations, which are not all used)
# - there must be a repeatable scenario to trigger the
# code path, to use as payload in the test script
# Cleanup
UPDATE performance_schema.setup_instruments SET enabled = 'YES', timed = 'YES';
......@@ -46,9 +46,6 @@ class srw_mutex
/** Slim reader-writer lock with no recursion */
class srw_lock_low final : private rw_lock
{
#ifdef UNIV_PFS_RWLOCK
friend class srw_lock;
#endif
#ifdef SRW_LOCK_DUMMY
pthread_mutex_t mutex;
pthread_cond_t cond;
......@@ -127,21 +124,18 @@ class srw_lock
template<bool update= false>
void rd_lock(const char *file, unsigned line)
{
uint32_t l;
if (lock.read_trylock(l))
return;
if (pfs_psi)
{
PSI_rwlock_locker_state state;
PSI_rwlock_locker *locker= PSI_RWLOCK_CALL(start_rwlock_rdwait)
(&state, pfs_psi, update ? PSI_RWLOCK_SHAREDLOCK : PSI_RWLOCK_READLOCK,
file, line);
lock.read_lock(l);
lock.rd_lock();
if (locker)
PSI_RWLOCK_CALL(end_rwlock_rdwait)(locker, 0);
return;
}
lock.read_lock(l);
lock.rd_lock();
}
void rd_unlock()
{
......@@ -153,8 +147,6 @@ class srw_lock
{
if (pfs_psi)
{
if (lock.u_lock_try())
return;
PSI_rwlock_locker_state state;
PSI_rwlock_locker *locker= PSI_RWLOCK_CALL(start_rwlock_wrwait)
(&state, pfs_psi, PSI_RWLOCK_SHAREDEXCLUSIVELOCK, file, line);
......@@ -174,8 +166,6 @@ class srw_lock
template<bool update= false>
void wr_lock(const char *file, unsigned line)
{
if (lock.write_trylock())
return;
if (pfs_psi)
{
PSI_rwlock_locker_state state;
......@@ -183,12 +173,12 @@ class srw_lock
(&state, pfs_psi,
update ? PSI_RWLOCK_EXCLUSIVELOCK : PSI_RWLOCK_WRITELOCK,
file, line);
lock.write_lock(false);
lock.wr_lock();
if (locker)
PSI_RWLOCK_CALL(end_rwlock_rdwait)(locker, 0);
return;
}
lock.write_lock(false);
lock.wr_lock();
}
void wr_unlock()
{
......@@ -198,19 +188,17 @@ class srw_lock
}
void u_wr_upgrade(const char *file, unsigned line)
{
if (lock.upgrade_trylock())
return;
if (pfs_psi)
{
PSI_rwlock_locker_state state;
PSI_rwlock_locker *locker= PSI_RWLOCK_CALL(start_rwlock_wrwait)
(&state, pfs_psi, PSI_RWLOCK_WRITELOCK, file, line);
lock.write_lock(true);
lock.u_wr_upgrade();
if (locker)
PSI_RWLOCK_CALL(end_rwlock_rdwait)(locker, 0);
return;
}
lock.write_lock(true);
lock.u_wr_upgrade();
}
bool rd_lock_try() { return lock.rd_lock_try(); }
bool u_lock_try() { return lock.u_lock_try(); }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment