Commit 3055d13e authored by Evgeny Potemkin's avatar Evgeny Potemkin

Auto-merged.

parents a5ffc6fa 14ac8c79
...@@ -1335,15 +1335,11 @@ void _db_doprnt_(const char *format,...) ...@@ -1335,15 +1335,11 @@ void _db_doprnt_(const char *format,...)
* This function is intended as a * This function is intended as a
* vfprintf clone with consistent, platform independent output for * vfprintf clone with consistent, platform independent output for
* problematic formats like %p, %zd and %lld. * problematic formats like %p, %zd and %lld.
* However: full functionality for my_vsnprintf has not been backported yet,
* so code using "%g" or "%f" will have undefined behaviour.
*/ */
static void DbugVfprintf(FILE *stream, const char* format, va_list args) static void DbugVfprintf(FILE *stream, const char* format, va_list args)
{ {
char cvtbuf[1024]; char cvtbuf[1024];
size_t len; (void) my_vsnprintf(cvtbuf, sizeof(cvtbuf), format, args);
/* Do not use my_vsnprintf, it does not support "%g". */
len = vsnprintf(cvtbuf, sizeof(cvtbuf), format, args);
(void) fprintf(stream, "%s\n", cvtbuf); (void) fprintf(stream, "%s\n", cvtbuf);
} }
......
...@@ -53,7 +53,7 @@ ...@@ -53,7 +53,7 @@
<length modifier> can be 'l', 'll', or 'z'. <length modifier> can be 'l', 'll', or 'z'.
Supported formats are 's' (null pointer is accepted, printed as Supported formats are 's' (null pointer is accepted, printed as
"(null)"), 'b' (extension, see below), 'c', 'd', 'u', 'x', 'o', "(null)"), 'b' (extension, see below), 'c', 'd', 'i', 'u', 'x', 'o',
'X', 'p' (works as 0x%x). 'X', 'p' (works as 0x%x).
Standard syntax for positional arguments $n is supported. Standard syntax for positional arguments $n is supported.
......
...@@ -43,5 +43,11 @@ log-bin=mysqld-bin ...@@ -43,5 +43,11 @@ log-bin=mysqld-bin
# Run tests with the performance schema instrumentation # Run tests with the performance schema instrumentation
loose-enable-performance-schema loose-enable-performance-schema
# Run tests with a small number of instrumented objects
# to limit memory consumption with MTR
loose-performance-schema-max-mutex-instances=10000
loose-performance-schema-max-rwlock-instances=10000
loose-performance-schema-max-table-instances=500
loose-performance-schema-max-table-handles=1000
binlog-direct-non-transactional-updates binlog-direct-non-transactional-updates
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
# #
--error 1 --error 1
--exec $MYSQL_UPGRADE --skip-verbose > $out_file 2> $err_file --exec $MYSQL_UPGRADE --skip-verbose --force > $out_file 2> $err_file
# Verify that mysql_upgrade complained about the performance_schema # Verify that mysql_upgrade complained about the performance_schema
--cat_file $err_file --cat_file $err_file
......
checksum table performance_schema.COND_INSTANCES;
checksum table performance_schema.EVENTS_WAITS_CURRENT;
checksum table performance_schema.EVENTS_WAITS_HISTORY;
checksum table performance_schema.EVENTS_WAITS_HISTORY_LONG;
checksum table performance_schema.EVENTS_WAITS_SUMMARY_BY_INSTANCE;
checksum table performance_schema.EVENTS_WAITS_SUMMARY_BY_THREAD_BY_EVENT_NAME;
checksum table performance_schema.EVENTS_WAITS_SUMMARY_GLOBAL_BY_EVENT_NAME;
checksum table performance_schema.FILE_INSTANCES;
checksum table performance_schema.FILE_SUMMARY_BY_EVENT_NAME;
checksum table performance_schema.FILE_SUMMARY_BY_INSTANCE;
checksum table performance_schema.MUTEX_INSTANCES;
checksum table performance_schema.PERFORMANCE_TIMERS;
checksum table performance_schema.RWLOCK_INSTANCES;
checksum table performance_schema.SETUP_CONSUMERS;
checksum table performance_schema.SETUP_INSTRUMENTS;
checksum table performance_schema.SETUP_TIMERS;
checksum table performance_schema.THREADS;
checksum table performance_schema.COND_INSTANCES extended;
checksum table performance_schema.EVENTS_WAITS_CURRENT extended;
checksum table performance_schema.EVENTS_WAITS_HISTORY extended;
checksum table performance_schema.EVENTS_WAITS_HISTORY_LONG extended;
checksum table performance_schema.EVENTS_WAITS_SUMMARY_BY_INSTANCE extended;
checksum table performance_schema.EVENTS_WAITS_SUMMARY_BY_THREAD_BY_EVENT_NAME extended;
checksum table performance_schema.EVENTS_WAITS_SUMMARY_GLOBAL_BY_EVENT_NAME extended;
checksum table performance_schema.FILE_INSTANCES extended;
checksum table performance_schema.FILE_SUMMARY_BY_EVENT_NAME extended;
checksum table performance_schema.FILE_SUMMARY_BY_INSTANCE extended;
checksum table performance_schema.MUTEX_INSTANCES extended;
checksum table performance_schema.PERFORMANCE_TIMERS extended;
checksum table performance_schema.RWLOCK_INSTANCES extended;
checksum table performance_schema.SETUP_CONSUMERS extended;
checksum table performance_schema.SETUP_INSTRUMENTS extended;
checksum table performance_schema.SETUP_TIMERS extended;
checksum table performance_schema.THREADS extended;
...@@ -116,18 +116,10 @@ where name like "wait/synch/mutex/sql/LOCK_rpl_status"; ...@@ -116,18 +116,10 @@ where name like "wait/synch/mutex/sql/LOCK_rpl_status";
count(name) count(name)
1 1
select count(name) from MUTEX_INSTANCES select count(name) from MUTEX_INSTANCES
where name like "wait/synch/mutex/sql/LOG_INFO::lock";
count(name)
1
select count(name) from MUTEX_INSTANCES
where name like "wait/synch/mutex/sql/Query_cache::structure_guard_mutex"; where name like "wait/synch/mutex/sql/Query_cache::structure_guard_mutex";
count(name) count(name)
1 1
select count(name) from MUTEX_INSTANCES select count(name) from MUTEX_INSTANCES
where name like "wait/synch/mutex/sql/Event_scheduler::LOCK_scheduler_state";
count(name)
1
select count(name) from MUTEX_INSTANCES
where name like "wait/synch/mutex/sql/LOCK_event_metadata"; where name like "wait/synch/mutex/sql/LOCK_event_metadata";
count(name) count(name)
1 1
...@@ -144,15 +136,15 @@ where name like "wait/synch/mutex/sql/Cversion_lock"; ...@@ -144,15 +136,15 @@ where name like "wait/synch/mutex/sql/Cversion_lock";
count(name) count(name)
1 1
select count(name) from MUTEX_INSTANCES select count(name) from MUTEX_INSTANCES
where name like "wait/synch/mutex/sql/LOCK_xid_cache"; where name like "wait/synch/mutex/sql/LOCK_audit_mask";
count(name) count(name)
1 1
select count(name) from MUTEX_INSTANCES select count(name) from MUTEX_INSTANCES
where name like "wait/synch/mutex/sql/LOCK_plugin"; where name like "wait/synch/mutex/sql/LOCK_xid_cache";
count(name) count(name)
1 1
select count(name) from MUTEX_INSTANCES select count(name) from MUTEX_INSTANCES
where name like "wait/synch/mutex/sql/LOCK_gdl"; where name like "wait/synch/mutex/sql/LOCK_plugin";
count(name) count(name)
1 1
select count(name) from MUTEX_INSTANCES select count(name) from MUTEX_INSTANCES
...@@ -212,10 +204,6 @@ where name like "wait/synch/cond/sql/Query_cache::COND_cache_status_changed"; ...@@ -212,10 +204,6 @@ where name like "wait/synch/cond/sql/Query_cache::COND_cache_status_changed";
count(name) count(name)
1 1
select count(name) from COND_INSTANCES select count(name) from COND_INSTANCES
where name like "wait/synch/cond/sql/Event_scheduler::COND_state";
count(name)
1
select count(name) from COND_INSTANCES
where name like "wait/synch/cond/sql/COND_queue_state"; where name like "wait/synch/cond/sql/COND_queue_state";
count(name) count(name)
1 1
...@@ -45,11 +45,11 @@ performance_schema_max_file_classes 50 ...@@ -45,11 +45,11 @@ performance_schema_max_file_classes 50
performance_schema_max_file_handles 32768 performance_schema_max_file_handles 32768
performance_schema_max_file_instances 10000 performance_schema_max_file_instances 10000
performance_schema_max_mutex_classes 200 performance_schema_max_mutex_classes 200
performance_schema_max_mutex_instances 1000000 performance_schema_max_mutex_instances 10000
performance_schema_max_rwlock_classes 30 performance_schema_max_rwlock_classes 30
performance_schema_max_rwlock_instances 1000000 performance_schema_max_rwlock_instances 10000
performance_schema_max_table_handles 100000 performance_schema_max_table_handles 1000
performance_schema_max_table_instances 50000 performance_schema_max_table_instances 500
performance_schema_max_thread_classes 50 performance_schema_max_thread_classes 50
performance_schema_max_thread_instances 1000 performance_schema_max_thread_instances 1000
show engine PERFORMANCE_SCHEMA status; show engine PERFORMANCE_SCHEMA status;
......
...@@ -45,11 +45,11 @@ performance_schema_max_file_classes 50 ...@@ -45,11 +45,11 @@ performance_schema_max_file_classes 50
performance_schema_max_file_handles 32768 performance_schema_max_file_handles 32768
performance_schema_max_file_instances 10000 performance_schema_max_file_instances 10000
performance_schema_max_mutex_classes 200 performance_schema_max_mutex_classes 200
performance_schema_max_mutex_instances 1000000 performance_schema_max_mutex_instances 10000
performance_schema_max_rwlock_classes 30 performance_schema_max_rwlock_classes 30
performance_schema_max_rwlock_instances 1000000 performance_schema_max_rwlock_instances 10000
performance_schema_max_table_handles 100000 performance_schema_max_table_handles 1000
performance_schema_max_table_instances 50000 performance_schema_max_table_instances 500
performance_schema_max_thread_classes 50 performance_schema_max_thread_classes 50
performance_schema_max_thread_instances 1000 performance_schema_max_thread_instances 1000
show engine PERFORMANCE_SCHEMA status; show engine PERFORMANCE_SCHEMA status;
......
...@@ -45,11 +45,11 @@ performance_schema_max_file_classes 0 ...@@ -45,11 +45,11 @@ performance_schema_max_file_classes 0
performance_schema_max_file_handles 32768 performance_schema_max_file_handles 32768
performance_schema_max_file_instances 10000 performance_schema_max_file_instances 10000
performance_schema_max_mutex_classes 200 performance_schema_max_mutex_classes 200
performance_schema_max_mutex_instances 1000000 performance_schema_max_mutex_instances 10000
performance_schema_max_rwlock_classes 30 performance_schema_max_rwlock_classes 30
performance_schema_max_rwlock_instances 1000000 performance_schema_max_rwlock_instances 10000
performance_schema_max_table_handles 100000 performance_schema_max_table_handles 1000
performance_schema_max_table_instances 50000 performance_schema_max_table_instances 500
performance_schema_max_thread_classes 50 performance_schema_max_thread_classes 50
performance_schema_max_thread_instances 1000 performance_schema_max_thread_instances 1000
show engine PERFORMANCE_SCHEMA status; show engine PERFORMANCE_SCHEMA status;
......
...@@ -45,11 +45,11 @@ performance_schema_max_file_classes 50 ...@@ -45,11 +45,11 @@ performance_schema_max_file_classes 50
performance_schema_max_file_handles 32768 performance_schema_max_file_handles 32768
performance_schema_max_file_instances 0 performance_schema_max_file_instances 0
performance_schema_max_mutex_classes 200 performance_schema_max_mutex_classes 200
performance_schema_max_mutex_instances 1000000 performance_schema_max_mutex_instances 10000
performance_schema_max_rwlock_classes 30 performance_schema_max_rwlock_classes 30
performance_schema_max_rwlock_instances 1000000 performance_schema_max_rwlock_instances 10000
performance_schema_max_table_handles 100000 performance_schema_max_table_handles 1000
performance_schema_max_table_instances 50000 performance_schema_max_table_instances 500
performance_schema_max_thread_classes 50 performance_schema_max_thread_classes 50
performance_schema_max_thread_instances 1000 performance_schema_max_thread_instances 1000
show engine PERFORMANCE_SCHEMA status; show engine PERFORMANCE_SCHEMA status;
......
...@@ -45,11 +45,11 @@ performance_schema_max_file_classes 50 ...@@ -45,11 +45,11 @@ performance_schema_max_file_classes 50
performance_schema_max_file_handles 32768 performance_schema_max_file_handles 32768
performance_schema_max_file_instances 10000 performance_schema_max_file_instances 10000
performance_schema_max_mutex_classes 0 performance_schema_max_mutex_classes 0
performance_schema_max_mutex_instances 1000000 performance_schema_max_mutex_instances 10000
performance_schema_max_rwlock_classes 30 performance_schema_max_rwlock_classes 30
performance_schema_max_rwlock_instances 1000000 performance_schema_max_rwlock_instances 10000
performance_schema_max_table_handles 100000 performance_schema_max_table_handles 1000
performance_schema_max_table_instances 50000 performance_schema_max_table_instances 500
performance_schema_max_thread_classes 50 performance_schema_max_thread_classes 50
performance_schema_max_thread_instances 1000 performance_schema_max_thread_instances 1000
show engine PERFORMANCE_SCHEMA status; show engine PERFORMANCE_SCHEMA status;
......
...@@ -47,9 +47,9 @@ performance_schema_max_file_instances 10000 ...@@ -47,9 +47,9 @@ performance_schema_max_file_instances 10000
performance_schema_max_mutex_classes 200 performance_schema_max_mutex_classes 200
performance_schema_max_mutex_instances 0 performance_schema_max_mutex_instances 0
performance_schema_max_rwlock_classes 30 performance_schema_max_rwlock_classes 30
performance_schema_max_rwlock_instances 1000000 performance_schema_max_rwlock_instances 10000
performance_schema_max_table_handles 100000 performance_schema_max_table_handles 1000
performance_schema_max_table_instances 50000 performance_schema_max_table_instances 500
performance_schema_max_thread_classes 50 performance_schema_max_thread_classes 50
performance_schema_max_thread_instances 1000 performance_schema_max_thread_instances 1000
show engine PERFORMANCE_SCHEMA status; show engine PERFORMANCE_SCHEMA status;
......
...@@ -45,11 +45,11 @@ performance_schema_max_file_classes 50 ...@@ -45,11 +45,11 @@ performance_schema_max_file_classes 50
performance_schema_max_file_handles 32768 performance_schema_max_file_handles 32768
performance_schema_max_file_instances 10000 performance_schema_max_file_instances 10000
performance_schema_max_mutex_classes 200 performance_schema_max_mutex_classes 200
performance_schema_max_mutex_instances 1000000 performance_schema_max_mutex_instances 10000
performance_schema_max_rwlock_classes 0 performance_schema_max_rwlock_classes 0
performance_schema_max_rwlock_instances 1000000 performance_schema_max_rwlock_instances 10000
performance_schema_max_table_handles 100000 performance_schema_max_table_handles 1000
performance_schema_max_table_instances 50000 performance_schema_max_table_instances 500
performance_schema_max_thread_classes 50 performance_schema_max_thread_classes 50
performance_schema_max_thread_instances 1000 performance_schema_max_thread_instances 1000
show engine PERFORMANCE_SCHEMA status; show engine PERFORMANCE_SCHEMA status;
......
...@@ -45,11 +45,11 @@ performance_schema_max_file_classes 50 ...@@ -45,11 +45,11 @@ performance_schema_max_file_classes 50
performance_schema_max_file_handles 32768 performance_schema_max_file_handles 32768
performance_schema_max_file_instances 10000 performance_schema_max_file_instances 10000
performance_schema_max_mutex_classes 200 performance_schema_max_mutex_classes 200
performance_schema_max_mutex_instances 1000000 performance_schema_max_mutex_instances 10000
performance_schema_max_rwlock_classes 30 performance_schema_max_rwlock_classes 30
performance_schema_max_rwlock_instances 0 performance_schema_max_rwlock_instances 0
performance_schema_max_table_handles 100000 performance_schema_max_table_handles 1000
performance_schema_max_table_instances 50000 performance_schema_max_table_instances 500
performance_schema_max_thread_classes 50 performance_schema_max_thread_classes 50
performance_schema_max_thread_instances 1000 performance_schema_max_thread_instances 1000
show engine PERFORMANCE_SCHEMA status; show engine PERFORMANCE_SCHEMA status;
......
...@@ -45,11 +45,11 @@ performance_schema_max_file_classes 50 ...@@ -45,11 +45,11 @@ performance_schema_max_file_classes 50
performance_schema_max_file_handles 32768 performance_schema_max_file_handles 32768
performance_schema_max_file_instances 10000 performance_schema_max_file_instances 10000
performance_schema_max_mutex_classes 200 performance_schema_max_mutex_classes 200
performance_schema_max_mutex_instances 1000000 performance_schema_max_mutex_instances 10000
performance_schema_max_rwlock_classes 30 performance_schema_max_rwlock_classes 30
performance_schema_max_rwlock_instances 1000000 performance_schema_max_rwlock_instances 10000
performance_schema_max_table_handles 100000 performance_schema_max_table_handles 1000
performance_schema_max_table_instances 50000 performance_schema_max_table_instances 500
performance_schema_max_thread_classes 0 performance_schema_max_thread_classes 0
performance_schema_max_thread_instances 1000 performance_schema_max_thread_instances 1000
show engine PERFORMANCE_SCHEMA status; show engine PERFORMANCE_SCHEMA status;
......
...@@ -45,11 +45,11 @@ performance_schema_max_file_classes 50 ...@@ -45,11 +45,11 @@ performance_schema_max_file_classes 50
performance_schema_max_file_handles 32768 performance_schema_max_file_handles 32768
performance_schema_max_file_instances 10000 performance_schema_max_file_instances 10000
performance_schema_max_mutex_classes 200 performance_schema_max_mutex_classes 200
performance_schema_max_mutex_instances 1000000 performance_schema_max_mutex_instances 10000
performance_schema_max_rwlock_classes 30 performance_schema_max_rwlock_classes 30
performance_schema_max_rwlock_instances 1000000 performance_schema_max_rwlock_instances 10000
performance_schema_max_table_handles 100000 performance_schema_max_table_handles 1000
performance_schema_max_table_instances 50000 performance_schema_max_table_instances 500
performance_schema_max_thread_classes 50 performance_schema_max_thread_classes 50
performance_schema_max_thread_instances 0 performance_schema_max_thread_instances 0
show engine PERFORMANCE_SCHEMA status; show engine PERFORMANCE_SCHEMA status;
......
...@@ -45,11 +45,11 @@ performance_schema_max_file_classes 50 ...@@ -45,11 +45,11 @@ performance_schema_max_file_classes 50
performance_schema_max_file_handles 32768 performance_schema_max_file_handles 32768
performance_schema_max_file_instances 10000 performance_schema_max_file_instances 10000
performance_schema_max_mutex_classes 200 performance_schema_max_mutex_classes 200
performance_schema_max_mutex_instances 1000000 performance_schema_max_mutex_instances 10000
performance_schema_max_rwlock_classes 30 performance_schema_max_rwlock_classes 30
performance_schema_max_rwlock_instances 1000000 performance_schema_max_rwlock_instances 10000
performance_schema_max_table_handles 100000 performance_schema_max_table_handles 1000
performance_schema_max_table_instances 50000 performance_schema_max_table_instances 500
performance_schema_max_thread_classes 50 performance_schema_max_thread_classes 50
performance_schema_max_thread_instances 1000 performance_schema_max_thread_instances 1000
show engine PERFORMANCE_SCHEMA status; show engine PERFORMANCE_SCHEMA status;
......
...@@ -45,11 +45,11 @@ performance_schema_max_file_classes 50 ...@@ -45,11 +45,11 @@ performance_schema_max_file_classes 50
performance_schema_max_file_handles 32768 performance_schema_max_file_handles 32768
performance_schema_max_file_instances 10000 performance_schema_max_file_instances 10000
performance_schema_max_mutex_classes 200 performance_schema_max_mutex_classes 200
performance_schema_max_mutex_instances 1000000 performance_schema_max_mutex_instances 10000
performance_schema_max_rwlock_classes 30 performance_schema_max_rwlock_classes 30
performance_schema_max_rwlock_instances 1000000 performance_schema_max_rwlock_instances 10000
performance_schema_max_table_handles 100000 performance_schema_max_table_handles 1000
performance_schema_max_table_instances 50000 performance_schema_max_table_instances 500
performance_schema_max_thread_classes 50 performance_schema_max_thread_classes 50
performance_schema_max_thread_instances 1000 performance_schema_max_thread_instances 1000
show engine PERFORMANCE_SCHEMA status; show engine PERFORMANCE_SCHEMA status;
......
# 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,
# 51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA */
# Tests for PERFORMANCE_SCHEMA
--source include/not_embedded.inc
--source include/have_perfschema.inc
#
# The checksum value itself is random (data is volatile),
# just testing that this does not crash
#
--disable_result_log
checksum table performance_schema.COND_INSTANCES;
checksum table performance_schema.EVENTS_WAITS_CURRENT;
checksum table performance_schema.EVENTS_WAITS_HISTORY;
checksum table performance_schema.EVENTS_WAITS_HISTORY_LONG;
checksum table performance_schema.EVENTS_WAITS_SUMMARY_BY_INSTANCE;
checksum table performance_schema.EVENTS_WAITS_SUMMARY_BY_THREAD_BY_EVENT_NAME;
checksum table performance_schema.EVENTS_WAITS_SUMMARY_GLOBAL_BY_EVENT_NAME;
checksum table performance_schema.FILE_INSTANCES;
checksum table performance_schema.FILE_SUMMARY_BY_EVENT_NAME;
checksum table performance_schema.FILE_SUMMARY_BY_INSTANCE;
checksum table performance_schema.MUTEX_INSTANCES;
checksum table performance_schema.PERFORMANCE_TIMERS;
checksum table performance_schema.RWLOCK_INSTANCES;
checksum table performance_schema.SETUP_CONSUMERS;
checksum table performance_schema.SETUP_INSTRUMENTS;
checksum table performance_schema.SETUP_TIMERS;
checksum table performance_schema.THREADS;
checksum table performance_schema.COND_INSTANCES extended;
checksum table performance_schema.EVENTS_WAITS_CURRENT extended;
checksum table performance_schema.EVENTS_WAITS_HISTORY extended;
checksum table performance_schema.EVENTS_WAITS_HISTORY_LONG extended;
checksum table performance_schema.EVENTS_WAITS_SUMMARY_BY_INSTANCE extended;
checksum table performance_schema.EVENTS_WAITS_SUMMARY_BY_THREAD_BY_EVENT_NAME extended;
checksum table performance_schema.EVENTS_WAITS_SUMMARY_GLOBAL_BY_EVENT_NAME extended;
checksum table performance_schema.FILE_INSTANCES extended;
checksum table performance_schema.FILE_SUMMARY_BY_EVENT_NAME extended;
checksum table performance_schema.FILE_SUMMARY_BY_INSTANCE extended;
checksum table performance_schema.MUTEX_INSTANCES extended;
checksum table performance_schema.PERFORMANCE_TIMERS extended;
checksum table performance_schema.RWLOCK_INSTANCES extended;
checksum table performance_schema.SETUP_CONSUMERS extended;
checksum table performance_schema.SETUP_INSTRUMENTS extended;
checksum table performance_schema.SETUP_TIMERS extended;
checksum table performance_schema.THREADS extended;
--enable_result_log
# Copyright (C) 2009 Sun Microsystems, Inc # Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
# #
# This program is free software; you can redistribute it and/or modify # 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 # it under the terms of the GNU General Public License as published by
...@@ -10,8 +10,8 @@ ...@@ -10,8 +10,8 @@
# GNU General Public License for more details. # GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software # along with this program; if not, write to the Free Software Foundation,
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # 51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA
# Tests for PERFORMANCE_SCHEMA # Tests for PERFORMANCE_SCHEMA
...@@ -43,10 +43,6 @@ select count(name) from MUTEX_INSTANCES ...@@ -43,10 +43,6 @@ select count(name) from MUTEX_INSTANCES
select count(name) from MUTEX_INSTANCES select count(name) from MUTEX_INSTANCES
where name like "wait/synch/mutex/mysys/THR_LOCK_myisam"; where name like "wait/synch/mutex/mysys/THR_LOCK_myisam";
# Does not exist in mysql 5.5, 6.0 only
# select count(name) from MUTEX_INSTANCES
# where name like "wait/synch/mutex/mysys/THR_LOCK_myisam_log";
select count(name) from MUTEX_INSTANCES select count(name) from MUTEX_INSTANCES
where name like "wait/synch/mutex/mysys/THR_LOCK_heap"; where name like "wait/synch/mutex/mysys/THR_LOCK_heap";
...@@ -83,11 +79,6 @@ select count(name) from MUTEX_INSTANCES ...@@ -83,11 +79,6 @@ select count(name) from MUTEX_INSTANCES
select count(name) from MUTEX_INSTANCES select count(name) from MUTEX_INSTANCES
where name like "wait/synch/mutex/sql/LOCK_delayed_insert"; where name like "wait/synch/mutex/sql/LOCK_delayed_insert";
# Named LOCK_uuid_short in 6.0 only
# select count(name) from MUTEX_INSTANCES
# where name like "wait/synch/mutex/sql/LOCK_uuid_short";
# Named LOCK_uuid_generator in 5.5, LOCK_uuid_short in 6.0
select count(name) from MUTEX_INSTANCES select count(name) from MUTEX_INSTANCES
where name like "wait/synch/mutex/sql/LOCK_uuid_generator"; where name like "wait/synch/mutex/sql/LOCK_uuid_generator";
...@@ -130,14 +121,16 @@ select count(name) from MUTEX_INSTANCES ...@@ -130,14 +121,16 @@ select count(name) from MUTEX_INSTANCES
select count(name) from MUTEX_INSTANCES select count(name) from MUTEX_INSTANCES
where name like "wait/synch/mutex/sql/LOCK_rpl_status"; where name like "wait/synch/mutex/sql/LOCK_rpl_status";
select count(name) from MUTEX_INSTANCES # LOG_INFO object are created on demand, and are not global.
where name like "wait/synch/mutex/sql/LOG_INFO::lock"; # select count(name) from MUTEX_INSTANCES
# where name like "wait/synch/mutex/sql/LOG_INFO::lock";
select count(name) from MUTEX_INSTANCES select count(name) from MUTEX_INSTANCES
where name like "wait/synch/mutex/sql/Query_cache::structure_guard_mutex"; where name like "wait/synch/mutex/sql/Query_cache::structure_guard_mutex";
select count(name) from MUTEX_INSTANCES # The event scheduler may be disabled
where name like "wait/synch/mutex/sql/Event_scheduler::LOCK_scheduler_state"; # select count(name) from MUTEX_INSTANCES
# where name like "wait/synch/mutex/sql/Event_scheduler::LOCK_scheduler_state";
select count(name) from MUTEX_INSTANCES select count(name) from MUTEX_INSTANCES
where name like "wait/synch/mutex/sql/LOCK_event_metadata"; where name like "wait/synch/mutex/sql/LOCK_event_metadata";
...@@ -148,16 +141,11 @@ select count(name) from MUTEX_INSTANCES ...@@ -148,16 +141,11 @@ select count(name) from MUTEX_INSTANCES
select count(name) from MUTEX_INSTANCES select count(name) from MUTEX_INSTANCES
where name like "wait/synch/mutex/sql/LOCK_user_locks"; where name like "wait/synch/mutex/sql/LOCK_user_locks";
# Does not exist in mysql 5.5, 6.0 only
# select count(name) from MUTEX_INSTANCES
# where name like "wait/synch/mutex/sql/LOCK_mdl";
select count(name) from MUTEX_INSTANCES select count(name) from MUTEX_INSTANCES
where name like "wait/synch/mutex/sql/Cversion_lock"; where name like "wait/synch/mutex/sql/Cversion_lock";
# Does not exist in mysql 5.5, 6.0 only select count(name) from MUTEX_INSTANCES
# select count(name) from MUTEX_INSTANCES where name like "wait/synch/mutex/sql/LOCK_audit_mask";
# where name like "wait/synch/mutex/sql/LOCK_audit_mask";
select count(name) from MUTEX_INSTANCES select count(name) from MUTEX_INSTANCES
where name like "wait/synch/mutex/sql/LOCK_xid_cache"; where name like "wait/synch/mutex/sql/LOCK_xid_cache";
...@@ -165,28 +153,13 @@ select count(name) from MUTEX_INSTANCES ...@@ -165,28 +153,13 @@ select count(name) from MUTEX_INSTANCES
select count(name) from MUTEX_INSTANCES select count(name) from MUTEX_INSTANCES
where name like "wait/synch/mutex/sql/LOCK_plugin"; where name like "wait/synch/mutex/sql/LOCK_plugin";
select count(name) from MUTEX_INSTANCES # Not a global variable, may be destroyed already.
where name like "wait/synch/mutex/sql/LOCK_gdl"; # select count(name) from MUTEX_INSTANCES
# where name like "wait/synch/mutex/sql/LOCK_gdl";
select count(name) from MUTEX_INSTANCES select count(name) from MUTEX_INSTANCES
where name like "wait/synch/mutex/sql/tz_LOCK"; where name like "wait/synch/mutex/sql/tz_LOCK";
# Does not exist in mysql 5.5, 6.0 only
# select count(name) from MUTEX_INSTANCES
# where name like "wait/synch/mutex/sql/slave_start";
# Does not exist in mysql 5.5, 6.0 only
# select count(name) from MUTEX_INSTANCES
# where name like "wait/synch/mutex/sql/BML_class::THR_LOCK_BML";
# Does not exist in mysql 5.5, 6.0 only
# select count(name) from MUTEX_INSTANCES
# where name like "wait/synch/mutex/sql/BML_class::THR_LOCK_BML_active";
# Does not exist in mysql 5.5, 6.0 only
# select count(name) from MUTEX_INSTANCES
# where name like "wait/synch/mutex/sql/BML_class::THR_LOCK_BML_get";
# Verify that these global rwlocks have been properly initilized in sql # Verify that these global rwlocks have been properly initilized in sql
select count(name) from RWLOCK_INSTANCES select count(name) from RWLOCK_INSTANCES
...@@ -230,25 +203,10 @@ select count(name) from COND_INSTANCES ...@@ -230,25 +203,10 @@ select count(name) from COND_INSTANCES
select count(name) from COND_INSTANCES select count(name) from COND_INSTANCES
where name like "wait/synch/cond/sql/Query_cache::COND_cache_status_changed"; where name like "wait/synch/cond/sql/Query_cache::COND_cache_status_changed";
select count(name) from COND_INSTANCES # The event scheduler may be disabled
where name like "wait/synch/cond/sql/Event_scheduler::COND_state"; # select count(name) from COND_INSTANCES
# where name like "wait/synch/cond/sql/Event_scheduler::COND_state";
select count(name) from COND_INSTANCES select count(name) from COND_INSTANCES
where name like "wait/synch/cond/sql/COND_queue_state"; where name like "wait/synch/cond/sql/COND_queue_state";
# Does not exist in mysql 5.5, 6.0 only
# select count(name) from COND_INSTANCES
# where name like "wait/synch/cond/sql/COND_mdl";
# Does not exist in mysql 5.5, 6.0 only
# select count(name) from COND_INSTANCES
# where name like "wait/synch/cond/sql/BML_class::COND_BML";
# Does not exist in mysql 5.5, 6.0 only
# select count(name) from COND_INSTANCES
# where name like "wait/synch/cond/sql/BML_class::COND_BML_registered";
# Does not exist in mysql 5.5, 6.0 only
# select count(name) from COND_INSTANCES
# where name like "wait/synch/cond/sql/BML_class::COND_BML_release";
...@@ -745,3 +745,28 @@ ...@@ -745,3 +745,28 @@
Memcheck:Addr1 Memcheck:Addr1
fun:buf_buddy_relocate fun:buf_buddy_relocate
} }
#
# See related Bug#56666
# Race condition between the server main thread and the kill server thread.
#
# Because of this race condition, the call to shutdown_performance_schema()
# was commented in sql/mysqld.cc, causing the reported leaks.
#
{
missing shutdown_performance_schema 1
Memcheck:Leak
fun:malloc
fun:_Z10pfs_mallocmi
}
{
missing shutdown_performance_schema 2
Memcheck:Leak
fun:malloc
fun:my_malloc
fun:_lf_alloc_new
fun:lf_hash_insert
}
...@@ -64,7 +64,7 @@ my_bool my_gethwaddr(uchar *to) ...@@ -64,7 +64,7 @@ my_bool my_gethwaddr(uchar *to)
if (ifm->ifm_type == RTM_IFINFO) if (ifm->ifm_type == RTM_IFINFO)
{ {
sdl = (struct sockaddr_dl *)(ifm + 1); sdl = (struct sockaddr_dl *)(ifm + 1);
addr=LLADDR(sdl); addr=(uchar *)LLADDR(sdl);
res=memcpy_and_test(to, addr, ETHER_ADDR_LEN); res=memcpy_and_test(to, addr, ETHER_ADDR_LEN);
} }
} }
......
...@@ -100,9 +100,9 @@ static const char cur_dir_name[]= {FN_CURLIB, 0}; ...@@ -100,9 +100,9 @@ static const char cur_dir_name[]= {FN_CURLIB, 0};
RETURN RETURN
0 if ok, !=0 if error 0 if ok, !=0 if error
*/ */
#ifdef NEED_EXPLICIT_SYNC_DIR
int my_sync_dir(const char *dir_name, myf my_flags) int my_sync_dir(const char *dir_name, myf my_flags)
{ {
#ifdef NEED_EXPLICIT_SYNC_DIR
File dir_fd; File dir_fd;
int res= 0; int res= 0;
const char *correct_dir_name; const char *correct_dir_name;
...@@ -124,10 +124,14 @@ int my_sync_dir(const char *dir_name, myf my_flags) ...@@ -124,10 +124,14 @@ int my_sync_dir(const char *dir_name, myf my_flags)
else else
res= 1; res= 1;
DBUG_RETURN(res); DBUG_RETURN(res);
#else }
#else /* NEED_EXPLICIT_SYNC_DIR */
int my_sync_dir(const char *dir_name __attribute__((unused)),
myf my_flags __attribute__((unused)))
{
return 0; return 0;
#endif
} }
#endif /* NEED_EXPLICIT_SYNC_DIR */
/* /*
...@@ -141,15 +145,18 @@ int my_sync_dir(const char *dir_name, myf my_flags) ...@@ -141,15 +145,18 @@ int my_sync_dir(const char *dir_name, myf my_flags)
RETURN RETURN
0 if ok, !=0 if error 0 if ok, !=0 if error
*/ */
#ifdef NEED_EXPLICIT_SYNC_DIR
int my_sync_dir_by_file(const char *file_name, myf my_flags) int my_sync_dir_by_file(const char *file_name, myf my_flags)
{ {
#ifdef NEED_EXPLICIT_SYNC_DIR
char dir_name[FN_REFLEN]; char dir_name[FN_REFLEN];
size_t dir_name_length; size_t dir_name_length;
dirname_part(dir_name, file_name, &dir_name_length); dirname_part(dir_name, file_name, &dir_name_length);
return my_sync_dir(dir_name, my_flags); return my_sync_dir(dir_name, my_flags);
#else }
#else /* NEED_EXPLICIT_SYNC_DIR */
int my_sync_dir_by_file(const char *file_name __attribute__((unused)),
myf my_flags __attribute__((unused)))
{
return 0; return 0;
#endif
} }
#endif /* NEED_EXPLICIT_SYNC_DIR */
...@@ -5284,11 +5284,8 @@ int MYSQL_BIN_LOG::wait_for_update_bin_log(THD* thd, ...@@ -5284,11 +5284,8 @@ int MYSQL_BIN_LOG::wait_for_update_bin_log(THD* thd,
const struct timespec *timeout) const struct timespec *timeout)
{ {
int ret= 0; int ret= 0;
const char* old_msg = thd->proc_info;
DBUG_ENTER("wait_for_update_bin_log"); DBUG_ENTER("wait_for_update_bin_log");
old_msg= thd->enter_cond(&update_cond, &LOCK_log,
"Master has sent all binlog to slave; "
"waiting for binlog to be updated");
if (!timeout) if (!timeout)
mysql_cond_wait(&update_cond, &LOCK_log); mysql_cond_wait(&update_cond, &LOCK_log);
else else
......
...@@ -460,6 +460,7 @@ public: ...@@ -460,6 +460,7 @@ public:
inline char* get_log_fname() { return log_file_name; } inline char* get_log_fname() { return log_file_name; }
inline char* get_name() { return name; } inline char* get_name() { return name; }
inline mysql_mutex_t* get_log_lock() { return &LOCK_log; } inline mysql_mutex_t* get_log_lock() { return &LOCK_log; }
inline mysql_cond_t* get_log_cond() { return &update_cond; }
inline IO_CACHE* get_log_file() { return &log_file; } inline IO_CACHE* get_log_file() { return &log_file; }
inline void lock_index() { mysql_mutex_lock(&LOCK_index);} inline void lock_index() { mysql_mutex_lock(&LOCK_index);}
......
...@@ -1395,6 +1395,12 @@ static void mysqld_exit(int exit_code) ...@@ -1395,6 +1395,12 @@ static void mysqld_exit(int exit_code)
mysql_audit_finalize(); mysql_audit_finalize();
clean_up_mutexes(); clean_up_mutexes();
clean_up_error_log_mutex(); clean_up_error_log_mutex();
#ifdef WITH_PERFSCHEMA_STORAGE_ENGINE
/*
Bug#56666 needs to be fixed before calling:
shutdown_performance_schema();
*/
#endif
my_end(opt_endinfo ? MY_CHECK_ERROR | MY_GIVE_INFO : 0); my_end(opt_endinfo ? MY_CHECK_ERROR | MY_GIVE_INFO : 0);
exit(exit_code); /* purecov: inspected */ exit(exit_code); /* purecov: inspected */
} }
...@@ -2733,6 +2739,11 @@ pthread_handler_t signal_hand(void *arg __attribute__((unused))) ...@@ -2733,6 +2739,11 @@ pthread_handler_t signal_hand(void *arg __attribute__((unused)))
if (!abort_loop) if (!abort_loop)
{ {
abort_loop=1; // mark abort for threads abort_loop=1; // mark abort for threads
#ifdef HAVE_PSI_INTERFACE
/* Delete the instrumentation for the signal thread */
if (likely(PSI_server != NULL))
PSI_server->delete_current_thread();
#endif
#ifdef USE_ONE_SIGNAL_HAND #ifdef USE_ONE_SIGNAL_HAND
pthread_t tmp; pthread_t tmp;
if (mysql_thread_create(0, /* Not instrumented */ if (mysql_thread_create(0, /* Not instrumented */
...@@ -4588,6 +4599,15 @@ int mysqld_main(int argc, char **argv) ...@@ -4588,6 +4599,15 @@ int mysqld_main(int argc, char **argv)
#endif #endif
#endif /* __WIN__ */ #endif /* __WIN__ */
#ifdef HAVE_PSI_INTERFACE
/*
Disable the main thread instrumentation,
to avoid recording events during the shutdown.
*/
if (PSI_server)
PSI_server->delete_current_thread();
#endif
/* Wait until cleanup is done */ /* Wait until cleanup is done */
mysql_mutex_lock(&LOCK_thread_count); mysql_mutex_lock(&LOCK_thread_count);
while (!ready_to_exit) while (!ready_to_exit)
...@@ -4605,18 +4625,6 @@ int mysqld_main(int argc, char **argv) ...@@ -4605,18 +4625,6 @@ int mysqld_main(int argc, char **argv)
} }
#endif #endif
clean_up(1); clean_up(1);
#ifdef HAVE_PSI_INTERFACE
/*
Disable the instrumentation, to avoid recording events
during the shutdown.
*/
if (PSI_server)
{
PSI_server->delete_current_thread();
PSI_server= NULL;
}
shutdown_performance_schema();
#endif
mysqld_exit(0); mysqld_exit(0);
} }
......
...@@ -91,6 +91,9 @@ public: ...@@ -91,6 +91,9 @@ public:
longlong def_val, PolyLock *lock, enum binlog_status_enum binlog_status_arg, longlong def_val, PolyLock *lock, enum binlog_status_enum binlog_status_arg,
on_check_function on_check_func, on_update_function on_update_func, on_check_function on_check_func, on_update_function on_update_func,
uint deprecated_version, const char *substitute, int parse_flag); uint deprecated_version, const char *substitute, int parse_flag);
virtual ~sys_var() {}
/** /**
All the cleanup procedures should be performed here All the cleanup procedures should be performed here
*/ */
......
...@@ -448,6 +448,8 @@ void mysql_binlog_send(THD* thd, char* log_ident, my_off_t pos, ...@@ -448,6 +448,8 @@ void mysql_binlog_send(THD* thd, char* log_ident, my_off_t pos,
const char *errmsg = "Unknown error"; const char *errmsg = "Unknown error";
NET* net = &thd->net; NET* net = &thd->net;
mysql_mutex_t *log_lock; mysql_mutex_t *log_lock;
mysql_cond_t *log_cond;
bool binlog_can_be_corrupted= FALSE; bool binlog_can_be_corrupted= FALSE;
#ifndef DBUG_OFF #ifndef DBUG_OFF
int left_events = max_binlog_dump_events; int left_events = max_binlog_dump_events;
...@@ -591,7 +593,8 @@ impossible position"; ...@@ -591,7 +593,8 @@ impossible position";
mysql_bin_log, and it's already inited, and it will be destroyed mysql_bin_log, and it's already inited, and it will be destroyed
only at shutdown). only at shutdown).
*/ */
log_lock = mysql_bin_log.get_log_lock(); log_lock= mysql_bin_log.get_log_lock();
log_cond= mysql_bin_log.get_log_cond();
if (pos > BIN_LOG_HEADER_SIZE) if (pos > BIN_LOG_HEADER_SIZE)
{ {
/* reset transmit packet for the event read from binary log /* reset transmit packet for the event read from binary log
...@@ -826,6 +829,7 @@ impossible position"; ...@@ -826,6 +829,7 @@ impossible position";
#ifndef DBUG_OFF #ifndef DBUG_OFF
ulong hb_info_counter= 0; ulong hb_info_counter= 0;
#endif #endif
const char* old_msg= thd->proc_info;
signal_cnt= mysql_bin_log.signal_cnt; signal_cnt= mysql_bin_log.signal_cnt;
do do
{ {
...@@ -834,6 +838,9 @@ impossible position"; ...@@ -834,6 +838,9 @@ impossible position";
DBUG_ASSERT(heartbeat_ts && heartbeat_period != 0); DBUG_ASSERT(heartbeat_ts && heartbeat_period != 0);
set_timespec_nsec(*heartbeat_ts, heartbeat_period); set_timespec_nsec(*heartbeat_ts, heartbeat_period);
} }
thd->enter_cond(log_cond, log_lock,
"Master has sent all binlog to slave; "
"waiting for binlog to be updated");
ret= mysql_bin_log.wait_for_update_bin_log(thd, heartbeat_ts); ret= mysql_bin_log.wait_for_update_bin_log(thd, heartbeat_ts);
DBUG_ASSERT(ret == 0 || (heartbeat_period != 0 && coord != NULL)); DBUG_ASSERT(ret == 0 || (heartbeat_period != 0 && coord != NULL));
if (ret == ETIMEDOUT || ret == ETIME) if (ret == ETIMEDOUT || ret == ETIME)
...@@ -849,12 +856,15 @@ impossible position"; ...@@ -849,12 +856,15 @@ impossible position";
#endif #endif
/* reset transmit packet for the heartbeat event */ /* reset transmit packet for the heartbeat event */
if (reset_transmit_packet(thd, flags, &ev_offset, &errmsg)) if (reset_transmit_packet(thd, flags, &ev_offset, &errmsg))
{
thd->exit_cond(old_msg);
goto err; goto err;
}
if (send_heartbeat_event(net, packet, coord)) if (send_heartbeat_event(net, packet, coord))
{ {
errmsg = "Failed on my_net_write()"; errmsg = "Failed on my_net_write()";
my_errno= ER_UNKNOWN_ERROR; my_errno= ER_UNKNOWN_ERROR;
mysql_mutex_unlock(log_lock); thd->exit_cond(old_msg);
goto err; goto err;
} }
} }
...@@ -863,7 +873,7 @@ impossible position"; ...@@ -863,7 +873,7 @@ impossible position";
DBUG_PRINT("wait",("binary log received update or a broadcast signal caught")); DBUG_PRINT("wait",("binary log received update or a broadcast signal caught"));
} }
} while (signal_cnt == mysql_bin_log.signal_cnt && !thd->killed); } while (signal_cnt == mysql_bin_log.signal_cnt && !thd->killed);
mysql_mutex_unlock(log_lock); thd->exit_cond(old_msg);
} }
break; break;
......
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
#include "my_global.h" #include "my_global.h"
#include "my_pthread.h" #include "my_pthread.h"
#include "my_atomic.h"
#include "sql_plugin.h" #include "sql_plugin.h"
#include "mysql/plugin.h" #include "mysql/plugin.h"
#include "ha_perfschema.h" #include "ha_perfschema.h"
...@@ -28,6 +29,17 @@ ...@@ -28,6 +29,17 @@
#include "pfs_instr_class.h" #include "pfs_instr_class.h"
#include "pfs_instr.h" #include "pfs_instr.h"
#ifdef MY_ATOMIC_MODE_DUMMY
/*
The performance schema can can not function with MY_ATOMIC_MODE_DUMMY,
a fully functional implementation of MY_ATOMIC should be used instead.
If the build fails with this error message:
- either use a different ./configure --with-atomic-ops option
- or do not build with the performance schema.
*/
#error "The performance schema needs a functional MY_ATOMIC implementation."
#endif
handlerton *pfs_hton= NULL; handlerton *pfs_hton= NULL;
static handler* pfs_create_handler(handlerton *hton, static handler* pfs_create_handler(handlerton *hton,
......
...@@ -223,6 +223,8 @@ int PFS_engine_table::read_row(TABLE *table, ...@@ -223,6 +223,8 @@ int PFS_engine_table::read_row(TABLE *table,
Field **fields) Field **fields)
{ {
my_bitmap_map *org_bitmap; my_bitmap_map *org_bitmap;
Field *f;
Field **fields_reset;
/* /*
Make sure the table structure is as expected before mapping Make sure the table structure is as expected before mapping
...@@ -240,6 +242,16 @@ int PFS_engine_table::read_row(TABLE *table, ...@@ -240,6 +242,16 @@ int PFS_engine_table::read_row(TABLE *table,
/* We internally write to Fields to support the read interface */ /* We internally write to Fields to support the read interface */
org_bitmap= dbug_tmp_use_all_columns(table, table->write_set); org_bitmap= dbug_tmp_use_all_columns(table, table->write_set);
/*
Some callers of the storage engine interface do not honor the
f->is_null() flag, and will attempt to read the data itself.
A known offender is mysql_checksum_table().
For robustness, reset every field.
*/
for (fields_reset= fields; (f= *fields_reset) ; fields_reset++)
f->reset();
int result= read_row_values(table, buf, fields, read_all); int result= read_row_values(table, buf, fields, read_all);
dbug_tmp_restore_column_map(table->write_set, org_bitmap); dbug_tmp_restore_column_map(table->write_set, org_bitmap);
......
...@@ -187,7 +187,7 @@ void table_events_waits_common::clear_object_columns() ...@@ -187,7 +187,7 @@ void table_events_waits_common::clear_object_columns()
*/ */
void table_events_waits_common::make_row(bool thread_own_wait, void table_events_waits_common::make_row(bool thread_own_wait,
PFS_thread *pfs_thread, PFS_thread *pfs_thread,
PFS_events_waits *wait) volatile PFS_events_waits *wait)
{ {
pfs_lock lock; pfs_lock lock;
PFS_thread *safe_thread; PFS_thread *safe_thread;
...@@ -251,21 +251,27 @@ void table_events_waits_common::make_row(bool thread_own_wait, ...@@ -251,21 +251,27 @@ void table_events_waits_common::make_row(bool thread_own_wait,
case WAIT_CLASS_TABLE: case WAIT_CLASS_TABLE:
m_row.m_object_type= "TABLE"; m_row.m_object_type= "TABLE";
m_row.m_object_type_length= 5; m_row.m_object_type_length= 5;
memcpy(m_row.m_object_schema, wait->m_schema_name,
wait->m_schema_name_length);
m_row.m_object_schema_length= wait->m_schema_name_length; m_row.m_object_schema_length= wait->m_schema_name_length;
memcpy(m_row.m_object_name, wait->m_object_name, if (unlikely((m_row.m_object_schema_length == 0) ||
wait->m_object_name_length); (m_row.m_object_schema_length > sizeof(m_row.m_object_schema))))
return;
memcpy(m_row.m_object_schema, wait->m_schema_name, m_row.m_object_schema_length);
m_row.m_object_name_length= wait->m_object_name_length; m_row.m_object_name_length= wait->m_object_name_length;
if (unlikely((m_row.m_object_name_length == 0) ||
(m_row.m_object_name_length > sizeof(m_row.m_object_name))))
return;
memcpy(m_row.m_object_name, wait->m_object_name, m_row.m_object_name_length);
safe_class= &global_table_class; safe_class= &global_table_class;
break; break;
case WAIT_CLASS_FILE: case WAIT_CLASS_FILE:
m_row.m_object_type= "FILE"; m_row.m_object_type= "FILE";
m_row.m_object_type_length= 4; m_row.m_object_type_length= 4;
m_row.m_object_schema_length= 0; m_row.m_object_schema_length= 0;
memcpy(m_row.m_object_name, wait->m_object_name,
wait->m_object_name_length);
m_row.m_object_name_length= wait->m_object_name_length; m_row.m_object_name_length= wait->m_object_name_length;
if (unlikely((m_row.m_object_name_length == 0) ||
(m_row.m_object_name_length > sizeof(m_row.m_object_name))))
return;
memcpy(m_row.m_object_name, wait->m_object_name, m_row.m_object_name_length);
safe_class= sanitize_file_class((PFS_file_class*) wait->m_class); safe_class= sanitize_file_class((PFS_file_class*) wait->m_class);
break; break;
case NO_WAIT_CLASS: case NO_WAIT_CLASS:
......
...@@ -137,7 +137,7 @@ protected: ...@@ -137,7 +137,7 @@ protected:
void clear_object_columns(); void clear_object_columns();
void make_row(bool thread_own_wait, PFS_thread *pfs_thread, void make_row(bool thread_own_wait, PFS_thread *pfs_thread,
PFS_events_waits *wait); volatile PFS_events_waits *wait);
/** Current row. */ /** Current row. */
row_events_waits m_row; row_events_waits m_row;
......
...@@ -255,7 +255,7 @@ static char *process_int_arg(char *to, char *end, size_t length, ...@@ -255,7 +255,7 @@ static char *process_int_arg(char *to, char *end, size_t length,
if ((to_length= (size_t) (end-to)) < 16 || length) if ((to_length= (size_t) (end-to)) < 16 || length)
store_start= buff; store_start= buff;
if (arg_type == 'd') if (arg_type == 'd' || arg_type == 'i')
store_end= longlong10_to_str(par, store_start, -10); store_end= longlong10_to_str(par, store_start, -10);
else if (arg_type == 'u') else if (arg_type == 'u')
store_end= longlong10_to_str(par, store_start, 10); store_end= longlong10_to_str(par, store_start, 10);
...@@ -399,6 +399,7 @@ start: ...@@ -399,6 +399,7 @@ start:
args_arr[i].double_arg= va_arg(ap, double); args_arr[i].double_arg= va_arg(ap, double);
break; break;
case 'd': case 'd':
case 'i':
case 'u': case 'u':
case 'x': case 'x':
case 'X': case 'X':
...@@ -406,7 +407,7 @@ start: ...@@ -406,7 +407,7 @@ start:
case 'p': case 'p':
if (args_arr[i].have_longlong) if (args_arr[i].have_longlong)
args_arr[i].longlong_arg= va_arg(ap,longlong); args_arr[i].longlong_arg= va_arg(ap,longlong);
else if (args_arr[i].arg_type == 'd') else if (args_arr[i].arg_type == 'd' || args_arr[i].arg_type == 'i')
args_arr[i].longlong_arg= va_arg(ap, int); args_arr[i].longlong_arg= va_arg(ap, int);
else else
args_arr[i].longlong_arg= va_arg(ap, uint); args_arr[i].longlong_arg= va_arg(ap, uint);
...@@ -458,6 +459,7 @@ start: ...@@ -458,6 +459,7 @@ start:
break; break;
} }
case 'd': case 'd':
case 'i':
case 'u': case 'u':
case 'x': case 'x':
case 'X': case 'X':
...@@ -472,7 +474,7 @@ start: ...@@ -472,7 +474,7 @@ start:
if (args_arr[print_arr[i].arg_idx].have_longlong) if (args_arr[print_arr[i].arg_idx].have_longlong)
larg = args_arr[print_arr[i].arg_idx].longlong_arg; larg = args_arr[print_arr[i].arg_idx].longlong_arg;
else if (print_arr[i].arg_type == 'd') else if (print_arr[i].arg_type == 'd' || print_arr[i].arg_type == 'i' )
larg = (int) args_arr[print_arr[i].arg_idx].longlong_arg; larg = (int) args_arr[print_arr[i].arg_idx].longlong_arg;
else else
larg= (uint) args_arr[print_arr[i].arg_idx].longlong_arg; larg= (uint) args_arr[print_arr[i].arg_idx].longlong_arg;
...@@ -615,8 +617,8 @@ size_t my_vsnprintf_ex(CHARSET_INFO *cs, char *to, size_t n, ...@@ -615,8 +617,8 @@ size_t my_vsnprintf_ex(CHARSET_INFO *cs, char *to, size_t n,
to= process_dbl_arg(to, end, width, d, *fmt); to= process_dbl_arg(to, end, width, d, *fmt);
continue; continue;
} }
else if (*fmt == 'd' || *fmt == 'u' || *fmt == 'x' || *fmt == 'X' || else if (*fmt == 'd' || *fmt == 'i' || *fmt == 'u' || *fmt == 'x' ||
*fmt == 'p' || *fmt == 'o') *fmt == 'X' || *fmt == 'p' || *fmt == 'o')
{ {
/* Integer parameter */ /* Integer parameter */
longlong larg; longlong larg;
...@@ -625,7 +627,7 @@ size_t my_vsnprintf_ex(CHARSET_INFO *cs, char *to, size_t n, ...@@ -625,7 +627,7 @@ size_t my_vsnprintf_ex(CHARSET_INFO *cs, char *to, size_t n,
if (have_longlong) if (have_longlong)
larg = va_arg(ap,longlong); larg = va_arg(ap,longlong);
else if (*fmt == 'd') else if (*fmt == 'd' || *fmt == 'i')
larg = va_arg(ap, int); larg = va_arg(ap, int);
else else
larg= va_arg(ap, uint); larg= va_arg(ap, uint);
......
...@@ -31,7 +31,7 @@ void test1(const char *res, const char *fmt, ...) ...@@ -31,7 +31,7 @@ void test1(const char *res, const char *fmt, ...)
int main(void) int main(void)
{ {
plan(54); plan(58);
test1("Constant string", test1("Constant string",
"Constant string"); "Constant string");
...@@ -44,6 +44,8 @@ int main(void) ...@@ -44,6 +44,8 @@ int main(void)
"Format specifier c %c", '!'); "Format specifier c %c", '!');
test1("Format specifier d 1", test1("Format specifier d 1",
"Format specifier d %d", 1); "Format specifier d %d", 1);
test1("Format specifier i 1",
"Format specifier i %i", 1);
test1("Format specifier u 2", test1("Format specifier u 2",
"Format specifier u %u", 2); "Format specifier u %u", 2);
test1("Format specifier o 375", test1("Format specifier o 375",
...@@ -77,6 +79,9 @@ int main(void) ...@@ -77,6 +79,9 @@ int main(void)
test1("Length modifiers work: 1 * -1 * 2 * 3", test1("Length modifiers work: 1 * -1 * 2 * 3",
"Length modifiers work: %d * %ld * %lld * %zd", 1, -1L, 2LL, (size_t)3); "Length modifiers work: %d * %ld * %lld * %zd", 1, -1L, 2LL, (size_t)3);
test1("Length modifiers work: 1 * -1 * 2 * 3",
"Length modifiers work: %i * %li * %lli * %zd", 1, -1L, 2LL, (size_t)3);
test1("long long X: 123456789abcdef0", test1("long long X: 123456789abcdef0",
"long long X: %llx", 0x123456789abcdef0LL); "long long X: %llx", 0x123456789abcdef0LL);
...@@ -121,6 +126,10 @@ int main(void) ...@@ -121,6 +126,10 @@ int main(void)
"Hello int, %d", 1); "Hello int, %d", 1);
test1("Hello int, -1", test1("Hello int, -1",
"Hello int, %d", -1); "Hello int, %d", -1);
test1("Hello int, 1",
"Hello int, %i", 1);
test1("Hello int, -1",
"Hello int, %i", -1);
test1("Hello string 'I am a string'", test1("Hello string 'I am a string'",
"Hello string '%s'", "I am a string"); "Hello string '%s'", "I am a string");
test1("Hello hack hack hack hack hack hack hack 1", test1("Hello hack hack hack hack hack hack hack 1",
......
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