Merge from mysql-5.5-bugfixing to mysql-5.5-runtime.
This commit is contained in:
commit
1818165cdb
@ -1335,15 +1335,11 @@ void _db_doprnt_(const char *format,...)
|
||||
* This function is intended as a
|
||||
* vfprintf clone with consistent, platform independent output for
|
||||
* 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)
|
||||
{
|
||||
char cvtbuf[1024];
|
||||
size_t len;
|
||||
/* Do not use my_vsnprintf, it does not support "%g". */
|
||||
len = vsnprintf(cvtbuf, sizeof(cvtbuf), format, args);
|
||||
(void) my_vsnprintf(cvtbuf, sizeof(cvtbuf), format, args);
|
||||
(void) fprintf(stream, "%s\n", cvtbuf);
|
||||
}
|
||||
|
||||
|
@ -53,7 +53,7 @@
|
||||
<length modifier> can be 'l', 'll', or 'z'.
|
||||
|
||||
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).
|
||||
|
||||
Standard syntax for positional arguments $n is supported.
|
||||
|
@ -18,7 +18,7 @@
|
||||
#
|
||||
|
||||
--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
|
||||
--cat_file $err_file
|
||||
|
34
mysql-test/suite/perfschema/r/checksum.result
Normal file
34
mysql-test/suite/perfschema/r/checksum.result
Normal file
@ -0,0 +1,34 @@
|
||||
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;
|
64
mysql-test/suite/perfschema/t/checksum.test
Normal file
64
mysql-test/suite/perfschema/t/checksum.test
Normal file
@ -0,0 +1,64 @@
|
||||
# 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
|
||||
|
@ -745,3 +745,28 @@
|
||||
Memcheck:Addr1
|
||||
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
|
||||
}
|
||||
|
||||
|
@ -1395,6 +1395,12 @@ static void mysqld_exit(int exit_code)
|
||||
mysql_audit_finalize();
|
||||
clean_up_mutexes();
|
||||
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);
|
||||
exit(exit_code); /* purecov: inspected */
|
||||
}
|
||||
@ -2733,6 +2739,11 @@ pthread_handler_t signal_hand(void *arg __attribute__((unused)))
|
||||
if (!abort_loop)
|
||||
{
|
||||
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
|
||||
pthread_t tmp;
|
||||
if (mysql_thread_create(0, /* Not instrumented */
|
||||
@ -4588,6 +4599,15 @@ int mysqld_main(int argc, char **argv)
|
||||
#endif
|
||||
#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 */
|
||||
mysql_mutex_lock(&LOCK_thread_count);
|
||||
while (!ready_to_exit)
|
||||
@ -4605,18 +4625,6 @@ int mysqld_main(int argc, char **argv)
|
||||
}
|
||||
#endif
|
||||
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);
|
||||
}
|
||||
|
||||
|
@ -20,6 +20,7 @@
|
||||
|
||||
#include "my_global.h"
|
||||
#include "my_pthread.h"
|
||||
#include "my_atomic.h"
|
||||
#include "sql_plugin.h"
|
||||
#include "mysql/plugin.h"
|
||||
#include "ha_perfschema.h"
|
||||
@ -28,6 +29,17 @@
|
||||
#include "pfs_instr_class.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;
|
||||
|
||||
static handler* pfs_create_handler(handlerton *hton,
|
||||
|
@ -187,7 +187,7 @@ void table_events_waits_common::clear_object_columns()
|
||||
*/
|
||||
void table_events_waits_common::make_row(bool thread_own_wait,
|
||||
PFS_thread *pfs_thread,
|
||||
PFS_events_waits *wait)
|
||||
volatile PFS_events_waits *wait)
|
||||
{
|
||||
pfs_lock lock;
|
||||
PFS_thread *safe_thread;
|
||||
@ -251,21 +251,27 @@ void table_events_waits_common::make_row(bool thread_own_wait,
|
||||
case WAIT_CLASS_TABLE:
|
||||
m_row.m_object_type= "TABLE";
|
||||
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;
|
||||
memcpy(m_row.m_object_name, wait->m_object_name,
|
||||
wait->m_object_name_length);
|
||||
if (unlikely((m_row.m_object_schema_length == 0) ||
|
||||
(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;
|
||||
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;
|
||||
break;
|
||||
case WAIT_CLASS_FILE:
|
||||
m_row.m_object_type= "FILE";
|
||||
m_row.m_object_type_length= 4;
|
||||
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;
|
||||
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);
|
||||
break;
|
||||
case NO_WAIT_CLASS:
|
||||
|
@ -137,7 +137,7 @@ protected:
|
||||
void clear_object_columns();
|
||||
|
||||
void make_row(bool thread_own_wait, PFS_thread *pfs_thread,
|
||||
PFS_events_waits *wait);
|
||||
volatile PFS_events_waits *wait);
|
||||
|
||||
/** Current row. */
|
||||
row_events_waits m_row;
|
||||
|
@ -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)
|
||||
store_start= buff;
|
||||
|
||||
if (arg_type == 'd')
|
||||
if (arg_type == 'd' || arg_type == 'i')
|
||||
store_end= longlong10_to_str(par, store_start, -10);
|
||||
else if (arg_type == 'u')
|
||||
store_end= longlong10_to_str(par, store_start, 10);
|
||||
@ -399,6 +399,7 @@ start:
|
||||
args_arr[i].double_arg= va_arg(ap, double);
|
||||
break;
|
||||
case 'd':
|
||||
case 'i':
|
||||
case 'u':
|
||||
case 'x':
|
||||
case 'X':
|
||||
@ -406,7 +407,7 @@ start:
|
||||
case 'p':
|
||||
if (args_arr[i].have_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);
|
||||
else
|
||||
args_arr[i].longlong_arg= va_arg(ap, uint);
|
||||
@ -458,6 +459,7 @@ start:
|
||||
break;
|
||||
}
|
||||
case 'd':
|
||||
case 'i':
|
||||
case 'u':
|
||||
case 'x':
|
||||
case 'X':
|
||||
@ -472,7 +474,7 @@ start:
|
||||
|
||||
if (args_arr[print_arr[i].arg_idx].have_longlong)
|
||||
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;
|
||||
else
|
||||
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,
|
||||
to= process_dbl_arg(to, end, width, d, *fmt);
|
||||
continue;
|
||||
}
|
||||
else if (*fmt == 'd' || *fmt == 'u' || *fmt == 'x' || *fmt == 'X' ||
|
||||
*fmt == 'p' || *fmt == 'o')
|
||||
else if (*fmt == 'd' || *fmt == 'i' || *fmt == 'u' || *fmt == 'x' ||
|
||||
*fmt == 'X' || *fmt == 'p' || *fmt == 'o')
|
||||
{
|
||||
/* Integer parameter */
|
||||
longlong larg;
|
||||
@ -625,7 +627,7 @@ size_t my_vsnprintf_ex(CHARSET_INFO *cs, char *to, size_t n,
|
||||
|
||||
if (have_longlong)
|
||||
larg = va_arg(ap,longlong);
|
||||
else if (*fmt == 'd')
|
||||
else if (*fmt == 'd' || *fmt == 'i')
|
||||
larg = va_arg(ap, int);
|
||||
else
|
||||
larg= va_arg(ap, uint);
|
||||
|
@ -31,7 +31,7 @@ void test1(const char *res, const char *fmt, ...)
|
||||
|
||||
int main(void)
|
||||
{
|
||||
plan(54);
|
||||
plan(58);
|
||||
|
||||
test1("Constant string",
|
||||
"Constant string");
|
||||
@ -44,6 +44,8 @@ int main(void)
|
||||
"Format specifier c %c", '!');
|
||||
test1("Format specifier d 1",
|
||||
"Format specifier d %d", 1);
|
||||
test1("Format specifier i 1",
|
||||
"Format specifier i %i", 1);
|
||||
test1("Format specifier u 2",
|
||||
"Format specifier u %u", 2);
|
||||
test1("Format specifier o 375",
|
||||
@ -77,6 +79,9 @@ int main(void)
|
||||
test1("Length modifiers work: 1 * -1 * 2 * 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",
|
||||
"long long X: %llx", 0x123456789abcdef0LL);
|
||||
|
||||
@ -121,6 +126,10 @@ int main(void)
|
||||
"Hello int, %d", 1);
|
||||
test1("Hello int, -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'",
|
||||
"Hello string '%s'", "I am a string");
|
||||
test1("Hello hack hack hack hack hack hack hack 1",
|
||||
|
Loading…
x
Reference in New Issue
Block a user