mirror of
https://github.com/MariaDB/server.git
synced 2025-08-11 09:43:05 +03:00
Merge branch '10.0' into 10.1
This commit is contained in:
@@ -31,6 +31,7 @@ Usage: $0 [-h|-n] [configure-options]
|
|||||||
-h, --help Show this help message.
|
-h, --help Show this help message.
|
||||||
-n, --just-print Don't actually run any commands; just print them.
|
-n, --just-print Don't actually run any commands; just print them.
|
||||||
-c, --just-configure Stop after running configure.
|
-c, --just-configure Stop after running configure.
|
||||||
|
Combined with --just-print shows configure options.
|
||||||
--extra-configs=xxx Add this to configure options
|
--extra-configs=xxx Add this to configure options
|
||||||
--extra-flags=xxx Add this C and CXX flags
|
--extra-flags=xxx Add this C and CXX flags
|
||||||
--extra-cflags=xxx Add this to C flags
|
--extra-cflags=xxx Add this to C flags
|
||||||
|
@@ -4977,12 +4977,13 @@ static int my_kill(int pid, int sig)
|
|||||||
{
|
{
|
||||||
#ifdef __WIN__
|
#ifdef __WIN__
|
||||||
HANDLE proc;
|
HANDLE proc;
|
||||||
if ((proc= OpenProcess(PROCESS_TERMINATE, FALSE, pid)) == NULL)
|
if ((proc= OpenProcess(SYNCHRONIZE|PROCESS_TERMINATE, FALSE, pid)) == NULL)
|
||||||
return -1;
|
return -1;
|
||||||
if (sig == 0)
|
if (sig == 0)
|
||||||
{
|
{
|
||||||
|
DWORD wait_result= WaitForSingleObject(proc, 0);
|
||||||
CloseHandle(proc);
|
CloseHandle(proc);
|
||||||
return 0;
|
return wait_result == WAIT_OBJECT_0?-1:0;
|
||||||
}
|
}
|
||||||
(void)TerminateProcess(proc, 201);
|
(void)TerminateProcess(proc, 201);
|
||||||
CloseHandle(proc);
|
CloseHandle(proc);
|
||||||
|
@@ -87,6 +87,11 @@ MACRO(CREATE_EXPORT_FILE VAR TARGET API_FUNCTIONS)
|
|||||||
ENDFOREACH()
|
ENDFOREACH()
|
||||||
SET(CONTENT "${CONTENT} (void *)0\n}\;")
|
SET(CONTENT "${CONTENT} (void *)0\n}\;")
|
||||||
CONFIGURE_FILE_CONTENT(${CONTENT} ${EXPORTS})
|
CONFIGURE_FILE_CONTENT(${CONTENT} ${EXPORTS})
|
||||||
|
# Avoid "function redeclared as variable" error
|
||||||
|
# when using gcc/clang option -flto(link time optimization)
|
||||||
|
IF(" ${CMAKE_C_FLAGS} ${CMAKE_CXX_FLAGS} " MATCHES " -flto")
|
||||||
|
SET_SOURCE_FILES_PROPERTIES(${EXPORTS} PROPERTIES COMPILE_FLAGS "-fno-lto")
|
||||||
|
ENDIF()
|
||||||
SET(${VAR} ${EXPORTS})
|
SET(${VAR} ${EXPORTS})
|
||||||
ENDIF()
|
ENDIF()
|
||||||
ENDMACRO()
|
ENDMACRO()
|
||||||
|
@@ -208,7 +208,7 @@ void vio_end(void);
|
|||||||
|
|
||||||
/* shutdown(2) flags */
|
/* shutdown(2) flags */
|
||||||
#ifndef SHUT_RD
|
#ifndef SHUT_RD
|
||||||
#define SHUT_RD SD_BOTH
|
#define SHUT_RD SD_RECEIVE
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@@ -45,7 +45,13 @@ drop table t1;
|
|||||||
connection slave;
|
connection slave;
|
||||||
flush tables with read lock;
|
flush tables with read lock;
|
||||||
start slave;
|
start slave;
|
||||||
source include/wait_for_slave_to_start.inc;
|
|
||||||
|
# The IO thread will not be able to read the GTID because of flush tables
|
||||||
|
let $slave_param= Slave_IO_Running;
|
||||||
|
let $slave_param_value= Preparing;
|
||||||
|
source include/wait_for_slave_param.inc;
|
||||||
|
|
||||||
|
--source include/wait_for_slave_sql_to_start.inc
|
||||||
--error 1192
|
--error 1192
|
||||||
stop slave;
|
stop slave;
|
||||||
|
|
||||||
|
@@ -8,6 +8,7 @@ server_audit_file_rotate_now OFF
|
|||||||
server_audit_file_rotate_size 1000000
|
server_audit_file_rotate_size 1000000
|
||||||
server_audit_file_rotations 9
|
server_audit_file_rotations 9
|
||||||
server_audit_incl_users
|
server_audit_incl_users
|
||||||
|
server_audit_loc_info
|
||||||
server_audit_logging OFF
|
server_audit_logging OFF
|
||||||
server_audit_mode 0
|
server_audit_mode 0
|
||||||
server_audit_output_type file
|
server_audit_output_type file
|
||||||
@@ -71,6 +72,7 @@ server_audit_file_rotate_now OFF
|
|||||||
server_audit_file_rotate_size 1000000
|
server_audit_file_rotate_size 1000000
|
||||||
server_audit_file_rotations 9
|
server_audit_file_rotations 9
|
||||||
server_audit_incl_users odin, root, dva, tri
|
server_audit_incl_users odin, root, dva, tri
|
||||||
|
server_audit_loc_info
|
||||||
server_audit_logging ON
|
server_audit_logging ON
|
||||||
server_audit_mode 0
|
server_audit_mode 0
|
||||||
server_audit_output_type file
|
server_audit_output_type file
|
||||||
@@ -216,6 +218,7 @@ server_audit_file_rotate_now OFF
|
|||||||
server_audit_file_rotate_size 1000000
|
server_audit_file_rotate_size 1000000
|
||||||
server_audit_file_rotations 9
|
server_audit_file_rotations 9
|
||||||
server_audit_incl_users odin, root, dva, tri
|
server_audit_incl_users odin, root, dva, tri
|
||||||
|
server_audit_loc_info
|
||||||
server_audit_logging ON
|
server_audit_logging ON
|
||||||
server_audit_mode 1
|
server_audit_mode 1
|
||||||
server_audit_output_type file
|
server_audit_output_type file
|
||||||
@@ -289,7 +292,7 @@ TIME,HOSTNAME,root,localhost,ID,ID,READ,mysql,proc,
|
|||||||
TIME,HOSTNAME,root,localhost,ID,ID,WRITE,mysql,proc,
|
TIME,HOSTNAME,root,localhost,ID,ID,WRITE,mysql,proc,
|
||||||
TIME,HOSTNAME,root,localhost,ID,ID,WRITE,mysql,event,
|
TIME,HOSTNAME,root,localhost,ID,ID,WRITE,mysql,event,
|
||||||
TIME,HOSTNAME,root,localhost,ID,ID,QUERY,sa_db,'drop database sa_db',0
|
TIME,HOSTNAME,root,localhost,ID,ID,QUERY,sa_db,'drop database sa_db',0
|
||||||
TIME,HOSTNAME,root,localhost,ID,0,DISCONNECT,sa_db,,0
|
TIME,HOSTNAME,root,localhost,ID,0,DISCONNECT,,,0
|
||||||
TIME,HOSTNAME,root,localhost,ID,ID,QUERY,test,'create database sa_db',0
|
TIME,HOSTNAME,root,localhost,ID,ID,QUERY,test,'create database sa_db',0
|
||||||
TIME,HOSTNAME,root,localhost,ID,ID,QUERY,sa_db,'use sa_db',0
|
TIME,HOSTNAME,root,localhost,ID,ID,QUERY,sa_db,'use sa_db',0
|
||||||
TIME,HOSTNAME,root,localhost,ID,ID,WRITE,mysql,user,
|
TIME,HOSTNAME,root,localhost,ID,ID,WRITE,mysql,user,
|
||||||
|
@@ -8,6 +8,7 @@ server_audit_file_rotate_now OFF
|
|||||||
server_audit_file_rotate_size 1000000
|
server_audit_file_rotate_size 1000000
|
||||||
server_audit_file_rotations 9
|
server_audit_file_rotations 9
|
||||||
server_audit_incl_users
|
server_audit_incl_users
|
||||||
|
server_audit_loc_info
|
||||||
server_audit_logging OFF
|
server_audit_logging OFF
|
||||||
server_audit_mode 0
|
server_audit_mode 0
|
||||||
server_audit_output_type file
|
server_audit_output_type file
|
||||||
@@ -71,6 +72,7 @@ server_audit_file_rotate_now OFF
|
|||||||
server_audit_file_rotate_size 1000000
|
server_audit_file_rotate_size 1000000
|
||||||
server_audit_file_rotations 9
|
server_audit_file_rotations 9
|
||||||
server_audit_incl_users odin, root, dva, tri
|
server_audit_incl_users odin, root, dva, tri
|
||||||
|
server_audit_loc_info
|
||||||
server_audit_logging ON
|
server_audit_logging ON
|
||||||
server_audit_mode 0
|
server_audit_mode 0
|
||||||
server_audit_output_type file
|
server_audit_output_type file
|
||||||
@@ -216,6 +218,7 @@ server_audit_file_rotate_now OFF
|
|||||||
server_audit_file_rotate_size 1000000
|
server_audit_file_rotate_size 1000000
|
||||||
server_audit_file_rotations 9
|
server_audit_file_rotations 9
|
||||||
server_audit_incl_users odin, root, dva, tri
|
server_audit_incl_users odin, root, dva, tri
|
||||||
|
server_audit_loc_info
|
||||||
server_audit_logging ON
|
server_audit_logging ON
|
||||||
server_audit_mode 1
|
server_audit_mode 1
|
||||||
server_audit_output_type file
|
server_audit_output_type file
|
||||||
@@ -289,7 +292,7 @@ TIME,HOSTNAME,root,localhost,ID,ID,READ,mysql,proc,
|
|||||||
TIME,HOSTNAME,root,localhost,ID,ID,WRITE,mysql,proc,
|
TIME,HOSTNAME,root,localhost,ID,ID,WRITE,mysql,proc,
|
||||||
TIME,HOSTNAME,root,localhost,ID,ID,WRITE,mysql,event,
|
TIME,HOSTNAME,root,localhost,ID,ID,WRITE,mysql,event,
|
||||||
TIME,HOSTNAME,root,localhost,ID,ID,QUERY,sa_db,'drop database sa_db',0
|
TIME,HOSTNAME,root,localhost,ID,ID,QUERY,sa_db,'drop database sa_db',0
|
||||||
TIME,HOSTNAME,root,localhost,ID,0,DISCONNECT,sa_db,,0
|
TIME,HOSTNAME,root,localhost,ID,0,DISCONNECT,,,0
|
||||||
TIME,HOSTNAME,root,localhost,ID,ID,QUERY,test,'create database sa_db',0
|
TIME,HOSTNAME,root,localhost,ID,ID,QUERY,test,'create database sa_db',0
|
||||||
TIME,HOSTNAME,root,localhost,ID,ID,QUERY,sa_db,'use sa_db',0
|
TIME,HOSTNAME,root,localhost,ID,ID,QUERY,sa_db,'use sa_db',0
|
||||||
TIME,HOSTNAME,root,localhost,ID,ID,WRITE,mysql,user,
|
TIME,HOSTNAME,root,localhost,ID,ID,WRITE,mysql,user,
|
||||||
|
@@ -22,7 +22,8 @@ include/wait_for_slave_to_stop.inc
|
|||||||
drop table t1;
|
drop table t1;
|
||||||
flush tables with read lock;
|
flush tables with read lock;
|
||||||
start slave;
|
start slave;
|
||||||
include/wait_for_slave_to_start.inc
|
include/wait_for_slave_param.inc [Slave_IO_Running]
|
||||||
|
include/wait_for_slave_sql_to_start.inc
|
||||||
stop slave;
|
stop slave;
|
||||||
ERROR HY000: Can't execute the given command because you have active locked tables or an active transaction
|
ERROR HY000: Can't execute the given command because you have active locked tables or an active transaction
|
||||||
unlock tables;
|
unlock tables;
|
||||||
|
@@ -14,6 +14,10 @@ DROP TABLE t1;
|
|||||||
[connection slave]
|
[connection slave]
|
||||||
include/install_semisync.inc
|
include/install_semisync.inc
|
||||||
[connection slave]
|
[connection slave]
|
||||||
|
show global status like "Slave%_running";
|
||||||
|
Variable_name Value
|
||||||
|
Slave_running ON
|
||||||
|
Slaves_running 1
|
||||||
UNINSTALL PLUGIN rpl_semi_sync_slave;
|
UNINSTALL PLUGIN rpl_semi_sync_slave;
|
||||||
Warnings:
|
Warnings:
|
||||||
Warning 1620 Plugin is busy and will be uninstalled on shutdown
|
Warning 1620 Plugin is busy and will be uninstalled on shutdown
|
||||||
@@ -21,6 +25,10 @@ select plugin_name,plugin_status from information_schema.plugins where plugin_na
|
|||||||
plugin_name plugin_status
|
plugin_name plugin_status
|
||||||
rpl_semi_sync_slave DELETED
|
rpl_semi_sync_slave DELETED
|
||||||
[connection master]
|
[connection master]
|
||||||
|
show global status like "Slave%_connect%";
|
||||||
|
Variable_name Value
|
||||||
|
Slave_connections 2
|
||||||
|
Slaves_connected 1
|
||||||
UNINSTALL PLUGIN rpl_semi_sync_master;
|
UNINSTALL PLUGIN rpl_semi_sync_master;
|
||||||
Warnings:
|
Warnings:
|
||||||
Warning 1620 Plugin is busy and will be uninstalled on shutdown
|
Warning 1620 Plugin is busy and will be uninstalled on shutdown
|
||||||
|
@@ -22,7 +22,8 @@ include/wait_for_slave_to_stop.inc
|
|||||||
drop table t1;
|
drop table t1;
|
||||||
flush tables with read lock;
|
flush tables with read lock;
|
||||||
start slave;
|
start slave;
|
||||||
include/wait_for_slave_to_start.inc
|
include/wait_for_slave_param.inc [Slave_IO_Running]
|
||||||
|
include/wait_for_slave_sql_to_start.inc
|
||||||
stop slave;
|
stop slave;
|
||||||
ERROR HY000: Can't execute the given command because you have active locked tables or an active transaction
|
ERROR HY000: Can't execute the given command because you have active locked tables or an active transaction
|
||||||
unlock tables;
|
unlock tables;
|
||||||
|
@@ -57,6 +57,8 @@ DROP TABLE t1;
|
|||||||
# possible at this state
|
# possible at this state
|
||||||
--connection slave
|
--connection slave
|
||||||
--echo [connection slave]
|
--echo [connection slave]
|
||||||
|
show global status like "Slave%_running";
|
||||||
|
|
||||||
UNINSTALL PLUGIN rpl_semi_sync_slave;
|
UNINSTALL PLUGIN rpl_semi_sync_slave;
|
||||||
select plugin_name,plugin_status from information_schema.plugins where plugin_name like 'rpl_%';
|
select plugin_name,plugin_status from information_schema.plugins where plugin_name like 'rpl_%';
|
||||||
|
|
||||||
@@ -64,6 +66,10 @@ select plugin_name,plugin_status from information_schema.plugins where plugin_na
|
|||||||
# possible at this state
|
# possible at this state
|
||||||
--connection master
|
--connection master
|
||||||
--echo [connection master]
|
--echo [connection master]
|
||||||
|
|
||||||
|
# The following is to catch errors if the next uninstall plugin would succeed
|
||||||
|
show global status like "Slave%_connect%";
|
||||||
|
|
||||||
UNINSTALL PLUGIN rpl_semi_sync_master;
|
UNINSTALL PLUGIN rpl_semi_sync_master;
|
||||||
select plugin_name,plugin_status from information_schema.plugins where plugin_name like 'rpl_%';
|
select plugin_name,plugin_status from information_schema.plugins where plugin_name like 'rpl_%';
|
||||||
|
|
||||||
|
@@ -14,11 +14,13 @@
|
|||||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef FLOGGER_SKIP_INCLUDES
|
||||||
#include "my_global.h"
|
#include "my_global.h"
|
||||||
#include <my_sys.h>
|
#include <my_sys.h>
|
||||||
#include <m_string.h>
|
#include <m_string.h>
|
||||||
#include <mysql/service_logger.h>
|
#include <mysql/service_logger.h>
|
||||||
#include <my_pthread.h>
|
#include <my_pthread.h>
|
||||||
|
#endif /*FLOGGER_SKIP_INCLUDES*/
|
||||||
|
|
||||||
#ifndef flogger_mutex_init
|
#ifndef flogger_mutex_init
|
||||||
#define flogger_mutex_init(A,B,C) mysql_mutex_init(A,B,C)
|
#define flogger_mutex_init(A,B,C) mysql_mutex_init(A,B,C)
|
||||||
|
@@ -13,4 +13,7 @@
|
|||||||
# along with this program; if not, write to the Free Software
|
# along with this program; if not, write to the Free Software
|
||||||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
MYSQL_ADD_PLUGIN(server_audit server_audit.c MODULE_ONLY)
|
SET(SERVER_AUDIT_SOURCES
|
||||||
|
server_audit.c test_audit_v4.c plugin_audit_v4.h)
|
||||||
|
|
||||||
|
MYSQL_ADD_PLUGIN(server_audit ${SERVER_AUDIT_SOURCES} MODULE_ONLY)
|
||||||
|
561
plugin/server_audit/plugin_audit_v4.h
Normal file
561
plugin/server_audit/plugin_audit_v4.h
Normal file
@@ -0,0 +1,561 @@
|
|||||||
|
/* Copyright (c) 2007, 2015, 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
|
||||||
|
|
||||||
|
#ifndef _my_audit_h
|
||||||
|
#define _my_audit_h
|
||||||
|
|
||||||
|
#ifndef PLUGIN_CONTEXT
|
||||||
|
#include "plugin.h"
|
||||||
|
#include "mysql/mysql_lex_string.h"
|
||||||
|
#ifndef MYSQL_ABI_CHECK
|
||||||
|
#include "m_string.h"
|
||||||
|
#endif
|
||||||
|
#include "my_command.h"
|
||||||
|
#include "my_sqlcommand.h"
|
||||||
|
#endif /*PLUGIN_CONTEXT*/
|
||||||
|
|
||||||
|
#define MYSQL_AUDIT_INTERFACE_VERSION 0x0401
|
||||||
|
|
||||||
|
/**
|
||||||
|
@enum mysql_event_class_t
|
||||||
|
|
||||||
|
Audit event classes.
|
||||||
|
*/
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
MYSQL_AUDIT_GENERAL_CLASS = 0,
|
||||||
|
MYSQL_AUDIT_CONNECTION_CLASS = 1,
|
||||||
|
MYSQL_AUDIT_PARSE_CLASS = 2,
|
||||||
|
MYSQL_AUDIT_AUTHORIZATION_CLASS = 3,
|
||||||
|
MYSQL_AUDIT_TABLE_ACCESS_CLASS = 4,
|
||||||
|
MYSQL_AUDIT_GLOBAL_VARIABLE_CLASS = 5,
|
||||||
|
MYSQL_AUDIT_SERVER_STARTUP_CLASS = 6,
|
||||||
|
MYSQL_AUDIT_SERVER_SHUTDOWN_CLASS = 7,
|
||||||
|
MYSQL_AUDIT_COMMAND_CLASS = 8,
|
||||||
|
MYSQL_AUDIT_QUERY_CLASS = 9,
|
||||||
|
MYSQL_AUDIT_STORED_PROGRAM_CLASS = 10,
|
||||||
|
/* This item must be last in the list. */
|
||||||
|
MYSQL_AUDIT_CLASS_MASK_SIZE
|
||||||
|
} mysql_event_class_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
@struct st_mysql_audit
|
||||||
|
|
||||||
|
The descriptor structure that is referred from st_mysql_plugin.
|
||||||
|
*/
|
||||||
|
struct st_mysql_audit
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
Interface version.
|
||||||
|
*/
|
||||||
|
int interface_version;
|
||||||
|
|
||||||
|
/**
|
||||||
|
Event occurs when the event class consumer is to be
|
||||||
|
disassociated from the specified THD.This would typically occur
|
||||||
|
before some operation which may require sleeping - such as when
|
||||||
|
waiting for the next query from the client.
|
||||||
|
*/
|
||||||
|
void (*release_thd)(MYSQL_THD);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Invoked whenever an event occurs which is of any
|
||||||
|
class for which the plugin has interest.The second argument
|
||||||
|
indicates the specific event class and the third argument is data
|
||||||
|
as required for that class.
|
||||||
|
*/
|
||||||
|
int (*event_notify)(MYSQL_THD, mysql_event_class_t, const void *);
|
||||||
|
|
||||||
|
/**
|
||||||
|
An array of bits used to indicate what event classes
|
||||||
|
that this plugin wants to receive.
|
||||||
|
*/
|
||||||
|
unsigned long class_mask[MYSQL_AUDIT_CLASS_MASK_SIZE];
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
@typedef enum_sql_command_t
|
||||||
|
|
||||||
|
SQL command type definition.
|
||||||
|
*/
|
||||||
|
typedef enum enum_sql_command enum_sql_command_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
@enum mysql_event_general_subclass_t
|
||||||
|
|
||||||
|
Events for the MYSQL_AUDIT_GENERAL_CLASS event class.
|
||||||
|
*/
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
/** occurs before emitting to the general query log. */
|
||||||
|
MYSQL_AUDIT_GENERAL_LOG = 1 << 0,
|
||||||
|
/** occurs before transmitting errors to the user. */
|
||||||
|
MYSQL_AUDIT_GENERAL_ERROR = 1 << 1,
|
||||||
|
/** occurs after transmitting a resultset to the user. */
|
||||||
|
MYSQL_AUDIT_GENERAL_RESULT = 1 << 2,
|
||||||
|
/** occurs after transmitting a resultset or errors */
|
||||||
|
MYSQL_AUDIT_GENERAL_STATUS = 1 << 3
|
||||||
|
} mysql_event_general_subclass_t;
|
||||||
|
|
||||||
|
#define MYSQL_AUDIT_GENERAL_ALL (MYSQL_AUDIT_GENERAL_LOG | \
|
||||||
|
MYSQL_AUDIT_GENERAL_ERROR | \
|
||||||
|
MYSQL_AUDIT_GENERAL_RESULT | \
|
||||||
|
MYSQL_AUDIT_GENERAL_STATUS)
|
||||||
|
/**
|
||||||
|
@struct mysql_event_general
|
||||||
|
|
||||||
|
Structure for the MYSQL_AUDIT_GENERAL_CLASS event class.
|
||||||
|
*/
|
||||||
|
struct mysql_event_general
|
||||||
|
{
|
||||||
|
mysql_event_general_subclass_t event_subclass;
|
||||||
|
int general_error_code;
|
||||||
|
unsigned long general_thread_id;
|
||||||
|
MYSQL_LEX_CSTRING general_user;
|
||||||
|
MYSQL_LEX_CSTRING general_command;
|
||||||
|
MYSQL_LEX_CSTRING general_query;
|
||||||
|
struct charset_info_st *general_charset;
|
||||||
|
unsigned long long general_time;
|
||||||
|
unsigned long long general_rows;
|
||||||
|
MYSQL_LEX_CSTRING general_host;
|
||||||
|
MYSQL_LEX_CSTRING general_sql_command;
|
||||||
|
MYSQL_LEX_CSTRING general_external_user;
|
||||||
|
MYSQL_LEX_CSTRING general_ip;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
@enum mysql_event_connection_subclass_t
|
||||||
|
|
||||||
|
Events for MYSQL_AUDIT_CONNECTION_CLASS event class.
|
||||||
|
*/
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
/** occurs after authentication phase is completed. */
|
||||||
|
MYSQL_AUDIT_CONNECTION_CONNECT = 1 << 0,
|
||||||
|
/** occurs after connection is terminated. */
|
||||||
|
MYSQL_AUDIT_CONNECTION_DISCONNECT = 1 << 1,
|
||||||
|
/** occurs after COM_CHANGE_USER RPC is completed. */
|
||||||
|
MYSQL_AUDIT_CONNECTION_CHANGE_USER = 1 << 2,
|
||||||
|
/** occurs before authentication. */
|
||||||
|
MYSQL_AUDIT_CONNECTION_PRE_AUTHENTICATE = 1 << 3
|
||||||
|
} mysql_event_connection_subclass_t;
|
||||||
|
|
||||||
|
#define MYSQL_AUDIT_CONNECTION_ALL (MYSQL_AUDIT_CONNECTION_CONNECT | \
|
||||||
|
MYSQL_AUDIT_CONNECTION_DISCONNECT | \
|
||||||
|
MYSQL_AUDIT_CONNECTION_CHANGE_USER | \
|
||||||
|
MYSQL_AUDIT_CONNECTION_PRE_AUTHENTICATE)
|
||||||
|
/**
|
||||||
|
@struct mysql_event_connection
|
||||||
|
|
||||||
|
Structure for the MYSQL_AUDIT_CONNECTION_CLASS event class.
|
||||||
|
*/
|
||||||
|
struct mysql_event_connection
|
||||||
|
{
|
||||||
|
/** Event subclass. */
|
||||||
|
mysql_event_connection_subclass_t event_subclass;
|
||||||
|
/** Current status of the connection. */
|
||||||
|
int status;
|
||||||
|
/** Connection id. */
|
||||||
|
unsigned long connection_id;
|
||||||
|
/** User name of this connection. */
|
||||||
|
MYSQL_LEX_CSTRING user;
|
||||||
|
/** Priv user name. */
|
||||||
|
MYSQL_LEX_CSTRING priv_user;
|
||||||
|
/** External user name. */
|
||||||
|
MYSQL_LEX_CSTRING external_user;
|
||||||
|
/** Proxy user used for this connection. */
|
||||||
|
MYSQL_LEX_CSTRING proxy_user;
|
||||||
|
/** Connection host. */
|
||||||
|
MYSQL_LEX_CSTRING host;
|
||||||
|
/** IP of the connection. */
|
||||||
|
MYSQL_LEX_CSTRING ip;
|
||||||
|
/** Database name specified at connection time. */
|
||||||
|
MYSQL_LEX_CSTRING database;
|
||||||
|
/** Connection type:
|
||||||
|
- 0 Undefined
|
||||||
|
- 1 TCP/IP
|
||||||
|
- 2 Socket
|
||||||
|
- 3 Named pipe
|
||||||
|
- 4 SSL
|
||||||
|
- 5 Shared memory
|
||||||
|
*/
|
||||||
|
int connection_type;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
@enum mysql_event_parse_subclass_t
|
||||||
|
|
||||||
|
Events for MYSQL_AUDIT_PARSE_CLASS event class.
|
||||||
|
*/
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
/** occurs before the query parsing. */
|
||||||
|
MYSQL_AUDIT_PARSE_PREPARSE = 1 << 0,
|
||||||
|
/** occurs after the query parsing. */
|
||||||
|
MYSQL_AUDIT_PARSE_POSTPARSE = 1 << 1
|
||||||
|
} mysql_event_parse_subclass_t;
|
||||||
|
|
||||||
|
#define MYSQL_AUDIT_PARSE_ALL (MYSQL_AUDIT_PARSE_PREPARSE | \
|
||||||
|
MYSQL_AUDIT_PARSE_POSTPARSE)
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
MYSQL_AUDIT_PARSE_REWRITE_PLUGIN_NONE = 0,
|
||||||
|
/// mysql_event_parse::flags Must be set by a plugin if the query is rewritten.
|
||||||
|
MYSQL_AUDIT_PARSE_REWRITE_PLUGIN_QUERY_REWRITTEN = 1 << 0,
|
||||||
|
/// mysql_event_parse::flags Is set by the server if the query is prepared statement.
|
||||||
|
MYSQL_AUDIT_PARSE_REWRITE_PLUGIN_IS_PREPARED_STATEMENT = 1 << 1
|
||||||
|
} mysql_event_parse_rewrite_plugin_flag;
|
||||||
|
|
||||||
|
/** Data for the MYSQL_AUDIT_PARSE events */
|
||||||
|
struct mysql_event_parse
|
||||||
|
{
|
||||||
|
/** MYSQL_AUDIT_[PRE|POST]_PARSE event id */
|
||||||
|
mysql_event_parse_subclass_t event_subclass;
|
||||||
|
|
||||||
|
/** one of FLAG_REWRITE_PLUGIN_* */
|
||||||
|
mysql_event_parse_rewrite_plugin_flag *flags;
|
||||||
|
|
||||||
|
/** input: the original query text */
|
||||||
|
MYSQL_LEX_CSTRING query;
|
||||||
|
|
||||||
|
/** output: returns the null-terminated rewriten query allocated by my_malloc() */
|
||||||
|
MYSQL_LEX_CSTRING *rewritten_query;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
@enum mysql_event_authorization_subclass_t
|
||||||
|
|
||||||
|
Events for MYSQL_AUDIT_AUTHORIZATION_CLASS event class.
|
||||||
|
*/
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
MYSQL_AUDIT_AUTHORIZATION_USER = 1 << 0,
|
||||||
|
/** Occurs when database privilege is checked. */
|
||||||
|
MYSQL_AUDIT_AUTHORIZATION_DB = 1 << 1,
|
||||||
|
/** Occurs when table privilege is checked. */
|
||||||
|
MYSQL_AUDIT_AUTHORIZATION_TABLE = 1 << 2,
|
||||||
|
/** Occurs when column privilege is checked. */
|
||||||
|
MYSQL_AUDIT_AUTHORIZATION_COLUMN = 1 << 3,
|
||||||
|
/** Occurs when procedure privilege is checked. */
|
||||||
|
MYSQL_AUDIT_AUTHORIZATION_PROCEDURE = 1 << 4,
|
||||||
|
/** Occurs when proxy privilege is checked. */
|
||||||
|
MYSQL_AUDIT_AUTHORIZATION_PROXY = 1 << 5
|
||||||
|
} mysql_event_authorization_subclass_t;
|
||||||
|
|
||||||
|
#define MYSQL_AUDIT_AUTHORIZATION_ALL (MYSQL_AUDIT_AUTHORIZATION_USER | \
|
||||||
|
MYSQL_AUDIT_AUTHORIZATION_DB | \
|
||||||
|
MYSQL_AUDIT_AUTHORIZATION_TABLE | \
|
||||||
|
MYSQL_AUDIT_AUTHORIZATION_COLUMN | \
|
||||||
|
MYSQL_AUDIT_AUTHORIZATION_PROCEDURE | \
|
||||||
|
MYSQL_AUDIT_AUTHORIZATION_PROXY)
|
||||||
|
/**
|
||||||
|
@struct mysql_event_authorization
|
||||||
|
|
||||||
|
Structure for MYSQL_AUDIT_AUTHORIZATION_CLASS event class.
|
||||||
|
*/
|
||||||
|
struct mysql_event_authorization
|
||||||
|
{
|
||||||
|
/** Event subclass. */
|
||||||
|
mysql_event_authorization_subclass_t event_subclass;
|
||||||
|
/** Event status. */
|
||||||
|
int status;
|
||||||
|
/** Connection id. */
|
||||||
|
unsigned int connection_id;
|
||||||
|
/** SQL command id. */
|
||||||
|
enum_sql_command_t sql_command_id;
|
||||||
|
/** SQL query text. */
|
||||||
|
MYSQL_LEX_CSTRING query;
|
||||||
|
/** SQL query charset. */
|
||||||
|
const struct charset_info_st *query_charset;
|
||||||
|
/** Database name. */
|
||||||
|
MYSQL_LEX_CSTRING database;
|
||||||
|
/** Table name. */
|
||||||
|
MYSQL_LEX_CSTRING table;
|
||||||
|
/** Other name associated with the event. */
|
||||||
|
MYSQL_LEX_CSTRING object;
|
||||||
|
/** Requested authorization privileges. */
|
||||||
|
unsigned long requested_privilege;
|
||||||
|
/** Currently granted authorization privileges. */
|
||||||
|
unsigned long granted_privilege;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
@enum mysql_event_table_row_access_subclass_t
|
||||||
|
|
||||||
|
Events for MYSQL_AUDIT_TABLE_ACCES_CLASS event class.
|
||||||
|
*/
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
/** Occurs when table data are read. */
|
||||||
|
MYSQL_AUDIT_TABLE_ACCESS_READ = 1 << 0,
|
||||||
|
/** Occurs when table data are inserted. */
|
||||||
|
MYSQL_AUDIT_TABLE_ACCESS_INSERT = 1 << 1,
|
||||||
|
/** Occurs when table data are updated. */
|
||||||
|
MYSQL_AUDIT_TABLE_ACCESS_UPDATE = 1 << 2,
|
||||||
|
/** Occurs when table data are deleted. */
|
||||||
|
MYSQL_AUDIT_TABLE_ACCESS_DELETE = 1 << 3
|
||||||
|
} mysql_event_table_access_subclass_t;
|
||||||
|
|
||||||
|
#define MYSQL_AUDIT_TABLE_ACCESS_ALL (MYSQL_AUDIT_TABLE_ACCESS_READ | \
|
||||||
|
MYSQL_AUDIT_TABLE_ACCESS_INSERT | \
|
||||||
|
MYSQL_AUDIT_TABLE_ACCESS_UPDATE | \
|
||||||
|
MYSQL_AUDIT_TABLE_ACCESS_DELETE)
|
||||||
|
|
||||||
|
/**
|
||||||
|
@struct mysql_event_table_row_access
|
||||||
|
|
||||||
|
Structure for MYSQL_AUDIT_TABLE_ACCES_CLASS event class.
|
||||||
|
*/
|
||||||
|
struct mysql_event_table_access
|
||||||
|
{
|
||||||
|
/** Event subclass. */
|
||||||
|
mysql_event_table_access_subclass_t event_subclass;
|
||||||
|
/** Connection id. */
|
||||||
|
unsigned long connection_id;
|
||||||
|
/** SQL command id. */
|
||||||
|
enum_sql_command_t sql_command_id;
|
||||||
|
/** SQL query. */
|
||||||
|
MYSQL_LEX_CSTRING query;
|
||||||
|
/** SQL query charset. */
|
||||||
|
const struct charset_info_st *query_charset;
|
||||||
|
/** Database name. */
|
||||||
|
MYSQL_LEX_CSTRING table_database;
|
||||||
|
/** Table name. */
|
||||||
|
MYSQL_LEX_CSTRING table_name;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
@enum mysql_event_global_variable_subclass_t
|
||||||
|
|
||||||
|
Events for MYSQL_AUDIT_GLOBAL_VARIABLE_CLASS event class.
|
||||||
|
*/
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
/** Occurs when global variable is retrieved. */
|
||||||
|
MYSQL_AUDIT_GLOBAL_VARIABLE_GET = 1 << 0,
|
||||||
|
/** Occurs when global variable is set. */
|
||||||
|
MYSQL_AUDIT_GLOBAL_VARIABLE_SET = 1 << 1
|
||||||
|
} mysql_event_global_variable_subclass_t;
|
||||||
|
|
||||||
|
#define MYSQL_AUDIT_GLOBAL_VARIABLE_ALL (MYSQL_AUDIT_GLOBAL_VARIABLE_GET | \
|
||||||
|
MYSQL_AUDIT_GLOBAL_VARIABLE_SET)
|
||||||
|
|
||||||
|
/** Events for MYSQL_AUDIT_GLOBAL_VARIABLE_CLASS event class. */
|
||||||
|
struct mysql_event_global_variable
|
||||||
|
{
|
||||||
|
/** Event subclass. */
|
||||||
|
mysql_event_global_variable_subclass_t event_subclass;
|
||||||
|
/** Connection id. */
|
||||||
|
unsigned long connection_id;
|
||||||
|
/** SQL command id. */
|
||||||
|
enum_sql_command_t sql_command_id;
|
||||||
|
/** Variable name. */
|
||||||
|
MYSQL_LEX_CSTRING variable_name;
|
||||||
|
/** Variable value. */
|
||||||
|
MYSQL_LEX_CSTRING variable_value;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
@enum mysql_event_server_startup_subclass_t
|
||||||
|
|
||||||
|
Events for MYSQL_AUDIT_SERVER_STARTUP_CLASS event class.
|
||||||
|
*/
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
/** Occurs after all subsystem are initialized during system start. */
|
||||||
|
MYSQL_AUDIT_SERVER_STARTUP_STARTUP = 1 << 0
|
||||||
|
} mysql_event_server_startup_subclass_t;
|
||||||
|
|
||||||
|
#define MYSQL_AUDIT_SERVER_STARTUP_ALL (MYSQL_AUDIT_SERVER_STARTUP_STARTUP)
|
||||||
|
|
||||||
|
/**
|
||||||
|
@struct mysql_event_server_startup
|
||||||
|
|
||||||
|
Structure for MYSQL_AUDIT_SERVER_STARTUP_CLASS event class.
|
||||||
|
*/
|
||||||
|
struct mysql_event_server_startup
|
||||||
|
{
|
||||||
|
/** Event subclass. */
|
||||||
|
mysql_event_server_startup_subclass_t event_subclass;
|
||||||
|
/** Command line arguments. */
|
||||||
|
const char **argv;
|
||||||
|
/** Command line arguments count. */
|
||||||
|
unsigned int argc;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
@enum mysql_event_server_shutdown_subclass_t
|
||||||
|
|
||||||
|
Events for MYSQL_AUDIT_SERVER_SHUTDOWN_CLASS event class.
|
||||||
|
*/
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
/** Occurs when global variable is set. */
|
||||||
|
MYSQL_AUDIT_SERVER_SHUTDOWN_SHUTDOWN = 1 << 0
|
||||||
|
} mysql_event_server_shutdown_subclass_t;
|
||||||
|
|
||||||
|
#define MYSQL_AUDIT_SERVER_SHUTDOWN_ALL (MYSQL_AUDIT_SERVER_SHUTDOWN_SHUTDOWN)
|
||||||
|
|
||||||
|
/**
|
||||||
|
@enum mysql_server_shutdown_reason_t
|
||||||
|
|
||||||
|
Server shutdown reason.
|
||||||
|
*/
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
/** User requested shut down. */
|
||||||
|
MYSQL_AUDIT_SERVER_SHUTDOWN_REASON_SHUTDOWN,
|
||||||
|
/** The server aborts. */
|
||||||
|
MYSQL_AUDIT_SERVER_SHUTDOWN_REASON_ABORT
|
||||||
|
} mysql_server_shutdown_reason_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
@struct mysql_event_server_shutdown
|
||||||
|
|
||||||
|
Structure for MYSQL_AUDIT_SERVER_SHUTDOWN_CLASS event class.
|
||||||
|
*/
|
||||||
|
struct mysql_event_server_shutdown
|
||||||
|
{
|
||||||
|
/** Shutdown event. */
|
||||||
|
mysql_event_server_shutdown_subclass_t event_subclass;
|
||||||
|
/** Exit code associated with the shutdown event. */
|
||||||
|
int exit_code;
|
||||||
|
/** Shutdown reason. */
|
||||||
|
mysql_server_shutdown_reason_t reason;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
@enum mysql_event_command_subclass_t
|
||||||
|
|
||||||
|
Events for MYSQL_AUDIT_COMMAND_CLASS event class.
|
||||||
|
*/
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
/** Command start event. */
|
||||||
|
MYSQL_AUDIT_COMMAND_START = 1 << 0,
|
||||||
|
/** Command end event. */
|
||||||
|
MYSQL_AUDIT_COMMAND_END = 1 << 1
|
||||||
|
} mysql_event_command_subclass_t;
|
||||||
|
|
||||||
|
#define MYSQL_AUDIT_COMMAND_ALL (MYSQL_AUDIT_COMMAND_START | \
|
||||||
|
MYSQL_AUDIT_COMMAND_END)
|
||||||
|
/**
|
||||||
|
@typedef enum_server_command_t
|
||||||
|
|
||||||
|
Server command type definition.
|
||||||
|
*/
|
||||||
|
typedef enum enum_server_command enum_server_command_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
@struct mysql_event_command
|
||||||
|
|
||||||
|
Event for MYSQL_AUDIT_COMMAND_CLASS event class.
|
||||||
|
Events generated as a result of RPC command requests.
|
||||||
|
*/
|
||||||
|
struct mysql_event_command
|
||||||
|
{
|
||||||
|
/** Command event subclass. */
|
||||||
|
mysql_event_command_subclass_t event_subclass;
|
||||||
|
/** Command event status. */
|
||||||
|
int status;
|
||||||
|
/** Connection id. */
|
||||||
|
unsigned long connection_id;
|
||||||
|
/** Command id. */
|
||||||
|
enum_server_command_t command_id;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
@enum mysql_event_query_subclass_t
|
||||||
|
|
||||||
|
Events for MYSQL_AUDIT_QUERY_CLASS event class.
|
||||||
|
*/
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
/** Query start event. */
|
||||||
|
MYSQL_AUDIT_QUERY_START = 1 << 0,
|
||||||
|
/** Nested query start event. */
|
||||||
|
MYSQL_AUDIT_QUERY_NESTED_START = 1 << 1,
|
||||||
|
/** Query post parse event. */
|
||||||
|
MYSQL_AUDIT_QUERY_STATUS_END = 1 << 2,
|
||||||
|
/** Nested query status end event. */
|
||||||
|
MYSQL_AUDIT_QUERY_NESTED_STATUS_END = 1 << 3
|
||||||
|
} mysql_event_query_subclass_t;
|
||||||
|
|
||||||
|
#define MYSQL_AUDIT_QUERY_ALL (MYSQL_AUDIT_QUERY_START | \
|
||||||
|
MYSQL_AUDIT_QUERY_NESTED_START | \
|
||||||
|
MYSQL_AUDIT_QUERY_STATUS_END | \
|
||||||
|
MYSQL_AUDIT_QUERY_NESTED_STATUS_END)
|
||||||
|
/**
|
||||||
|
@struct mysql_event_command
|
||||||
|
|
||||||
|
Event for MYSQL_AUDIT_COMMAND_CLASS event class.
|
||||||
|
*/
|
||||||
|
struct mysql_event_query
|
||||||
|
{
|
||||||
|
/** Event subclass. */
|
||||||
|
mysql_event_query_subclass_t event_subclass;
|
||||||
|
/** Event status. */
|
||||||
|
int status;
|
||||||
|
/** Connection id. */
|
||||||
|
unsigned long connection_id;
|
||||||
|
/** SQL command id. */
|
||||||
|
enum_sql_command_t sql_command_id;
|
||||||
|
/** SQL query. */
|
||||||
|
MYSQL_LEX_CSTRING query;
|
||||||
|
/** SQL query charset. */
|
||||||
|
const struct charset_info_st *query_charset;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
@enum mysql_event_stored_program_subclass_t
|
||||||
|
|
||||||
|
Events for MYSQL_AUDIT_STORED_PROGRAM_CLASS event class.
|
||||||
|
*/
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
/** Stored program execution event. */
|
||||||
|
MYSQL_AUDIT_STORED_PROGRAM_EXECUTE = 1 << 0
|
||||||
|
} mysql_event_stored_program_subclass_t;
|
||||||
|
|
||||||
|
#define MYSQL_AUDIT_STORED_PROGRAM_ALL (MYSQL_AUDIT_STORED_PROGRAM_EXECUTE)
|
||||||
|
|
||||||
|
/**
|
||||||
|
@struct mysql_event_command
|
||||||
|
|
||||||
|
Event for MYSQL_AUDIT_COMMAND_CLASS event class.
|
||||||
|
*/
|
||||||
|
struct mysql_event_stored_program
|
||||||
|
{
|
||||||
|
/** Event subclass. */
|
||||||
|
mysql_event_stored_program_subclass_t event_subclass;
|
||||||
|
/** Connection id. */
|
||||||
|
unsigned long connection_id;
|
||||||
|
/** SQL command id. */
|
||||||
|
enum_sql_command_t sql_command_id;
|
||||||
|
/** SQL query text. */
|
||||||
|
MYSQL_LEX_CSTRING query;
|
||||||
|
/** SQL query charset. */
|
||||||
|
const struct charset_info_st *query_charset;
|
||||||
|
/** The Database the procedure is defined in. */
|
||||||
|
MYSQL_LEX_CSTRING database;
|
||||||
|
/** Name of the stored program. */
|
||||||
|
MYSQL_LEX_CSTRING name;
|
||||||
|
/** Stored program parameters. */
|
||||||
|
void *parameters;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
File diff suppressed because it is too large
Load Diff
162
plugin/server_audit/test_audit_v4.c
Normal file
162
plugin/server_audit/test_audit_v4.c
Normal file
@@ -0,0 +1,162 @@
|
|||||||
|
#define PLUGIN_CONTEXT
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
typedef void *MYSQL_THD;
|
||||||
|
struct st_mysql_const_lex_string
|
||||||
|
{
|
||||||
|
const char *str;
|
||||||
|
size_t length;
|
||||||
|
};
|
||||||
|
typedef struct st_mysql_const_lex_string MYSQL_LEX_CSTRING;
|
||||||
|
enum enum_sql_command{ SQLCOM_A, SQLCOM_B };
|
||||||
|
enum enum_server_command{ SERVCOM_A, SERVCOM_B };
|
||||||
|
|
||||||
|
#include "plugin_audit_v4.h"
|
||||||
|
|
||||||
|
extern void auditing(MYSQL_THD thd, unsigned int event_class, const void *ev);
|
||||||
|
extern int get_db_mysql57(MYSQL_THD thd, char **name, int *len);
|
||||||
|
|
||||||
|
|
||||||
|
struct mysql_event_general_302
|
||||||
|
{
|
||||||
|
unsigned int event_subclass;
|
||||||
|
int general_error_code;
|
||||||
|
unsigned long general_thread_id;
|
||||||
|
const char *general_user;
|
||||||
|
unsigned int general_user_length;
|
||||||
|
const char *general_command;
|
||||||
|
unsigned int general_command_length;
|
||||||
|
const char *general_query;
|
||||||
|
unsigned int general_query_length;
|
||||||
|
struct charset_info_st *general_charset;
|
||||||
|
unsigned long long general_time;
|
||||||
|
unsigned long long general_rows;
|
||||||
|
unsigned long long query_id;
|
||||||
|
char *database;
|
||||||
|
int database_length;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static int auditing_v4(MYSQL_THD thd, mysql_event_class_t class, const void *ev)
|
||||||
|
{
|
||||||
|
int *subclass= (int *)ev;
|
||||||
|
struct mysql_event_general_302 ev_302;
|
||||||
|
int subclass_v3, subclass_orig;
|
||||||
|
|
||||||
|
if (class != MYSQL_AUDIT_GENERAL_CLASS &&
|
||||||
|
class != MYSQL_AUDIT_CONNECTION_CLASS)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
subclass_orig= *subclass;
|
||||||
|
|
||||||
|
if (class == MYSQL_AUDIT_GENERAL_CLASS)
|
||||||
|
{
|
||||||
|
struct mysql_event_general *event= (struct mysql_event_general *) ev;
|
||||||
|
ev_302.general_error_code= event->general_error_code;
|
||||||
|
ev_302.general_thread_id= event->general_thread_id;
|
||||||
|
ev_302.general_user= event->general_user.str;
|
||||||
|
ev_302.general_user_length= event->general_user.length;
|
||||||
|
ev_302.general_command= event->general_command.str;
|
||||||
|
ev_302.general_command_length= event->general_command.length;
|
||||||
|
ev_302.general_query= event->general_query.str;
|
||||||
|
ev_302.general_query_length= event->general_query.length;
|
||||||
|
ev_302.general_charset= event->general_charset;
|
||||||
|
ev_302.general_time= event->general_time;
|
||||||
|
ev_302.general_rows= event->general_rows;
|
||||||
|
if (get_db_mysql57(thd, &ev_302.database, &ev_302.database_length))
|
||||||
|
{
|
||||||
|
ev_302.database= 0;
|
||||||
|
ev_302.database_length= 0;
|
||||||
|
}
|
||||||
|
ev= &ev_302;
|
||||||
|
switch (subclass_orig)
|
||||||
|
{
|
||||||
|
case MYSQL_AUDIT_GENERAL_LOG:
|
||||||
|
subclass_v3= 0;
|
||||||
|
ev_302.event_subclass= 0;
|
||||||
|
break;
|
||||||
|
case MYSQL_AUDIT_GENERAL_ERROR:
|
||||||
|
subclass_v3= 1;
|
||||||
|
ev_302.event_subclass= 1;
|
||||||
|
break;
|
||||||
|
case MYSQL_AUDIT_GENERAL_RESULT:
|
||||||
|
subclass_v3= 2;
|
||||||
|
ev_302.event_subclass= 2;
|
||||||
|
break;
|
||||||
|
case MYSQL_AUDIT_GENERAL_STATUS:
|
||||||
|
{
|
||||||
|
subclass_v3= 3;
|
||||||
|
ev_302.event_subclass= 3;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else /* if (class == MYSQL_AUDIT_CONNECTION_CLASS) */
|
||||||
|
{
|
||||||
|
switch (subclass_orig)
|
||||||
|
{
|
||||||
|
case MYSQL_AUDIT_CONNECTION_CONNECT:
|
||||||
|
subclass_v3= 0;
|
||||||
|
break;
|
||||||
|
case MYSQL_AUDIT_CONNECTION_DISCONNECT:
|
||||||
|
subclass_v3= 1;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
*subclass= subclass_v3;
|
||||||
|
|
||||||
|
auditing(thd, (int) class, ev);
|
||||||
|
|
||||||
|
*subclass= subclass_orig;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static struct st_mysql_audit mysql_descriptor =
|
||||||
|
{
|
||||||
|
MYSQL_AUDIT_INTERFACE_VERSION,
|
||||||
|
NULL,
|
||||||
|
auditing_v4,
|
||||||
|
{ (unsigned long) MYSQL_AUDIT_GENERAL_ALL,
|
||||||
|
(unsigned long) MYSQL_AUDIT_CONNECTION_ALL,
|
||||||
|
(unsigned long) MYSQL_AUDIT_PARSE_ALL,
|
||||||
|
0, /* This event class is currently not supported. */
|
||||||
|
0, /* This event class is currently not supported. */
|
||||||
|
(unsigned long) MYSQL_AUDIT_GLOBAL_VARIABLE_ALL,
|
||||||
|
(unsigned long) MYSQL_AUDIT_SERVER_STARTUP_ALL,
|
||||||
|
(unsigned long) MYSQL_AUDIT_SERVER_SHUTDOWN_ALL,
|
||||||
|
(unsigned long) MYSQL_AUDIT_COMMAND_ALL,
|
||||||
|
(unsigned long) MYSQL_AUDIT_QUERY_ALL,
|
||||||
|
(unsigned long) MYSQL_AUDIT_STORED_PROGRAM_ALL }
|
||||||
|
#ifdef WHEN_MYSQL_BUG_FIXED
|
||||||
|
/*
|
||||||
|
By this moment MySQL just sends no notifications at all
|
||||||
|
when we request only those we actually need.
|
||||||
|
So we have to request everything and filter them inside the
|
||||||
|
handling function.
|
||||||
|
*/
|
||||||
|
{ (unsigned long) MYSQL_AUDIT_GENERAL_ALL,
|
||||||
|
(unsigned long) (MYSQL_AUDIT_CONNECTION_CONNECT |
|
||||||
|
MYSQL_AUDIT_CONNECTION_DISCONNECT),
|
||||||
|
0,
|
||||||
|
0, /* This event class is currently not supported. */
|
||||||
|
0, /* This event class is currently not supported. */
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
}
|
||||||
|
#endif /*WHEN_MYSQL_BUG_FIXED*/
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
void *mysql_v4_descriptor= &mysql_descriptor;
|
||||||
|
|
@@ -7703,8 +7703,8 @@ static int show_slave_running(THD *thd, SHOW_VAR *var, char *buff,
|
|||||||
get_master_info(&thd->variables.default_master_connection,
|
get_master_info(&thd->variables.default_master_connection,
|
||||||
Sql_condition::WARN_LEVEL_NOTE);
|
Sql_condition::WARN_LEVEL_NOTE);
|
||||||
if (mi)
|
if (mi)
|
||||||
tmp= (my_bool) (mi->slave_running == MYSQL_SLAVE_RUN_CONNECT &&
|
tmp= (my_bool) (mi->slave_running == MYSQL_SLAVE_RUN_READING &&
|
||||||
mi->rli.slave_running);
|
mi->rli.slave_running != MYSQL_SLAVE_NOT_RUN);
|
||||||
}
|
}
|
||||||
mysql_mutex_unlock(&LOCK_active_mi);
|
mysql_mutex_unlock(&LOCK_active_mi);
|
||||||
if (mi)
|
if (mi)
|
||||||
@@ -7715,6 +7715,38 @@ static int show_slave_running(THD *thd, SHOW_VAR *var, char *buff,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* How many slaves are connected to this master */
|
||||||
|
|
||||||
|
static int show_slaves_connected(THD *thd, SHOW_VAR *var, char *buff)
|
||||||
|
{
|
||||||
|
|
||||||
|
var->type= SHOW_LONGLONG;
|
||||||
|
var->value= buff;
|
||||||
|
mysql_mutex_lock(&LOCK_slave_list);
|
||||||
|
|
||||||
|
*((longlong *)buff)= slave_list.records;
|
||||||
|
|
||||||
|
mysql_mutex_unlock(&LOCK_slave_list);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* How many masters this slave is connected to */
|
||||||
|
|
||||||
|
|
||||||
|
static int show_slaves_running(THD *thd, SHOW_VAR *var, char *buff)
|
||||||
|
{
|
||||||
|
var->type= SHOW_LONGLONG;
|
||||||
|
var->value= buff;
|
||||||
|
mysql_mutex_lock(&LOCK_active_mi);
|
||||||
|
|
||||||
|
*((longlong *)buff)= master_info_index->any_slave_sql_running();
|
||||||
|
|
||||||
|
mysql_mutex_unlock(&LOCK_active_mi);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static int show_slave_received_heartbeats(THD *thd, SHOW_VAR *var, char *buff,
|
static int show_slave_received_heartbeats(THD *thd, SHOW_VAR *var, char *buff,
|
||||||
enum enum_var_type scope)
|
enum enum_var_type scope)
|
||||||
{
|
{
|
||||||
@@ -8423,6 +8455,9 @@ SHOW_VAR status_vars[]= {
|
|||||||
{"Select_scan", (char*) offsetof(STATUS_VAR, select_scan_count_), SHOW_LONG_STATUS},
|
{"Select_scan", (char*) offsetof(STATUS_VAR, select_scan_count_), SHOW_LONG_STATUS},
|
||||||
{"Slave_open_temp_tables", (char*) &slave_open_temp_tables, SHOW_INT},
|
{"Slave_open_temp_tables", (char*) &slave_open_temp_tables, SHOW_INT},
|
||||||
#ifdef HAVE_REPLICATION
|
#ifdef HAVE_REPLICATION
|
||||||
|
{"Slaves_connected", (char*) &show_slaves_connected, SHOW_SIMPLE_FUNC },
|
||||||
|
{"Slaves_running", (char*) &show_slaves_running, SHOW_SIMPLE_FUNC },
|
||||||
|
{"Slave_connections", (char*) offsetof(STATUS_VAR, com_register_slave), SHOW_LONG_STATUS},
|
||||||
{"Slave_heartbeat_period", (char*) &show_heartbeat_period, SHOW_SIMPLE_FUNC},
|
{"Slave_heartbeat_period", (char*) &show_heartbeat_period, SHOW_SIMPLE_FUNC},
|
||||||
{"Slave_received_heartbeats",(char*) &show_slave_received_heartbeats, SHOW_SIMPLE_FUNC},
|
{"Slave_received_heartbeats",(char*) &show_slave_received_heartbeats, SHOW_SIMPLE_FUNC},
|
||||||
{"Slave_retried_transactions",(char*)&slave_retried_transactions, SHOW_LONG},
|
{"Slave_retried_transactions",(char*)&slave_retried_transactions, SHOW_LONG},
|
||||||
|
@@ -34,6 +34,7 @@
|
|||||||
HFTODO this must be hidden if we don't want client capabilities in
|
HFTODO this must be hidden if we don't want client capabilities in
|
||||||
embedded library
|
embedded library
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <my_global.h>
|
#include <my_global.h>
|
||||||
#include <mysql.h>
|
#include <mysql.h>
|
||||||
#include <mysql_com.h>
|
#include <mysql_com.h>
|
||||||
@@ -107,13 +108,12 @@ extern void query_cache_insert(void *thd, const char *packet, ulong length,
|
|||||||
unsigned pkt_nr);
|
unsigned pkt_nr);
|
||||||
#endif // HAVE_QUERY_CACHE
|
#endif // HAVE_QUERY_CACHE
|
||||||
#define update_statistics(A) A
|
#define update_statistics(A) A
|
||||||
#else
|
extern my_bool thd_net_is_killed();
|
||||||
#define update_statistics(A)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef MYSQL_SERVER
|
|
||||||
/* Additional instrumentation hooks for the server */
|
/* Additional instrumentation hooks for the server */
|
||||||
#include "mysql_com_server.h"
|
#include "mysql_com_server.h"
|
||||||
|
#else
|
||||||
|
#define update_statistics(A)
|
||||||
|
#define thd_net_is_killed() 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define TEST_BLOCKING 8
|
#define TEST_BLOCKING 8
|
||||||
@@ -876,6 +876,16 @@ my_real_read(NET *net, size_t *complen,
|
|||||||
|
|
||||||
DBUG_PRINT("info",("vio_read returned %ld errno: %d",
|
DBUG_PRINT("info",("vio_read returned %ld errno: %d",
|
||||||
(long) length, vio_errno(net->vio)));
|
(long) length, vio_errno(net->vio)));
|
||||||
|
|
||||||
|
if (i== 0 && thd_net_is_killed())
|
||||||
|
{
|
||||||
|
len= packet_error;
|
||||||
|
net->error= 0;
|
||||||
|
net->last_errno= ER_CONNECTION_KILLED;
|
||||||
|
MYSQL_SERVER_my_error(net->last_errno, MYF(0));
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
#if !defined(__WIN__) && defined(MYSQL_SERVER)
|
#if !defined(__WIN__) && defined(MYSQL_SERVER)
|
||||||
/*
|
/*
|
||||||
We got an error that there was no data on the socket. We now set up
|
We got an error that there was no data on the socket. We now set up
|
||||||
|
@@ -35,7 +35,8 @@ Master_info::Master_info(LEX_STRING *connection_name_arg,
|
|||||||
rli(is_slave_recovery), port(MYSQL_PORT),
|
rli(is_slave_recovery), port(MYSQL_PORT),
|
||||||
checksum_alg_before_fd(BINLOG_CHECKSUM_ALG_UNDEF),
|
checksum_alg_before_fd(BINLOG_CHECKSUM_ALG_UNDEF),
|
||||||
connect_retry(DEFAULT_CONNECT_RETRY), inited(0), abort_slave(0),
|
connect_retry(DEFAULT_CONNECT_RETRY), inited(0), abort_slave(0),
|
||||||
slave_running(0), slave_run_id(0), clock_diff_with_master(0),
|
slave_running(MYSQL_SLAVE_NOT_RUN), slave_run_id(0),
|
||||||
|
clock_diff_with_master(0),
|
||||||
sync_counter(0), heartbeat_period(0), received_heartbeats(0),
|
sync_counter(0), heartbeat_period(0), received_heartbeats(0),
|
||||||
master_id(0), prev_master_id(0),
|
master_id(0), prev_master_id(0),
|
||||||
using_gtid(USE_GTID_NO), events_queued_since_last_gtid(0),
|
using_gtid(USE_GTID_NO), events_queued_since_last_gtid(0),
|
||||||
@@ -1396,23 +1397,24 @@ bool Master_info_index::give_error_if_slave_running()
|
|||||||
The LOCK_active_mi must be held while calling this function.
|
The LOCK_active_mi must be held while calling this function.
|
||||||
|
|
||||||
@return
|
@return
|
||||||
TRUE If some slave SQL thread is running.
|
0 No Slave SQL thread is running
|
||||||
FALSE No slave SQL thread is running
|
# Number of slave SQL thread running
|
||||||
*/
|
*/
|
||||||
|
|
||||||
bool Master_info_index::any_slave_sql_running()
|
uint Master_info_index::any_slave_sql_running()
|
||||||
{
|
{
|
||||||
|
uint count= 0;
|
||||||
DBUG_ENTER("any_slave_sql_running");
|
DBUG_ENTER("any_slave_sql_running");
|
||||||
if (!this) // master_info_index is set to NULL on server shutdown
|
if (!this) // master_info_index is set to NULL on server shutdown
|
||||||
DBUG_RETURN(TRUE);
|
DBUG_RETURN(count);
|
||||||
|
|
||||||
for (uint i= 0; i< master_info_hash.records; ++i)
|
for (uint i= 0; i< master_info_hash.records; ++i)
|
||||||
{
|
{
|
||||||
Master_info *mi= (Master_info *)my_hash_element(&master_info_hash, i);
|
Master_info *mi= (Master_info *)my_hash_element(&master_info_hash, i);
|
||||||
if (mi->rli.slave_running != MYSQL_SLAVE_NOT_RUN)
|
if (mi->rli.slave_running != MYSQL_SLAVE_NOT_RUN)
|
||||||
DBUG_RETURN(TRUE);
|
count++;
|
||||||
}
|
}
|
||||||
DBUG_RETURN(FALSE);
|
DBUG_RETURN(count);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1442,7 +1444,7 @@ bool Master_info_index::start_all_slaves(THD *thd)
|
|||||||
Try to start all slaves that are configured (host is defined)
|
Try to start all slaves that are configured (host is defined)
|
||||||
and are not already running
|
and are not already running
|
||||||
*/
|
*/
|
||||||
if ((mi->slave_running != MYSQL_SLAVE_RUN_CONNECT ||
|
if ((mi->slave_running == MYSQL_SLAVE_NOT_RUN ||
|
||||||
!mi->rli.slave_running) && *mi->host)
|
!mi->rli.slave_running) && *mi->host)
|
||||||
{
|
{
|
||||||
if ((error= start_slave(thd, mi, 1)))
|
if ((error= start_slave(thd, mi, 1)))
|
||||||
|
@@ -345,7 +345,7 @@ public:
|
|||||||
Master_info *get_master_info(const LEX_STRING *connection_name,
|
Master_info *get_master_info(const LEX_STRING *connection_name,
|
||||||
Sql_condition::enum_warning_level warning);
|
Sql_condition::enum_warning_level warning);
|
||||||
bool give_error_if_slave_running();
|
bool give_error_if_slave_running();
|
||||||
bool any_slave_sql_running();
|
uint any_slave_sql_running();
|
||||||
bool start_all_slaves(THD *thd);
|
bool start_all_slaves(THD *thd);
|
||||||
bool stop_all_slaves(THD *thd);
|
bool stop_all_slaves(THD *thd);
|
||||||
};
|
};
|
||||||
|
@@ -63,7 +63,7 @@ Relay_log_info::Relay_log_info(bool is_slave_recovery)
|
|||||||
last_master_timestamp(0), sql_thread_caught_up(true), slave_skip_counter(0),
|
last_master_timestamp(0), sql_thread_caught_up(true), slave_skip_counter(0),
|
||||||
abort_pos_wait(0), slave_run_id(0), sql_driver_thd(),
|
abort_pos_wait(0), slave_run_id(0), sql_driver_thd(),
|
||||||
gtid_skip_flag(GTID_SKIP_NOT), inited(0), abort_slave(0), stop_for_until(0),
|
gtid_skip_flag(GTID_SKIP_NOT), inited(0), abort_slave(0), stop_for_until(0),
|
||||||
slave_running(0), until_condition(UNTIL_NONE),
|
slave_running(MYSQL_SLAVE_NOT_RUN), until_condition(UNTIL_NONE),
|
||||||
until_log_pos(0), retried_trans(0), executed_entries(0),
|
until_log_pos(0), retried_trans(0), executed_entries(0),
|
||||||
m_flags(0)
|
m_flags(0)
|
||||||
{
|
{
|
||||||
|
21
sql/slave.cc
21
sql/slave.cc
@@ -117,7 +117,7 @@ static const char *reconnect_messages[SLAVE_RECON_ACT_MAX][SLAVE_RECON_MSG_MAX]=
|
|||||||
{
|
{
|
||||||
{
|
{
|
||||||
"Waiting to reconnect after a failed registration on master",
|
"Waiting to reconnect after a failed registration on master",
|
||||||
"Slave I/O thread killed while waitnig to reconnect after a failed \
|
"Slave I/O thread killed while waiting to reconnect after a failed \
|
||||||
registration on master",
|
registration on master",
|
||||||
"Reconnecting after a failed registration on master",
|
"Reconnecting after a failed registration on master",
|
||||||
"failed registering on master, reconnecting to try again, \
|
"failed registering on master, reconnecting to try again, \
|
||||||
@@ -2728,6 +2728,8 @@ static bool send_show_master_info_header(THD *thd, bool full,
|
|||||||
DBUG_RETURN(FALSE);
|
DBUG_RETURN(FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Text for Slave_IO_Running */
|
||||||
|
static const char *slave_running[]= { "No", "Connecting", "Preparing", "Yes" };
|
||||||
|
|
||||||
static bool send_show_master_info_data(THD *thd, Master_info *mi, bool full,
|
static bool send_show_master_info_data(THD *thd, Master_info *mi, bool full,
|
||||||
String *gtid_pos)
|
String *gtid_pos)
|
||||||
@@ -2780,9 +2782,7 @@ static bool send_show_master_info_data(THD *thd, Master_info *mi, bool full,
|
|||||||
&my_charset_bin);
|
&my_charset_bin);
|
||||||
protocol->store((ulonglong) mi->rli.group_relay_log_pos);
|
protocol->store((ulonglong) mi->rli.group_relay_log_pos);
|
||||||
protocol->store(mi->rli.group_master_log_name, &my_charset_bin);
|
protocol->store(mi->rli.group_master_log_name, &my_charset_bin);
|
||||||
protocol->store(mi->slave_running == MYSQL_SLAVE_RUN_CONNECT ?
|
protocol->store(slave_running[mi->slave_running], &my_charset_bin);
|
||||||
"Yes" : (mi->slave_running == MYSQL_SLAVE_RUN_NOT_CONNECT ?
|
|
||||||
"Connecting" : "No"), &my_charset_bin);
|
|
||||||
protocol->store(mi->rli.slave_running ? "Yes":"No", &my_charset_bin);
|
protocol->store(mi->rli.slave_running ? "Yes":"No", &my_charset_bin);
|
||||||
protocol->store(rpl_filter->get_do_db());
|
protocol->store(rpl_filter->get_do_db());
|
||||||
protocol->store(rpl_filter->get_ignore_db());
|
protocol->store(rpl_filter->get_ignore_db());
|
||||||
@@ -2825,7 +2825,7 @@ static bool send_show_master_info_data(THD *thd, Master_info *mi, bool full,
|
|||||||
Seconds_Behind_Master: if SQL thread is running and I/O thread is
|
Seconds_Behind_Master: if SQL thread is running and I/O thread is
|
||||||
connected, we can compute it otherwise show NULL (i.e. unknown).
|
connected, we can compute it otherwise show NULL (i.e. unknown).
|
||||||
*/
|
*/
|
||||||
if ((mi->slave_running == MYSQL_SLAVE_RUN_CONNECT) &&
|
if ((mi->slave_running == MYSQL_SLAVE_RUN_READING) &&
|
||||||
mi->rli.slave_running)
|
mi->rli.slave_running)
|
||||||
{
|
{
|
||||||
long time_diff;
|
long time_diff;
|
||||||
@@ -4128,16 +4128,16 @@ connected:
|
|||||||
if (request_dump(thd, mysql, mi, &suppress_warnings))
|
if (request_dump(thd, mysql, mi, &suppress_warnings))
|
||||||
{
|
{
|
||||||
sql_print_error("Failed on request_dump()");
|
sql_print_error("Failed on request_dump()");
|
||||||
if (check_io_slave_killed(mi, "Slave I/O thread killed while \
|
if (check_io_slave_killed(mi, NullS) ||
|
||||||
requesting master dump") ||
|
try_to_reconnect(thd, mysql, mi, &retry_count, suppress_warnings,
|
||||||
try_to_reconnect(thd, mysql, mi, &retry_count, suppress_warnings,
|
reconnect_messages[SLAVE_RECON_ACT_DUMP]))
|
||||||
reconnect_messages[SLAVE_RECON_ACT_DUMP]))
|
|
||||||
goto err;
|
goto err;
|
||||||
goto connected;
|
goto connected;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *event_buf;
|
const char *event_buf;
|
||||||
|
|
||||||
|
mi->slave_running= MYSQL_SLAVE_RUN_READING;
|
||||||
DBUG_ASSERT(mi->last_error().number == 0);
|
DBUG_ASSERT(mi->last_error().number == 0);
|
||||||
while (!io_slave_killed(mi))
|
while (!io_slave_killed(mi))
|
||||||
{
|
{
|
||||||
@@ -4150,8 +4150,7 @@ requesting master dump") ||
|
|||||||
*/
|
*/
|
||||||
THD_STAGE_INFO(thd, stage_waiting_for_master_to_send_event);
|
THD_STAGE_INFO(thd, stage_waiting_for_master_to_send_event);
|
||||||
event_len= read_event(mysql, mi, &suppress_warnings);
|
event_len= read_event(mysql, mi, &suppress_warnings);
|
||||||
if (check_io_slave_killed(mi, "Slave I/O thread killed while \
|
if (check_io_slave_killed(mi, NullS))
|
||||||
reading event"))
|
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
if (event_len == packet_error)
|
if (event_len == packet_error)
|
||||||
|
@@ -135,11 +135,11 @@ extern const char *relay_log_index;
|
|||||||
extern const char *relay_log_basename;
|
extern const char *relay_log_basename;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
3 possible values for Master_info::slave_running and
|
4 possible values for Master_info::slave_running and
|
||||||
Relay_log_info::slave_running.
|
Relay_log_info::slave_running.
|
||||||
The values 0,1,2 are very important: to keep the diff small, I didn't
|
The values 0,1,2,3 are very important: to keep the diff small, I didn't
|
||||||
substitute places where we use 0/1 with the newly defined symbols. So don't change
|
substitute places where we use 0/1 with the newly defined symbols.
|
||||||
these values.
|
So don't change these values.
|
||||||
The same way, code is assuming that in Relay_log_info we use only values
|
The same way, code is assuming that in Relay_log_info we use only values
|
||||||
0/1.
|
0/1.
|
||||||
I started with using an enum, but
|
I started with using an enum, but
|
||||||
@@ -148,6 +148,7 @@ extern const char *relay_log_basename;
|
|||||||
#define MYSQL_SLAVE_NOT_RUN 0
|
#define MYSQL_SLAVE_NOT_RUN 0
|
||||||
#define MYSQL_SLAVE_RUN_NOT_CONNECT 1
|
#define MYSQL_SLAVE_RUN_NOT_CONNECT 1
|
||||||
#define MYSQL_SLAVE_RUN_CONNECT 2
|
#define MYSQL_SLAVE_RUN_CONNECT 2
|
||||||
|
#define MYSQL_SLAVE_RUN_READING 3
|
||||||
|
|
||||||
#define RPL_LOG_NAME (rli->group_master_log_name[0] ? rli->group_master_log_name :\
|
#define RPL_LOG_NAME (rli->group_master_log_name[0] ? rli->group_master_log_name :\
|
||||||
"FIRST")
|
"FIRST")
|
||||||
|
@@ -1817,7 +1817,8 @@ void add_diff_to_status(STATUS_VAR *to_var, STATUS_VAR *from_var,
|
|||||||
void THD::awake(killed_state state_to_set)
|
void THD::awake(killed_state state_to_set)
|
||||||
{
|
{
|
||||||
DBUG_ENTER("THD::awake");
|
DBUG_ENTER("THD::awake");
|
||||||
DBUG_PRINT("enter", ("this: %p current_thd: %p", this, current_thd));
|
DBUG_PRINT("enter", ("this: %p current_thd: %p state: %d",
|
||||||
|
this, current_thd, (int) state_to_set));
|
||||||
THD_CHECK_SENTRY(this);
|
THD_CHECK_SENTRY(this);
|
||||||
mysql_mutex_assert_owner(&LOCK_thd_data);
|
mysql_mutex_assert_owner(&LOCK_thd_data);
|
||||||
|
|
||||||
@@ -4026,6 +4027,12 @@ void thd_increment_bytes_sent(void *thd, ulong length)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
my_bool thd_net_is_killed()
|
||||||
|
{
|
||||||
|
THD *thd= current_thd;
|
||||||
|
return thd && thd->killed ? 1 : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void thd_increment_bytes_received(void *thd, ulong length)
|
void thd_increment_bytes_received(void *thd, ulong length)
|
||||||
{
|
{
|
||||||
|
@@ -703,6 +703,7 @@ typedef struct system_status_var
|
|||||||
ulong com_stmt_reset;
|
ulong com_stmt_reset;
|
||||||
ulong com_stmt_close;
|
ulong com_stmt_close;
|
||||||
|
|
||||||
|
ulong com_register_slave;
|
||||||
ulong created_tmp_disk_tables_;
|
ulong created_tmp_disk_tables_;
|
||||||
ulong created_tmp_tables_;
|
ulong created_tmp_tables_;
|
||||||
ulong ha_commit_count;
|
ulong ha_commit_count;
|
||||||
|
@@ -1353,6 +1353,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
|
|||||||
#ifdef HAVE_REPLICATION
|
#ifdef HAVE_REPLICATION
|
||||||
case COM_REGISTER_SLAVE:
|
case COM_REGISTER_SLAVE:
|
||||||
{
|
{
|
||||||
|
status_var_increment(thd->status_var.com_register_slave);
|
||||||
if (!register_slave(thd, (uchar*)packet, packet_length))
|
if (!register_slave(thd, (uchar*)packet, packet_length))
|
||||||
my_ok(thd);
|
my_ok(thd);
|
||||||
break;
|
break;
|
||||||
|
@@ -594,7 +594,7 @@ PSZ Serialize(PGLOBAL g, PJSON jsp, char *fn, int pretty)
|
|||||||
if (fs) {
|
if (fs) {
|
||||||
fputs(EL, fs);
|
fputs(EL, fs);
|
||||||
fclose(fs);
|
fclose(fs);
|
||||||
str = (err) ? NULL : "Ok";
|
str = (err) ? NULL : (char*) "Ok";
|
||||||
} else if (!err) {
|
} else if (!err) {
|
||||||
str = ((JOUTSTR*)jp)->Strp;
|
str = ((JOUTSTR*)jp)->Strp;
|
||||||
jp->WriteChr('\0');
|
jp->WriteChr('\0');
|
||||||
|
@@ -3365,7 +3365,7 @@ my_bool jsoncontains_init(UDF_INIT *initid, UDF_ARGS *args, char *message)
|
|||||||
long long jsoncontains(UDF_INIT *initid, UDF_ARGS *args, char *result,
|
long long jsoncontains(UDF_INIT *initid, UDF_ARGS *args, char *result,
|
||||||
unsigned long *res_length, char *is_null, char *error)
|
unsigned long *res_length, char *is_null, char *error)
|
||||||
{
|
{
|
||||||
char *p, res[256];
|
char *p __attribute__((unused)), res[256];
|
||||||
long long n;
|
long long n;
|
||||||
unsigned long reslen;
|
unsigned long reslen;
|
||||||
|
|
||||||
|
@@ -24,6 +24,7 @@ def gen_test(n):
|
|||||||
def main():
|
def main():
|
||||||
print "# this test is generated by change_bin.py"
|
print "# this test is generated by change_bin.py"
|
||||||
print "# test binary expansion is hot"
|
print "# test binary expansion is hot"
|
||||||
|
print "--source include/big_test.inc"
|
||||||
print "--disable_warnings"
|
print "--disable_warnings"
|
||||||
print "DROP TABLE IF EXISTS t,ti;"
|
print "DROP TABLE IF EXISTS t,ti;"
|
||||||
print "--enable_warnings"
|
print "--enable_warnings"
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
source include/have_tokudb.inc;
|
source include/have_tokudb.inc;
|
||||||
# this test is generated by change_bin.py
|
# this test is generated by change_bin.py
|
||||||
# test binary expansion is hot
|
# test binary expansion is hot
|
||||||
|
--source include/big_test.inc
|
||||||
--disable_warnings
|
--disable_warnings
|
||||||
DROP TABLE IF EXISTS t,ti;
|
DROP TABLE IF EXISTS t,ti;
|
||||||
--enable_warnings
|
--enable_warnings
|
||||||
|
@@ -24,6 +24,7 @@ def gen_test(n):
|
|||||||
def main():
|
def main():
|
||||||
print "# this test is generated by change_char.py"
|
print "# this test is generated by change_char.py"
|
||||||
print "# test char expansion"
|
print "# test char expansion"
|
||||||
|
print "--source include/big_test.inc"
|
||||||
print "--disable_warnings"
|
print "--disable_warnings"
|
||||||
print "DROP TABLE IF EXISTS t,ti;"
|
print "DROP TABLE IF EXISTS t,ti;"
|
||||||
print "--enable_warnings"
|
print "--enable_warnings"
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
source include/have_tokudb.inc;
|
source include/have_tokudb.inc;
|
||||||
# this test is generated by change_char.py
|
# this test is generated by change_char.py
|
||||||
# test char expansion
|
# test char expansion
|
||||||
|
--source include/big_test.inc
|
||||||
--disable_warnings
|
--disable_warnings
|
||||||
DROP TABLE IF EXISTS t,ti;
|
DROP TABLE IF EXISTS t,ti;
|
||||||
--enable_warnings
|
--enable_warnings
|
||||||
|
Reference in New Issue
Block a user