Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
M
mariadb
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
mariadb
Commits
7b67a275
Commit
7b67a275
authored
Mar 08, 2010
by
Vladislav Vaintroub
Browse files
Options
Browse Files
Download
Plain Diff
merge
parents
4c9f3504
2399b614
Changes
9
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
765 additions
and
52 deletions
+765
-52
include/mysql/psi/mysql_thread.h
include/mysql/psi/mysql_thread.h
+265
-1
mysql-test/suite/perfschema/r/dml_setup_instruments.result
mysql-test/suite/perfschema/r/dml_setup_instruments.result
+2
-1
mysql-test/suite/perfschema/r/pfs_upgrade.result
mysql-test/suite/perfschema/r/pfs_upgrade.result
+153
-0
mysql-test/suite/perfschema/t/pfs_upgrade.test
mysql-test/suite/perfschema/t/pfs_upgrade.test
+137
-0
scripts/mysql_system_tables.sql
scripts/mysql_system_tables.sql
+79
-5
sql/mdl.cc
sql/mdl.cc
+90
-37
sql/mdl.h
sql/mdl.h
+5
-5
storage/perfschema/pfs_instr.cc
storage/perfschema/pfs_instr.cc
+21
-1
storage/perfschema/unittest/pfs-t.cc
storage/perfschema/unittest/pfs-t.cc
+13
-2
No files found.
include/mysql/psi/mysql_thread.h
View file @
7b67a275
...
...
@@ -106,6 +106,22 @@ struct st_mysql_rwlock
struct
PSI_rwlock
*
m_psi
;
};
/**
An instrumented prlock structure.
@sa mysql_prlock_t
*/
struct
st_mysql_prlock
{
/** The real prlock */
rw_pr_lock_t
m_prlock
;
/**
The instrumentation hook.
Note that this hook is not conditionally defined,
for binary compatibility of the @c mysql_rwlock_t interface.
*/
struct
PSI_rwlock
*
m_psi
;
};
/**
Type of an instrumented rwlock.
@c mysql_rwlock_t is a drop-in replacement for @c pthread_rwlock_t.
...
...
@@ -119,6 +135,20 @@ struct st_mysql_rwlock
*/
typedef
struct
st_mysql_rwlock
mysql_rwlock_t
;
/**
Type of an instrumented prlock.
A prlock is a read write lock that 'prefers readers' (pr).
@c mysql_prlock_t is a drop-in replacement for @c rw_pr_lock_t.
@sa mysql_prlock_init
@sa mysql_prlock_rdlock
@sa mysql_prlock_tryrdlock
@sa mysql_prlock_wrlock
@sa mysql_prlock_trywrlock
@sa mysql_prlock_unlock
@sa mysql_prlock_destroy
*/
typedef
struct
st_mysql_prlock
mysql_prlock_t
;
/**
An instrumented cond structure.
@sa mysql_cond_t
...
...
@@ -281,6 +311,19 @@ typedef struct st_mysql_cond mysql_cond_t;
#define mysql_rwlock_init(K, RW) inline_mysql_rwlock_init(RW)
#endif
/**
@def mysql_prlock_init(K, RW)
Instrumented rw_pr_init.
@c mysql_prlock_init is a replacement for @c rw_pr_init.
@param K The PSI_rwlock_key for this instrumented prlock
@param RW The prlock to initialize
*/
#ifdef HAVE_PSI_INTERFACE
#define mysql_prlock_init(K, RW) inline_mysql_prlock_init(K, RW)
#else
#define mysql_prlock_init(K, RW) inline_mysql_prlock_init(RW)
#endif
/**
@def mysql_rwlock_destroy(RW)
Instrumented rwlock_destroy.
...
...
@@ -289,6 +332,14 @@ typedef struct st_mysql_cond mysql_cond_t;
*/
#define mysql_rwlock_destroy(RW) inline_mysql_rwlock_destroy(RW)
/**
@def mysql_prlock_destroy(RW)
Instrumented rw_pr_destroy.
@c mysql_prlock_destroy is a drop-in replacement
for @c rw_pr_destroy.
*/
#define mysql_prlock_destroy(RW) inline_mysql_prlock_destroy(RW)
/**
@def mysql_rwlock_rdlock(RW)
Instrumented rwlock_rdlock.
...
...
@@ -303,6 +354,20 @@ typedef struct st_mysql_cond mysql_cond_t;
inline_mysql_rwlock_rdlock(RW)
#endif
/**
@def mysql_prlock_rdlock(RW)
Instrumented rw_pr_rdlock.
@c mysql_prlock_rdlock is a drop-in replacement
for @c rw_pr_rdlock.
*/
#ifdef HAVE_PSI_INTERFACE
#define mysql_prlock_rdlock(RW) \
inline_mysql_prlock_rdlock(RW, __FILE__, __LINE__)
#else
#define mysql_prlock_rdlock(RW) \
inline_mysql_prlock_rdlock(RW)
#endif
/**
@def mysql_rwlock_wrlock(RW)
Instrumented rwlock_wrlock.
...
...
@@ -317,6 +382,20 @@ typedef struct st_mysql_cond mysql_cond_t;
inline_mysql_rwlock_wrlock(RW)
#endif
/**
@def mysql_prlock_wrlock(RW)
Instrumented rw_pr_wrlock.
@c mysql_prlock_wrlock is a drop-in replacement
for @c rw_pr_wrlock.
*/
#ifdef HAVE_PSI_INTERFACE
#define mysql_prlock_wrlock(RW) \
inline_mysql_prlock_wrlock(RW, __FILE__, __LINE__)
#else
#define mysql_prlock_wrlock(RW) \
inline_mysql_prlock_wrlock(RW)
#endif
/**
@def mysql_rwlock_tryrdlock(RW)
Instrumented rwlock_tryrdlock.
...
...
@@ -331,6 +410,20 @@ typedef struct st_mysql_cond mysql_cond_t;
inline_mysql_rwlock_tryrdlock(RW)
#endif
/**
@def mysql_prlock_tryrdlock(RW)
Instrumented rw_pr_tryrdlock.
@c mysql_prlock_tryrdlock is a drop-in replacement
for @c rw_pr_tryrdlock.
*/
#ifdef HAVE_PSI_INTERFACE
#define mysql_prlock_tryrdlock(RW) \
inline_mysql_prlock_tryrdlock(RW, __FILE__, __LINE__)
#else
#define mysql_prlock_tryrdlock(RW) \
inline_mysql_prlock_tryrdlock(RW)
#endif
/**
@def mysql_rwlock_trywrlock(RW)
Instrumented rwlock_trywrlock.
...
...
@@ -345,6 +438,20 @@ typedef struct st_mysql_cond mysql_cond_t;
inline_mysql_rwlock_trywrlock(RW)
#endif
/**
@def mysql_prlock_trywrlock(RW)
Instrumented rw_pr_trywrlock.
@c mysql_prlock_trywrlock is a drop-in replacement
for @c rw_pr_trywrlock.
*/
#ifdef HAVE_PSI_INTERFACE
#define mysql_prlock_trywrlock(RW) \
inline_mysql_prlock_trywrlock(RW, __FILE__, __LINE__)
#else
#define mysql_prlock_trywrlock(RW) \
inline_mysql_prlock_trywrlock(RW)
#endif
/**
@def mysql_rwlock_unlock(RW)
Instrumented rwlock_unlock.
...
...
@@ -353,9 +460,17 @@ typedef struct st_mysql_cond mysql_cond_t;
*/
#define mysql_rwlock_unlock(RW) inline_mysql_rwlock_unlock(RW)
/**
@def mysql_prlock_unlock(RW)
Instrumented rw_pr_unlock.
@c mysql_prlock_unlock is a drop-in replacement
for @c rw_pr_unlock.
*/
#define mysql_prlock_unlock(RW) inline_mysql_prlock_unlock(RW)
/**
@def mysql_cond_init(K, C, A)
Instrumented
rwlock
_init.
Instrumented
cond
_init.
@c mysql_cond_init is a replacement for @c pthread_cond_init.
@param C The cond to initialize
@param K The PSI_cond_key for this instrumented cond
...
...
@@ -599,6 +714,21 @@ static inline int inline_mysql_rwlock_init(
return
my_rwlock_init
(
&
that
->
m_rwlock
,
NULL
);
}
static
inline
int
inline_mysql_prlock_init
(
#ifdef HAVE_PSI_INTERFACE
PSI_rwlock_key
key
,
#endif
mysql_prlock_t
*
that
)
{
#ifdef HAVE_PSI_INTERFACE
that
->
m_psi
=
(
PSI_server
?
PSI_server
->
init_rwlock
(
key
,
&
that
->
m_prlock
)
:
NULL
);
#else
that
->
m_psi
=
NULL
;
#endif
return
rw_pr_init
(
&
that
->
m_prlock
);
}
static
inline
int
inline_mysql_rwlock_destroy
(
mysql_rwlock_t
*
that
)
{
...
...
@@ -612,6 +742,19 @@ static inline int inline_mysql_rwlock_destroy(
return
rwlock_destroy
(
&
that
->
m_rwlock
);
}
static
inline
int
inline_mysql_prlock_destroy
(
mysql_prlock_t
*
that
)
{
#ifdef HAVE_PSI_INTERFACE
if
(
likely
(
PSI_server
&&
that
->
m_psi
))
{
PSI_server
->
destroy_rwlock
(
that
->
m_psi
);
that
->
m_psi
=
NULL
;
}
#endif
return
rw_pr_destroy
(
&
that
->
m_prlock
);
}
static
inline
int
inline_mysql_rwlock_rdlock
(
mysql_rwlock_t
*
that
#ifdef HAVE_PSI_INTERFACE
...
...
@@ -638,6 +781,32 @@ static inline int inline_mysql_rwlock_rdlock(
return
result
;
}
static
inline
int
inline_mysql_prlock_rdlock
(
mysql_prlock_t
*
that
#ifdef HAVE_PSI_INTERFACE
,
const
char
*
src_file
,
uint
src_line
#endif
)
{
int
result
;
#ifdef HAVE_PSI_INTERFACE
struct
PSI_rwlock_locker
*
locker
=
NULL
;
if
(
likely
(
PSI_server
&&
that
->
m_psi
))
{
locker
=
PSI_server
->
get_thread_rwlock_locker
(
that
->
m_psi
,
PSI_RWLOCK_READLOCK
);
if
(
likely
(
locker
!=
NULL
))
PSI_server
->
start_rwlock_rdwait
(
locker
,
src_file
,
src_line
);
}
#endif
result
=
rw_pr_rdlock
(
&
that
->
m_prlock
);
#ifdef HAVE_PSI_INTERFACE
if
(
likely
(
locker
!=
NULL
))
PSI_server
->
end_rwlock_rdwait
(
locker
,
result
);
#endif
return
result
;
}
static
inline
int
inline_mysql_rwlock_wrlock
(
mysql_rwlock_t
*
that
#ifdef HAVE_PSI_INTERFACE
...
...
@@ -664,6 +833,32 @@ static inline int inline_mysql_rwlock_wrlock(
return
result
;
}
static
inline
int
inline_mysql_prlock_wrlock
(
mysql_prlock_t
*
that
#ifdef HAVE_PSI_INTERFACE
,
const
char
*
src_file
,
uint
src_line
#endif
)
{
int
result
;
#ifdef HAVE_PSI_INTERFACE
struct
PSI_rwlock_locker
*
locker
=
NULL
;
if
(
likely
(
PSI_server
&&
that
->
m_psi
))
{
locker
=
PSI_server
->
get_thread_rwlock_locker
(
that
->
m_psi
,
PSI_RWLOCK_WRITELOCK
);
if
(
likely
(
locker
!=
NULL
))
PSI_server
->
start_rwlock_wrwait
(
locker
,
src_file
,
src_line
);
}
#endif
result
=
rw_pr_wrlock
(
&
that
->
m_prlock
);
#ifdef HAVE_PSI_INTERFACE
if
(
likely
(
locker
!=
NULL
))
PSI_server
->
end_rwlock_wrwait
(
locker
,
result
);
#endif
return
result
;
}
static
inline
int
inline_mysql_rwlock_tryrdlock
(
mysql_rwlock_t
*
that
#ifdef HAVE_PSI_INTERFACE
...
...
@@ -690,6 +885,32 @@ static inline int inline_mysql_rwlock_tryrdlock(
return
result
;
}
static
inline
int
inline_mysql_prlock_tryrdlock
(
mysql_prlock_t
*
that
#ifdef HAVE_PSI_INTERFACE
,
const
char
*
src_file
,
uint
src_line
#endif
)
{
int
result
;
#ifdef HAVE_PSI_INTERFACE
struct
PSI_rwlock_locker
*
locker
=
NULL
;
if
(
likely
(
PSI_server
&&
that
->
m_psi
))
{
locker
=
PSI_server
->
get_thread_rwlock_locker
(
that
->
m_psi
,
PSI_RWLOCK_TRYREADLOCK
);
if
(
likely
(
locker
!=
NULL
))
PSI_server
->
start_rwlock_rdwait
(
locker
,
src_file
,
src_line
);
}
#endif
result
=
rw_pr_tryrdlock
(
&
that
->
m_prlock
);
#ifdef HAVE_PSI_INTERFACE
if
(
likely
(
locker
!=
NULL
))
PSI_server
->
end_rwlock_rdwait
(
locker
,
result
);
#endif
return
result
;
}
static
inline
int
inline_mysql_rwlock_trywrlock
(
mysql_rwlock_t
*
that
#ifdef HAVE_PSI_INTERFACE
...
...
@@ -716,6 +937,32 @@ static inline int inline_mysql_rwlock_trywrlock(
return
result
;
}
static
inline
int
inline_mysql_prlock_trywrlock
(
mysql_prlock_t
*
that
#ifdef HAVE_PSI_INTERFACE
,
const
char
*
src_file
,
uint
src_line
#endif
)
{
int
result
;
#ifdef HAVE_PSI_INTERFACE
struct
PSI_rwlock_locker
*
locker
=
NULL
;
if
(
likely
(
PSI_server
&&
that
->
m_psi
))
{
locker
=
PSI_server
->
get_thread_rwlock_locker
(
that
->
m_psi
,
PSI_RWLOCK_TRYWRITELOCK
);
if
(
likely
(
locker
!=
NULL
))
PSI_server
->
start_rwlock_wrwait
(
locker
,
src_file
,
src_line
);
}
#endif
result
=
rw_pr_trywrlock
(
&
that
->
m_prlock
);
#ifdef HAVE_PSI_INTERFACE
if
(
likely
(
locker
!=
NULL
))
PSI_server
->
end_rwlock_wrwait
(
locker
,
result
);
#endif
return
result
;
}
static
inline
int
inline_mysql_rwlock_unlock
(
mysql_rwlock_t
*
that
)
{
...
...
@@ -733,6 +980,23 @@ static inline int inline_mysql_rwlock_unlock(
return
result
;
}
static
inline
int
inline_mysql_prlock_unlock
(
mysql_prlock_t
*
that
)
{
int
result
;
#ifdef HAVE_PSI_INTERFACE
struct
PSI_thread
*
thread
;
if
(
likely
(
PSI_server
&&
that
->
m_psi
))
{
thread
=
PSI_server
->
get_thread
();
if
(
likely
(
thread
!=
NULL
))
PSI_server
->
unlock_rwlock
(
thread
,
that
->
m_psi
);
}
#endif
result
=
rw_pr_unlock
(
&
that
->
m_prlock
);
return
result
;
}
static
inline
int
inline_mysql_cond_init
(
#ifdef HAVE_PSI_INTERFACE
PSI_cond_key
key
,
...
...
mysql-test/suite/perfschema/r/dml_setup_instruments.result
View file @
7b67a275
...
...
@@ -25,9 +25,10 @@ wait/synch/rwlock/sql/LOCK_system_variables_hash YES YES
wait/synch/rwlock/sql/LOCK_sys_init_connect YES YES
wait/synch/rwlock/sql/LOCK_sys_init_slave YES YES
wait/synch/rwlock/sql/LOGGER::LOCK_logger YES YES
wait/synch/rwlock/sql/MDL_context::waiting_for_lock YES YES
wait/synch/rwlock/sql/MDL_lock::rwlock YES YES
wait/synch/rwlock/sql/Query_cache_query::lock YES YES
wait/synch/rwlock/sql/THR_LOCK_servers YES YES
wait/synch/rwlock/sql/THR_LOCK_udf YES YES
select * from performance_schema.SETUP_INSTRUMENTS
where name like 'Wait/Synch/Cond/sql/%'
and name not in (
...
...
mysql-test/suite/perfschema/r/pfs_upgrade.result
0 → 100644
View file @
7b67a275
drop table if exists test.user_table;
drop procedure if exists test.user_proc;
drop function if exists test.user_func;
drop event if exists test.user_event;
"Testing mysql_upgrade with TABLE performance_schema.user_table"
create table test.user_table(a int);
use performance_schema;
show tables like "user_table";
Tables_in_performance_schema (user_table)
user_table
ERROR 1644 (HY000) at line 178: Unexpected content found in the performance_schema database.
ERROR 1050 (42S01) at line 203: Table 'COND_INSTANCES' already exists
ERROR 1050 (42S01) at line 233: Table 'EVENTS_WAITS_CURRENT' already exists
ERROR 1050 (42S01) at line 247: Table 'EVENTS_WAITS_HISTORY' already exists
ERROR 1050 (42S01) at line 261: Table 'EVENTS_WAITS_HISTORY_LONG' already exists
ERROR 1050 (42S01) at line 281: Table 'EVENTS_WAITS_SUMMARY_BY_EVENT_NAME' already exists
ERROR 1050 (42S01) at line 302: Table 'EVENTS_WAITS_SUMMARY_BY_INSTANCE' already exists
ERROR 1050 (42S01) at line 323: Table 'EVENTS_WAITS_SUMMARY_BY_THREAD_BY_EVENT_NAME' already exists
ERROR 1050 (42S01) at line 340: Table 'FILE_INSTANCES' already exists
ERROR 1050 (42S01) at line 359: Table 'FILE_SUMMARY_BY_EVENT_NAME' already exists
ERROR 1050 (42S01) at line 379: Table 'FILE_SUMMARY_BY_INSTANCE' already exists
ERROR 1050 (42S01) at line 396: Table 'MUTEX_INSTANCES' already exists
ERROR 1050 (42S01) at line 414: Table 'PERFORMANCE_TIMERS' already exists
ERROR 1050 (42S01) at line 431: Table 'PROCESSLIST' already exists
ERROR 1050 (42S01) at line 449: Table 'RWLOCK_INSTANCES' already exists
ERROR 1050 (42S01) at line 465: Table 'SETUP_CONSUMERS' already exists
ERROR 1050 (42S01) at line 482: Table 'SETUP_INSTRUMENTS' already exists
ERROR 1050 (42S01) at line 502: Table 'SETUP_OBJECTS' already exists
ERROR 1050 (42S01) at line 518: Table 'SETUP_TIMERS' already exists
FATAL ERROR: Upgrade failed
show tables like "user_table";
Tables_in_performance_schema (user_table)
user_table
use test;
drop table test.user_table;
"Testing mysql_upgrade with VIEW performance_schema.user_view"
create view test.user_view as select "Not supposed to be here";
use performance_schema;
show tables like "user_view";
Tables_in_performance_schema (user_view)
user_view
ERROR 1644 (HY000) at line 178: Unexpected content found in the performance_schema database.
ERROR 1050 (42S01) at line 203: Table 'COND_INSTANCES' already exists
ERROR 1050 (42S01) at line 233: Table 'EVENTS_WAITS_CURRENT' already exists
ERROR 1050 (42S01) at line 247: Table 'EVENTS_WAITS_HISTORY' already exists
ERROR 1050 (42S01) at line 261: Table 'EVENTS_WAITS_HISTORY_LONG' already exists
ERROR 1050 (42S01) at line 281: Table 'EVENTS_WAITS_SUMMARY_BY_EVENT_NAME' already exists
ERROR 1050 (42S01) at line 302: Table 'EVENTS_WAITS_SUMMARY_BY_INSTANCE' already exists
ERROR 1050 (42S01) at line 323: Table 'EVENTS_WAITS_SUMMARY_BY_THREAD_BY_EVENT_NAME' already exists
ERROR 1050 (42S01) at line 340: Table 'FILE_INSTANCES' already exists
ERROR 1050 (42S01) at line 359: Table 'FILE_SUMMARY_BY_EVENT_NAME' already exists
ERROR 1050 (42S01) at line 379: Table 'FILE_SUMMARY_BY_INSTANCE' already exists
ERROR 1050 (42S01) at line 396: Table 'MUTEX_INSTANCES' already exists
ERROR 1050 (42S01) at line 414: Table 'PERFORMANCE_TIMERS' already exists
ERROR 1050 (42S01) at line 431: Table 'PROCESSLIST' already exists
ERROR 1050 (42S01) at line 449: Table 'RWLOCK_INSTANCES' already exists
ERROR 1050 (42S01) at line 465: Table 'SETUP_CONSUMERS' already exists
ERROR 1050 (42S01) at line 482: Table 'SETUP_INSTRUMENTS' already exists
ERROR 1050 (42S01) at line 502: Table 'SETUP_OBJECTS' already exists
ERROR 1050 (42S01) at line 518: Table 'SETUP_TIMERS' already exists
FATAL ERROR: Upgrade failed
show tables like "user_view";
Tables_in_performance_schema (user_view)
user_view
use test;
drop view test.user_view;
"Testing mysql_upgrade with PROCEDURE performance_schema.user_proc"
create procedure test.user_proc()
select "Not supposed to be here";
update mysql.proc set db='performance_schema' where name='user_proc';
ERROR 1644 (HY000) at line 178: Unexpected content found in the performance_schema database.
ERROR 1050 (42S01) at line 203: Table 'COND_INSTANCES' already exists
ERROR 1050 (42S01) at line 233: Table 'EVENTS_WAITS_CURRENT' already exists
ERROR 1050 (42S01) at line 247: Table 'EVENTS_WAITS_HISTORY' already exists
ERROR 1050 (42S01) at line 261: Table 'EVENTS_WAITS_HISTORY_LONG' already exists
ERROR 1050 (42S01) at line 281: Table 'EVENTS_WAITS_SUMMARY_BY_EVENT_NAME' already exists
ERROR 1050 (42S01) at line 302: Table 'EVENTS_WAITS_SUMMARY_BY_INSTANCE' already exists
ERROR 1050 (42S01) at line 323: Table 'EVENTS_WAITS_SUMMARY_BY_THREAD_BY_EVENT_NAME' already exists
ERROR 1050 (42S01) at line 340: Table 'FILE_INSTANCES' already exists
ERROR 1050 (42S01) at line 359: Table 'FILE_SUMMARY_BY_EVENT_NAME' already exists
ERROR 1050 (42S01) at line 379: Table 'FILE_SUMMARY_BY_INSTANCE' already exists
ERROR 1050 (42S01) at line 396: Table 'MUTEX_INSTANCES' already exists
ERROR 1050 (42S01) at line 414: Table 'PERFORMANCE_TIMERS' already exists
ERROR 1050 (42S01) at line 431: Table 'PROCESSLIST' already exists
ERROR 1050 (42S01) at line 449: Table 'RWLOCK_INSTANCES' already exists
ERROR 1050 (42S01) at line 465: Table 'SETUP_CONSUMERS' already exists
ERROR 1050 (42S01) at line 482: Table 'SETUP_INSTRUMENTS' already exists
ERROR 1050 (42S01) at line 502: Table 'SETUP_OBJECTS' already exists
ERROR 1050 (42S01) at line 518: Table 'SETUP_TIMERS' already exists
FATAL ERROR: Upgrade failed
select name from mysql.proc where db='performance_schema';
name
user_proc
update mysql.proc set db='test' where name='user_proc';
drop procedure test.user_proc;
"Testing mysql_upgrade with FUNCTION performance_schema.user_func"
create function test.user_func() returns integer
return 0;
update mysql.proc set db='performance_schema' where name='user_func';
ERROR 1644 (HY000) at line 178: Unexpected content found in the performance_schema database.
ERROR 1050 (42S01) at line 203: Table 'COND_INSTANCES' already exists
ERROR 1050 (42S01) at line 233: Table 'EVENTS_WAITS_CURRENT' already exists
ERROR 1050 (42S01) at line 247: Table 'EVENTS_WAITS_HISTORY' already exists
ERROR 1050 (42S01) at line 261: Table 'EVENTS_WAITS_HISTORY_LONG' already exists
ERROR 1050 (42S01) at line 281: Table 'EVENTS_WAITS_SUMMARY_BY_EVENT_NAME' already exists
ERROR 1050 (42S01) at line 302: Table 'EVENTS_WAITS_SUMMARY_BY_INSTANCE' already exists
ERROR 1050 (42S01) at line 323: Table 'EVENTS_WAITS_SUMMARY_BY_THREAD_BY_EVENT_NAME' already exists
ERROR 1050 (42S01) at line 340: Table 'FILE_INSTANCES' already exists
ERROR 1050 (42S01) at line 359: Table 'FILE_SUMMARY_BY_EVENT_NAME' already exists
ERROR 1050 (42S01) at line 379: Table 'FILE_SUMMARY_BY_INSTANCE' already exists
ERROR 1050 (42S01) at line 396: Table 'MUTEX_INSTANCES' already exists
ERROR 1050 (42S01) at line 414: Table 'PERFORMANCE_TIMERS' already exists
ERROR 1050 (42S01) at line 431: Table 'PROCESSLIST' already exists
ERROR 1050 (42S01) at line 449: Table 'RWLOCK_INSTANCES' already exists
ERROR 1050 (42S01) at line 465: Table 'SETUP_CONSUMERS' already exists
ERROR 1050 (42S01) at line 482: Table 'SETUP_INSTRUMENTS' already exists
ERROR 1050 (42S01) at line 502: Table 'SETUP_OBJECTS' already exists
ERROR 1050 (42S01) at line 518: Table 'SETUP_TIMERS' already exists
FATAL ERROR: Upgrade failed
select name from mysql.proc where db='performance_schema';
name
user_func
update mysql.proc set db='test' where name='user_func';
drop function test.user_func;
"Testing mysql_upgrade with EVENT performance_schema.user_event"
create event test.user_event on schedule every 1 day do
select "not supposed to be here";
update mysql.event set db='performance_schema' where name='user_event';
ERROR 1644 (HY000) at line 178: Unexpected content found in the performance_schema database.
ERROR 1050 (42S01) at line 203: Table 'COND_INSTANCES' already exists
ERROR 1050 (42S01) at line 233: Table 'EVENTS_WAITS_CURRENT' already exists
ERROR 1050 (42S01) at line 247: Table 'EVENTS_WAITS_HISTORY' already exists
ERROR 1050 (42S01) at line 261: Table 'EVENTS_WAITS_HISTORY_LONG' already exists
ERROR 1050 (42S01) at line 281: Table 'EVENTS_WAITS_SUMMARY_BY_EVENT_NAME' already exists
ERROR 1050 (42S01) at line 302: Table 'EVENTS_WAITS_SUMMARY_BY_INSTANCE' already exists
ERROR 1050 (42S01) at line 323: Table 'EVENTS_WAITS_SUMMARY_BY_THREAD_BY_EVENT_NAME' already exists
ERROR 1050 (42S01) at line 340: Table 'FILE_INSTANCES' already exists
ERROR 1050 (42S01) at line 359: Table 'FILE_SUMMARY_BY_EVENT_NAME' already exists
ERROR 1050 (42S01) at line 379: Table 'FILE_SUMMARY_BY_INSTANCE' already exists
ERROR 1050 (42S01) at line 396: Table 'MUTEX_INSTANCES' already exists
ERROR 1050 (42S01) at line 414: Table 'PERFORMANCE_TIMERS' already exists
ERROR 1050 (42S01) at line 431: Table 'PROCESSLIST' already exists
ERROR 1050 (42S01) at line 449: Table 'RWLOCK_INSTANCES' already exists
ERROR 1050 (42S01) at line 465: Table 'SETUP_CONSUMERS' already exists
ERROR 1050 (42S01) at line 482: Table 'SETUP_INSTRUMENTS' already exists
ERROR 1050 (42S01) at line 502: Table 'SETUP_OBJECTS' already exists
ERROR 1050 (42S01) at line 518: Table 'SETUP_TIMERS' already exists
FATAL ERROR: Upgrade failed
select name from mysql.event where db='performance_schema';
name
user_event
update mysql.event set db='test' where name='user_event';
drop event test.user_event;
mysql-test/suite/perfschema/t/pfs_upgrade.test
0 → 100644
View file @
7b67a275
# Copyright (C) 2010 Oracle and/or its affiliates. All rights reserved.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
# Tests for PERFORMANCE_SCHEMA
# Make sure mysql_upgrade does not destroy data in a 'performance_schema'
# database.
#
--
source
include
/
not_embedded
.
inc
--
source
include
/
have_perfschema
.
inc
--
disable_warnings
drop
table
if
exists
test
.
user_table
;
drop
procedure
if
exists
test
.
user_proc
;
drop
function
if
exists
test
.
user_func
;
drop
event
if
exists
test
.
user_event
;
--
enable_warnings
--
echo
"Testing mysql_upgrade with TABLE performance_schema.user_table"
create
table
test
.
user_table
(
a
int
);
let
$MYSQLD_DATADIR
=
`SELECT @@datadir`
;
--
copy_file
$MYSQLD_DATADIR
/
test
/
user_table
.
frm
$MYSQLD_DATADIR
/
performance_schema
/
user_table
.
frm
# Make sure the table is visible
use
performance_schema
;
show
tables
like
"user_table"
;
--
error
1
--
exec
$MYSQL_UPGRADE
--
skip
-
verbose
>
$MYSQLTEST_VARDIR
/
tmp
/
pfs_upgrade
.
out
2
>
$MYSQLTEST_VARDIR
/
tmp
/
pfs_upgrade
.
err
# Verify that mysql_upgrade complained about the performance_schema
--
cat_file
$MYSQLTEST_VARDIR
/
tmp
/
pfs_upgrade
.
err
# Make sure the table is still visible
show
tables
like
"user_table"
;
use
test
;
--
remove_file
$MYSQLD_DATADIR
/
performance_schema
/
user_table
.
frm
drop
table
test
.
user_table
;
--
echo
"Testing mysql_upgrade with VIEW performance_schema.user_view"
create
view
test
.
user_view
as
select
"Not supposed to be here"
;
let
$MYSQLD_DATADIR
=
`SELECT @@datadir`
;
--
copy_file
$MYSQLD_DATADIR
/
test
/
user_view
.
frm
$MYSQLD_DATADIR
/
performance_schema
/
user_view
.
frm
# Make sure the view is visible
use
performance_schema
;
show
tables
like
"user_view"
;
--
error
1
--
exec
$MYSQL_UPGRADE
--
skip
-
verbose
>
$MYSQLTEST_VARDIR
/
tmp
/
pfs_upgrade
.
out
2
>
$MYSQLTEST_VARDIR
/
tmp
/
pfs_upgrade
.
err
# Verify that mysql_upgrade complained about the performance_schema
--
cat_file
$MYSQLTEST_VARDIR
/
tmp
/
pfs_upgrade
.
err
# Make sure the view is still visible
show
tables
like
"user_view"
;
use
test
;
--
remove_file
$MYSQLD_DATADIR
/
performance_schema
/
user_view
.
frm
drop
view
test
.
user_view
;
--
echo
"Testing mysql_upgrade with PROCEDURE performance_schema.user_proc"
create
procedure
test
.
user_proc
()
select
"Not supposed to be here"
;
update
mysql
.
proc
set
db
=
'performance_schema'
where
name
=
'user_proc'
;
--
error
1
--
exec
$MYSQL_UPGRADE
--
skip
-
verbose
>
$MYSQLTEST_VARDIR
/
tmp
/
pfs_upgrade
.
out
2
>
$MYSQLTEST_VARDIR
/
tmp
/
pfs_upgrade
.
err
# Verify that mysql_upgrade complained about the performance_schema
--
cat_file
$MYSQLTEST_VARDIR
/
tmp
/
pfs_upgrade
.
err
select
name
from
mysql
.
proc
where
db
=
'performance_schema'
;
update
mysql
.
proc
set
db
=
'test'
where
name
=
'user_proc'
;
drop
procedure
test
.
user_proc
;
--
echo
"Testing mysql_upgrade with FUNCTION performance_schema.user_func"
create
function
test
.
user_func
()
returns
integer
return
0
;
update
mysql
.
proc
set
db
=
'performance_schema'
where
name
=
'user_func'
;
--
error
1
--
exec
$MYSQL_UPGRADE
--
skip
-
verbose
>
$MYSQLTEST_VARDIR
/
tmp
/
pfs_upgrade
.
out
2
>
$MYSQLTEST_VARDIR
/
tmp
/
pfs_upgrade
.
err
# Verify that mysql_upgrade complained about the performance_schema
--
cat_file
$MYSQLTEST_VARDIR
/
tmp
/
pfs_upgrade
.
err
select
name
from
mysql
.
proc
where
db
=
'performance_schema'
;
update
mysql
.
proc
set
db
=
'test'
where
name
=
'user_func'
;
drop
function
test
.
user_func
;
--
echo
"Testing mysql_upgrade with EVENT performance_schema.user_event"
create
event
test
.
user_event
on
schedule
every
1
day
do
select
"not supposed to be here"
;
update
mysql
.
event
set
db
=
'performance_schema'
where
name
=
'user_event'
;
--
error
1
--
exec
$MYSQL_UPGRADE
--
skip
-
verbose
>
$MYSQLTEST_VARDIR
/
tmp
/
pfs_upgrade
.
out
2
>
$MYSQLTEST_VARDIR
/
tmp
/
pfs_upgrade
.
err
# Verify that mysql_upgrade complained about the performance_schema
--
cat_file
$MYSQLTEST_VARDIR
/
tmp
/
pfs_upgrade
.
err
select
name
from
mysql
.
event
where
db
=
'performance_schema'
;
update
mysql
.
event
set
db
=
'test'
where
name
=
'user_event'
;
drop
event
test
.
user_event
;
--
remove_file
$MYSQLTEST_VARDIR
/
tmp
/
pfs_upgrade
.
out
--
remove_file
$MYSQLTEST_VARDIR
/
tmp
/
pfs_upgrade
.
err
scripts/mysql_system_tables.sql
View file @
7b67a275
-- Copyright (C) 2008
-2009 Sun Microsystems, Inc
-- Copyright (C) 2008
, 2010 Oracle and/or its affiliates. All rights reserved.
--
-- This program is free software; you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
...
...
@@ -100,18 +100,92 @@ CREATE TABLE IF NOT EXISTS event ( db char(64) CHARACTER SET utf8 COLLATE utf8_b
CREATE
TABLE
IF
NOT
EXISTS
ndb_binlog_index
(
Position
BIGINT
UNSIGNED
NOT
NULL
,
File
VARCHAR
(
255
)
NOT
NULL
,
epoch
BIGINT
UNSIGNED
NOT
NULL
,
inserts
BIGINT
UNSIGNED
NOT
NULL
,
updates
BIGINT
UNSIGNED
NOT
NULL
,
deletes
BIGINT
UNSIGNED
NOT
NULL
,
schemaops
BIGINT
UNSIGNED
NOT
NULL
,
PRIMARY
KEY
(
epoch
))
ENGINE
=
MYISAM
;
--
-- PERFORMANCE SCHEMA INSTALLATION
-- Note that this script is also reused by mysql_upgrade,
-- so we have to be very careful here to not destroy any
-- existing database named 'performance_schema' if it
-- can contain user data.
-- In case of downgrade, it's ok to drop unknown tables
-- from a future version, as long as they belong to the
-- performance schema engine.
--
set
@
have_old_pfs
=
(
select
count
(
*
)
from
information_schema
.
schemata
where
schema_name
=
'performance_schema'
);
SET
@
l1
=
"SET @broken_tables = (select count(*) from information_schema.tables"
;
SET
@
l2
=
" where engine !=
\'
PERFORMANCE_SCHEMA
\'
and table_schema=
\'
performance_schema
\'
)"
;
SET
@
cmd
=
concat
(
@
l1
,
@
l2
);
-- Work around for bug#49542
SET
@
str
=
IF
(
@
have_old_pfs
=
1
,
@
cmd
,
'SET @broken_tables = 0'
);
PREPARE
stmt
FROM
@
str
;
EXECUTE
stmt
;
DROP
PREPARE
stmt
;
SET
@
l1
=
"SET @broken_views = (select count(*) from information_schema.views"
;
SET
@
l2
=
" where table_schema='performance_schema')"
;
SET
@
cmd
=
concat
(
@
l1
,
@
l2
);
-- Work around for bug#49542
SET
@
str
=
IF
(
@
have_old_pfs
=
1
,
@
cmd
,
'SET @broken_views = 0'
);
PREPARE
stmt
FROM
@
str
;
EXECUTE
stmt
;
DROP
PREPARE
stmt
;
SET
@
broken_routines
=
(
select
count
(
*
)
from
mysql
.
proc
where
db
=
'performance_schema'
);
SET
@
broken_events
=
(
select
count
(
*
)
from
mysql
.
event
where
db
=
'performance_schema'
);
SET
@
broken_pfs
=
(
select
@
broken_tables
+
@
broken_views
+
@
broken_routines
+
@
broken_events
);
--
-- The performance schema database.
-- This database is always created, even in --without-perfschema builds,
-- Only drop and create the database if this is safe (no broken_pfs).
-- This database is created, even in --without-perfschema builds,
-- so that the database name is always reserved by the MySQL implementation.
--
set
@
have_pfs
=
(
select
count
(
engine
)
from
information_schema
.
engines
where
engine
=
'PERFORMANCE_SCHEMA'
and
support
!=
'NO'
);
SET
@
cmd
=
"DROP DATABASE IF EXISTS performance_schema"
;
SET
@
str
=
IF
(
@
broken_pfs
=
0
,
@
cmd
,
'SET @dummy = 0'
);
PREPARE
stmt
FROM
@
str
;
EXECUTE
stmt
;
DROP
PREPARE
stmt
;
DROP
DATABASE
IF
EXISTS
performance_schema
;
SET
@
cmd
=
"CREATE DATABASE performance_schema character set utf8"
;
CREATE
DATABASE
performance_schema
character
set
utf8
;
SET
@
str
=
IF
(
@
broken_pfs
=
0
,
@
cmd
,
'SET @dummy = 0'
);
PREPARE
stmt
FROM
@
str
;
EXECUTE
stmt
;
DROP
PREPARE
stmt
;
--
-- Unlike 'performance_schema', the 'mysql' database is reserved already,
-- so no user procedure is supposed to be there
--
drop
procedure
if
exists
mysql
.
die
;
create
procedure
mysql
.
die
()
signal
sqlstate
'HY000'
set
message_text
=
'Unexpected content found in the performance_schema database.'
;
--
-- For broken upgrades, SIGNAL the error
--
SET
@
cmd
=
"call mysql.die()"
;
SET
@
str
=
IF
(
@
broken_pfs
>
0
,
@
cmd
,
'SET @dummy = 0'
);
PREPARE
stmt
FROM
@
str
;
EXECUTE
stmt
;
DROP
PREPARE
stmt
;
drop
procedure
mysql
.
die
;
--
-- From this point, only create the performance schema tables
-- if the server is build with performance schema
--
set
@
have_pfs
=
(
select
count
(
engine
)
from
information_schema
.
engines
where
engine
=
'PERFORMANCE_SCHEMA'
and
support
!=
'NO'
);
--
-- TABLE COND_INSTANCES
...
...
sql/mdl.cc
View file @
7b67a275
This diff is collapsed.
Click to expand it.
sql/mdl.h
View file @
7b67a275
...
...
@@ -628,7 +628,7 @@ private:
important as deadlock detector won't work correctly
otherwise. @sa Comment for MDL_lock::m_rwlock.
*/
rw_pr_
lock_t
m_waiting_for_lock
;
mysql_pr
lock_t
m_waiting_for_lock
;
MDL_ticket
*
m_waiting_for
;
uint
m_deadlock_weight
;
/**
...
...
@@ -652,9 +652,9 @@ private:
void
will_wait_for
(
MDL_ticket
*
pending_ticket
)
{
rw_pr
_wrlock
(
&
m_waiting_for_lock
);
mysql_prlock
_wrlock
(
&
m_waiting_for_lock
);
m_waiting_for
=
pending_ticket
;
rw_pr
_unlock
(
&
m_waiting_for_lock
);
mysql_prlock
_unlock
(
&
m_waiting_for_lock
);
}
void
set_deadlock_weight
(
uint
weight
)
...
...
@@ -670,9 +670,9 @@ private:
void
stop_waiting
()
{
rw_pr
_wrlock
(
&
m_waiting_for_lock
);
mysql_prlock
_wrlock
(
&
m_waiting_for_lock
);
m_waiting_for
=
NULL
;
rw_pr
_unlock
(
&
m_waiting_for_lock
);
mysql_prlock
_unlock
(
&
m_waiting_for_lock
);
}
void
wait_reset
()
...
...
storage/perfschema/pfs_instr.cc
View file @
7b67a275
...
...
@@ -746,6 +746,26 @@ find_or_create_file(PFS_thread *thread, PFS_file_class *klass,
}
}
char
safe_buffer
[
FN_REFLEN
];
const
char
*
safe_filename
;
if
(
len
>=
FN_REFLEN
)
{
/*
The instrumented code uses file names that exceeds FN_REFLEN.
This could be legal for instrumentation on non mysys APIs,
so we support it.
Truncate the file name so that:
- it fits into pfs->m_filename
- it is safe to use mysys apis to normalize the file name.
*/
memcpy
(
safe_buffer
,
filename
,
FN_REFLEN
-
2
);
safe_buffer
[
FN_REFLEN
-
1
]
=
0
;
safe_filename
=
safe_buffer
;
}
else
safe_filename
=
filename
;
/*
Normalize the file name to avoid duplicates when using aliases:
- absolute or relative paths
...
...
@@ -759,7 +779,7 @@ find_or_create_file(PFS_thread *thread, PFS_file_class *klass,
Ignore errors, the file may not exist.
my_realpath always provide a best effort result in buffer.
*/
(
void
)
my_realpath
(
buffer
,
filename
,
MYF
(
0
));
(
void
)
my_realpath
(
buffer
,
safe_
filename
,
MYF
(
0
));
normalized_filename
=
buffer
;
normalized_length
=
strlen
(
normalized_filename
);
...
...
storage/perfschema/unittest/pfs-t.cc
View file @
7b67a275
...
...
@@ -37,14 +37,25 @@ PFS_file* lookup_file_by_name(const char* name)
uint
i
;
PFS_file
*
pfs
;
uint
len
=
strlen
(
name
);
size_t
dirlen
;
const
char
*
filename
;
uint
filename_length
;;
for
(
i
=
0
;
i
<
file_max
;
i
++
)
{
pfs
=
&
file_array
[
i
];
if
(
pfs
->
m_lock
.
is_populated
())
{
if
((
len
==
pfs
->
m_filename_length
)
&&
(
strncmp
(
name
,
pfs
->
m_filename
,
pfs
->
m_filename_length
)
==
0
))
/*
When a file "foo" is instrumented, the name is normalized
to "/path/to/current/directory/foo", so we remove the
directory name here to find it back.
*/
dirlen
=
dirname_length
(
pfs
->
m_filename
);
filename
=
pfs
->
m_filename
+
dirlen
;
filename_length
=
pfs
->
m_filename_length
-
dirlen
;
if
((
len
==
filename_length
)
&&
(
strncmp
(
name
,
filename
,
filename_length
)
==
0
))
return
pfs
;
}
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment