mirror of
https://github.com/MariaDB/server.git
synced 2025-12-28 00:01:00 +00:00
fixing embedded: WaaS. Wsrep as a Service.
This commit is contained in:
parent
8877adb773
commit
7aabc2ded2
205
include/mysql/service_wsrep.h
Normal file
205
include/mysql/service_wsrep.h
Normal file
@ -0,0 +1,205 @@
|
||||
#ifndef MYSQL_SERVICE_WSREP_INCLUDED
|
||||
/* Copyright (c) 2013, Monty Program Ab
|
||||
|
||||
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 */
|
||||
|
||||
/**
|
||||
@file
|
||||
wsrep service
|
||||
|
||||
Interface to WSREP functionality in the server.
|
||||
For engines that want to support galera.
|
||||
*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
enum wsrep_conflict_state {
|
||||
NO_CONFLICT,
|
||||
MUST_ABORT,
|
||||
ABORTING,
|
||||
ABORTED,
|
||||
MUST_REPLAY,
|
||||
REPLAYING,
|
||||
RETRY_AUTOCOMMIT,
|
||||
CERT_FAILURE,
|
||||
};
|
||||
|
||||
enum wsrep_exec_mode {
|
||||
LOCAL_STATE,
|
||||
REPL_RECV,
|
||||
TOTAL_ORDER,
|
||||
LOCAL_COMMIT
|
||||
};
|
||||
|
||||
enum wsrep_query_state {
|
||||
QUERY_IDLE,
|
||||
QUERY_EXEC,
|
||||
QUERY_COMMITTING,
|
||||
QUERY_EXITING,
|
||||
QUERY_ROLLINGBACK,
|
||||
};
|
||||
|
||||
enum wsrep_trx_status {
|
||||
WSREP_TRX_OK,
|
||||
WSREP_TRX_CERT_FAIL, /* certification failure, must abort */
|
||||
WSREP_TRX_SIZE_EXCEEDED, /* trx size exceeded */
|
||||
WSREP_TRX_ERROR, /* native mysql error */
|
||||
};
|
||||
|
||||
struct xid_t;
|
||||
struct wsrep;
|
||||
struct wsrep_ws_handle;
|
||||
struct wsrep_buf;
|
||||
|
||||
extern struct wsrep_service_st {
|
||||
struct wsrep * (*get_wsrep_func)();
|
||||
my_bool (*get_wsrep_certify_nonPK_func)();
|
||||
my_bool (*get_wsrep_debug_func)();
|
||||
my_bool (*get_wsrep_drupal_282555_workaround_func)();
|
||||
my_bool (*get_wsrep_load_data_splitting_func)();
|
||||
my_bool (*get_wsrep_log_conflicts_func)();
|
||||
long (*get_wsrep_protocol_version_func)();
|
||||
my_bool (*wsrep_aborting_thd_contains_func)(THD *thd);
|
||||
void (*wsrep_aborting_thd_enqueue_func)(THD *thd);
|
||||
bool (*wsrep_consistency_check_func)(THD *thd);
|
||||
int (*wsrep_is_wsrep_xid_func)(const struct xid_t *xid);
|
||||
void (*wsrep_lock_rollback_func)();
|
||||
int (*wsrep_on_func)(MYSQL_THD);
|
||||
void (*wsrep_post_commit_func)(THD* thd, bool all);
|
||||
bool (*wsrep_prepare_key_func)(const unsigned char*, size_t, const unsigned char*, size_t, struct wsrep_buf*, size_t*);
|
||||
enum wsrep_trx_status (*wsrep_run_wsrep_commit_func)(THD *thd, handlerton *hton, bool all);
|
||||
void (*wsrep_thd_LOCK_func)(THD *thd);
|
||||
void (*wsrep_thd_UNLOCK_func)(THD *thd);
|
||||
void (*wsrep_thd_awake_func)(THD *thd, my_bool signal);
|
||||
enum wsrep_conflict_state (*wsrep_thd_conflict_state_func)(MYSQL_THD, my_bool);
|
||||
const char * (*wsrep_thd_conflict_state_str_func)(THD *thd);
|
||||
enum wsrep_exec_mode (*wsrep_thd_exec_mode_func)(THD *thd);
|
||||
const char * (*wsrep_thd_exec_mode_str_func)(THD *thd);
|
||||
enum wsrep_conflict_state (*wsrep_thd_get_conflict_state_func)(MYSQL_THD);
|
||||
my_bool (*wsrep_thd_is_BF_func)(MYSQL_THD , my_bool);
|
||||
my_bool (*wsrep_thd_is_wsrep_func)(MYSQL_THD thd);
|
||||
char * (*wsrep_thd_query_func)(THD *thd);
|
||||
enum wsrep_query_state (*wsrep_thd_query_state_func)(THD *thd);
|
||||
const char * (*wsrep_thd_query_state_str_func)(THD *thd);
|
||||
int (*wsrep_thd_retry_counter_func)(THD *thd);
|
||||
void (*wsrep_thd_set_conflict_state_func)(THD *thd, enum wsrep_conflict_state state);
|
||||
long long (*wsrep_thd_trx_seqno_func)(THD *thd);
|
||||
struct wsrep_ws_handle * (*wsrep_thd_ws_handle_func)(THD *thd);
|
||||
int (*wsrep_trx_is_aborting_func)(MYSQL_THD thd);
|
||||
int (*wsrep_trx_order_before_func)(MYSQL_THD, MYSQL_THD);
|
||||
void (*wsrep_unlock_rollback_func)();
|
||||
} *wsrep_service;
|
||||
|
||||
#ifdef MYSQL_DYNAMIC_PLUGIN
|
||||
#define get_wsrep() wsrep_service->get_wsrep_func()
|
||||
#define get_wsrep_certify_nonPK() wsrep_service->get_wsrep_certify_nonPK_func()
|
||||
#define get_wsrep_debug() wsrep_service->get_wsrep_debug_func()
|
||||
#define get_wsrep_drupal_282555_workaround() wsrep_service->get_wsrep_drupal_282555_workaround_func()
|
||||
#define get_wsrep_load_data_splitting() wsrep_service->get_wsrep_load_data_splitting_func()
|
||||
#define get_wsrep_log_conflicts() wsrep_service->get_wsrep_log_conflicts_func()
|
||||
#define get_wsrep_protocol_version() wsrep_service->get_wsrep_protocol_version_func()
|
||||
#define wsrep_aborting_thd_contains(T) wsrep_service->wsrep_aborting_thd_contains_func(T)
|
||||
#define wsrep_aborting_thd_enqueue(T) wsrep_service->wsrep_aborting_thd_enqueue_func(T)
|
||||
#define wsrep_consistency_check(T) wsrep_service->wsrep_consistency_check_func(T)
|
||||
#define wsrep_is_wsrep_xid(X) wsrep_service->wsrep_is_wsrep_xid_func(X)
|
||||
#define wsrep_lock_rollback() wsrep_service->wsrep_lock_rollback_func()
|
||||
#define wsrep_on(X) wsrep_service->wsrep_on_func(X)
|
||||
#define wsrep_post_commit(T,A) wsrep_service->wsrep_post_commit_func(T,A)
|
||||
#define wsrep_prepare_key(A,B,C,D,E,F) wsrep_service->wsrep_prepare_key_func(A,B,C,D,E,F)
|
||||
#define wsrep_run_wsrep_commit(T,H,A) wsrep_service->wsrep_run_wsrep_commit_func(T,H,A)
|
||||
#define wsrep_thd_LOCK(T) wsrep_service->wsrep_thd_LOCK_func(T)
|
||||
#define wsrep_thd_UNLOCK(T) wsrep_service->wsrep_thd_UNLOCK_func(T)
|
||||
#define wsrep_thd_awake(T,S) wsrep_service->wsrep_thd_awake_func(T,S)
|
||||
#define wsrep_thd_conflict_state(T,S) wsrep_service->wsrep_thd_conflict_state_func(T,S)
|
||||
#define wsrep_thd_conflict_state_str(T) wsrep_service->wsrep_thd_conflict_state_str_func(T)
|
||||
#define wsrep_thd_exec_mode(T) wsrep_service->wsrep_thd_exec_mode_func(T)
|
||||
#define wsrep_thd_exec_mode_str(T) wsrep_service->wsrep_thd_exec_mode_str_func(T)
|
||||
#define wsrep_thd_get_conflict_state(T) wsrep_service->wsrep_thd_get_conflict_state_func(T)
|
||||
#define wsrep_thd_is_BF(T,S) wsrep_service->wsrep_thd_is_BF_func(T,S)
|
||||
#define wsrep_thd_is_wsrep(T) wsrep_service->wsrep_thd_is_wsrep_func(T)
|
||||
#define wsrep_thd_query(T) wsrep_service->wsrep_thd_query_func(T)
|
||||
#define wsrep_thd_query_state(T) wsrep_service->wsrep_thd_query_state_func(T)
|
||||
#define wsrep_thd_query_state_str(T) wsrep_service->wsrep_thd_query_state_str_func(T)
|
||||
#define wsrep_thd_retry_counter(T) wsrep_service->wsrep_thd_retry_counter_func(T)
|
||||
#define wsrep_thd_set_conflict_state(T,S) wsrep_service->wsrep_thd_set_conflict_state_func(T,S)
|
||||
#define wsrep_thd_trx_seqno(T) wsrep_service->wsrep_thd_trx_seqno_func(T)
|
||||
#define wsrep_thd_ws_handle(T) wsrep_service->wsrep_thd_ws_handle_func(T)
|
||||
#define wsrep_trx_is_aborting(T) wsrep_service->wsrep_trx_is_aborting_func(T)
|
||||
#define wsrep_trx_order_before(T1,T2) wsrep_service->wsrep_trx_order_before_func(T1,T2)
|
||||
#define wsrep_unlock_rollback() wsrep_service->wsrep_unlock_rollback_func()
|
||||
|
||||
#define wsrep_debug get_wsrep_debug()
|
||||
#define wsrep_log_conflicts get_wsrep_log_conflicts()
|
||||
#define wsrep_certify_nonPK get_wsrep_certify_nonPK()
|
||||
#define wsrep_load_data_splitting get_wsrep_load_data_splitting()
|
||||
#define wsrep_drupal_282555_workaround get_wsrep_drupal_282555_workaround()
|
||||
#define wsrep_protocol_version get_wsrep_protocol_version()
|
||||
|
||||
#else
|
||||
|
||||
extern my_bool wsrep_debug;
|
||||
extern my_bool wsrep_log_conflicts;
|
||||
extern my_bool wsrep_certify_nonPK;
|
||||
extern my_bool wsrep_load_data_splitting;
|
||||
extern my_bool wsrep_drupal_282555_workaround;
|
||||
extern long wsrep_protocol_version;
|
||||
|
||||
bool wsrep_consistency_check(THD *thd);
|
||||
bool wsrep_prepare_key(const unsigned char* cache_key, size_t cache_key_len, const unsigned char* row_id, size_t row_id_len, struct wsrep_buf* key, size_t* key_len);
|
||||
char *wsrep_thd_query(THD *thd);
|
||||
const char *wsrep_thd_conflict_state_str(THD *thd);
|
||||
const char *wsrep_thd_exec_mode_str(THD *thd);
|
||||
const char *wsrep_thd_query_state_str(THD *thd);
|
||||
enum wsrep_conflict_state wsrep_thd_conflict_state(MYSQL_THD thd, my_bool sync);
|
||||
enum wsrep_conflict_state wsrep_thd_get_conflict_state(MYSQL_THD thd);
|
||||
enum wsrep_exec_mode wsrep_thd_exec_mode(THD *thd);
|
||||
enum wsrep_query_state wsrep_thd_query_state(THD *thd);
|
||||
enum wsrep_trx_status wsrep_run_wsrep_commit(THD *thd, handlerton *hton, bool all);
|
||||
int wsrep_is_wsrep_xid(const struct xid_t* xid);
|
||||
int wsrep_on(MYSQL_THD thd);
|
||||
int wsrep_thd_retry_counter(THD *thd);
|
||||
int wsrep_trx_is_aborting(MYSQL_THD thd);
|
||||
int wsrep_trx_order_before(MYSQL_THD thd1, MYSQL_THD thd2);
|
||||
long get_wsrep_protocol_version();
|
||||
long long wsrep_thd_trx_seqno(THD *thd);
|
||||
my_bool get_wsrep_certify_nonPK();
|
||||
my_bool get_wsrep_debug();
|
||||
my_bool get_wsrep_drupal_282555_workaround();
|
||||
my_bool get_wsrep_load_data_splitting();
|
||||
my_bool get_wsrep_log_conflicts();
|
||||
my_bool wsrep_aborting_thd_contains(THD *thd);
|
||||
my_bool wsrep_thd_is_BF(MYSQL_THD thd, my_bool sync);
|
||||
my_bool wsrep_thd_is_wsrep(MYSQL_THD thd);
|
||||
struct wsrep *get_wsrep();
|
||||
struct wsrep_ws_handle *wsrep_thd_ws_handle(THD *thd);
|
||||
void wsrep_aborting_thd_enqueue(THD *thd);
|
||||
void wsrep_lock_rollback();
|
||||
void wsrep_post_commit(THD* thd, bool all);
|
||||
void wsrep_thd_LOCK(THD *thd);
|
||||
void wsrep_thd_UNLOCK(THD *thd);
|
||||
void wsrep_thd_awake(THD *thd, my_bool signal);
|
||||
void wsrep_thd_set_conflict_state(THD *thd, enum wsrep_conflict_state state);
|
||||
void wsrep_unlock_rollback();
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#define MYSQL_SERVICE_WSREP_INCLUDED
|
||||
#endif
|
||||
|
||||
@ -31,6 +31,7 @@ extern "C" {
|
||||
#include <mysql/service_logger.h>
|
||||
#include <mysql/service_thd_autoinc.h>
|
||||
#include <mysql/service_thd_error_context.h>
|
||||
/*#include <mysql/service_wsrep.h>*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
@ -30,6 +30,7 @@
|
||||
#define VERSION_thd_timezone 0x0100
|
||||
#define VERSION_my_sha1 0x0101
|
||||
#define VERSION_my_md5 0x0100
|
||||
#define VERSION_wsrep 0x0100
|
||||
#define VERSION_logger 0x0100
|
||||
#define VERSION_thd_autoinc 0x0100
|
||||
#define VERSION_thd_error_context 0x0100
|
||||
|
||||
@ -105,6 +105,7 @@ SET(SQL_EMBEDDED_SOURCES emb_qcache.cc libmysqld.c lib_sql.cc
|
||||
../sql/compat56.cc
|
||||
../sql/table_cache.cc
|
||||
../sql/item_inetfunc.cc
|
||||
../sql/wsrep_dummy.cc
|
||||
${GEN_SOURCES}
|
||||
${MYSYS_LIBWRAP_SOURCE}
|
||||
)
|
||||
|
||||
@ -26,6 +26,7 @@ SET(MYSQLSERVICES_SOURCES
|
||||
debug_sync_service.c
|
||||
my_sha1_service.c
|
||||
my_md5_service.c
|
||||
wsrep_service.c
|
||||
kill_statement_service.c
|
||||
logger_service.c)
|
||||
|
||||
|
||||
20
libservices/wsrep_service.c
Normal file
20
libservices/wsrep_service.c
Normal file
@ -0,0 +1,20 @@
|
||||
/* Copyright (C) 2014 SkySQL Ab.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; version 2 of the License.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
||||
|
||||
#include <service_versions.h>
|
||||
|
||||
/* file reserved for the future use */
|
||||
SERVICE_VERSION wsrep_service= (void *) VERSION_wsrep;
|
||||
|
||||
@ -5,7 +5,7 @@ plugin_version 1.0
|
||||
plugin_status ACTIVE
|
||||
plugin_type DAEMON
|
||||
plugin_library handlersocket.so
|
||||
plugin_library_version 1.8
|
||||
plugin_library_version 1.9
|
||||
plugin_author higuchi dot akira at dena dot jp
|
||||
plugin_description Direct access into InnoDB
|
||||
plugin_license BSD
|
||||
|
||||
@ -15,7 +15,7 @@ PLUGIN_STATUS ACTIVE
|
||||
PLUGIN_TYPE STORAGE ENGINE
|
||||
PLUGIN_TYPE_VERSION #
|
||||
PLUGIN_LIBRARY ha_example.so
|
||||
PLUGIN_LIBRARY_VERSION 1.8
|
||||
PLUGIN_LIBRARY_VERSION 1.9
|
||||
PLUGIN_AUTHOR Brian Aker, MySQL AB
|
||||
PLUGIN_DESCRIPTION Example storage engine
|
||||
PLUGIN_LICENSE GPL
|
||||
@ -28,7 +28,7 @@ PLUGIN_STATUS ACTIVE
|
||||
PLUGIN_TYPE DAEMON
|
||||
PLUGIN_TYPE_VERSION #
|
||||
PLUGIN_LIBRARY ha_example.so
|
||||
PLUGIN_LIBRARY_VERSION 1.8
|
||||
PLUGIN_LIBRARY_VERSION 1.9
|
||||
PLUGIN_AUTHOR Sergei Golubchik
|
||||
PLUGIN_DESCRIPTION Unusable Daemon
|
||||
PLUGIN_LICENSE GPL
|
||||
@ -67,7 +67,7 @@ PLUGIN_STATUS DELETED
|
||||
PLUGIN_TYPE STORAGE ENGINE
|
||||
PLUGIN_TYPE_VERSION #
|
||||
PLUGIN_LIBRARY ha_example.so
|
||||
PLUGIN_LIBRARY_VERSION 1.8
|
||||
PLUGIN_LIBRARY_VERSION 1.9
|
||||
PLUGIN_AUTHOR Brian Aker, MySQL AB
|
||||
PLUGIN_DESCRIPTION Example storage engine
|
||||
PLUGIN_LICENSE GPL
|
||||
|
||||
@ -4,8 +4,8 @@ Variable_name Value
|
||||
Opened_plugin_libraries 0
|
||||
select * from information_schema.all_plugins where plugin_library='ha_example.so';
|
||||
PLUGIN_NAME PLUGIN_VERSION PLUGIN_STATUS PLUGIN_TYPE PLUGIN_TYPE_VERSION PLUGIN_LIBRARY PLUGIN_LIBRARY_VERSION PLUGIN_AUTHOR PLUGIN_DESCRIPTION PLUGIN_LICENSE LOAD_OPTION PLUGIN_MATURITY PLUGIN_AUTH_VERSION
|
||||
EXAMPLE 0.1 NOT INSTALLED STORAGE ENGINE MYSQL_VERSION_ID ha_example.so 1.8 Brian Aker, MySQL AB Example storage engine GPL OFF Experimental 0.1
|
||||
UNUSABLE 3.14 NOT INSTALLED DAEMON MYSQL_VERSION_ID ha_example.so 1.8 Sergei Golubchik Unusable Daemon GPL OFF Experimental 3.14.15.926
|
||||
EXAMPLE 0.1 NOT INSTALLED STORAGE ENGINE MYSQL_VERSION_ID ha_example.so 1.9 Brian Aker, MySQL AB Example storage engine GPL OFF Experimental 0.1
|
||||
UNUSABLE 3.14 NOT INSTALLED DAEMON MYSQL_VERSION_ID ha_example.so 1.9 Sergei Golubchik Unusable Daemon GPL OFF Experimental 3.14.15.926
|
||||
show status like '%libraries%';
|
||||
Variable_name Value
|
||||
Opened_plugin_libraries 1
|
||||
|
||||
@ -29,6 +29,8 @@ IF(WITH_WSREP AND NOT EMBEDDED_LIBRARY)
|
||||
wsrep_thd.cc
|
||||
)
|
||||
SET(WSREP_LIB wsrep)
|
||||
ELSE()
|
||||
SET(WSREP_SOURCES wsrep_dummy.cc)
|
||||
ENDIF()
|
||||
|
||||
INCLUDE_DIRECTORIES(
|
||||
|
||||
16
sql/mdl.cc
16
sql/mdl.cc
@ -1501,7 +1501,7 @@ void MDL_lock::Ticket_list::add_ticket(MDL_ticket *ticket)
|
||||
DBUG_ASSERT(ticket->get_lock());
|
||||
#ifdef WITH_WSREP
|
||||
if ((this == &(ticket->get_lock()->m_waiting)) &&
|
||||
wsrep_thd_is_BF((void *)(ticket->get_ctx()->get_thd()), false))
|
||||
wsrep_thd_is_BF(ticket->get_ctx()->get_thd(), false))
|
||||
{
|
||||
Ticket_iterator itw(ticket->get_lock()->m_waiting);
|
||||
Ticket_iterator itg(ticket->get_lock()->m_granted);
|
||||
@ -1513,10 +1513,10 @@ void MDL_lock::Ticket_list::add_ticket(MDL_ticket *ticket)
|
||||
|
||||
while ((waiting= itw++) && !added)
|
||||
{
|
||||
if (!wsrep_thd_is_BF((void *)(waiting->get_ctx()->get_thd()), true))
|
||||
if (!wsrep_thd_is_BF(waiting->get_ctx()->get_thd(), true))
|
||||
{
|
||||
WSREP_DEBUG("MDL add_ticket inserted before: %lu %s",
|
||||
wsrep_thd_thread_id(waiting->get_ctx()->get_thd()),
|
||||
thd_get_thread_id(waiting->get_ctx()->get_thd()),
|
||||
wsrep_thd_query(waiting->get_ctx()->get_thd()));
|
||||
m_list.insert_after(prev, ticket);
|
||||
added= true;
|
||||
@ -1911,11 +1911,11 @@ MDL_lock::can_grant_lock(enum_mdl_type type_arg,
|
||||
ticket->is_incompatible_when_granted(type_arg))
|
||||
{
|
||||
#ifdef WITH_WSREP
|
||||
if (wsrep_thd_is_BF((void *)(requestor_ctx->get_thd()),false) &&
|
||||
if (wsrep_thd_is_BF(requestor_ctx->get_thd(),false) &&
|
||||
key.mdl_namespace() == MDL_key::GLOBAL)
|
||||
{
|
||||
WSREP_DEBUG("global lock granted for BF: %lu %s",
|
||||
wsrep_thd_thread_id(requestor_ctx->get_thd()),
|
||||
thd_get_thread_id(requestor_ctx->get_thd()),
|
||||
wsrep_thd_query(requestor_ctx->get_thd()));
|
||||
can_grant = true;
|
||||
}
|
||||
@ -1945,12 +1945,12 @@ MDL_lock::can_grant_lock(enum_mdl_type type_arg,
|
||||
}
|
||||
else
|
||||
{
|
||||
if (wsrep_thd_is_BF((void *)(requestor_ctx->get_thd()), false) &&
|
||||
if (wsrep_thd_is_BF(requestor_ctx->get_thd(), false) &&
|
||||
key.mdl_namespace() == MDL_key::GLOBAL)
|
||||
{
|
||||
WSREP_DEBUG("global lock granted for BF (waiting queue): %lu %s",
|
||||
wsrep_thd_thread_id(requestor_ctx->get_thd()),
|
||||
wsrep_thd_query(requestor_ctx->get_thd()));
|
||||
thd_get_thread_id(requestor_ctx->get_thd()),
|
||||
wsrep_thd_query(requestor_ctx->get_thd()));
|
||||
can_grant = true;
|
||||
}
|
||||
}
|
||||
|
||||
@ -9019,7 +9019,7 @@ bool mysql_notify_thread_having_shared_lock(THD *thd, THD *in_use,
|
||||
if (!thd_table->needs_reopen())
|
||||
{
|
||||
signalled|= mysql_lock_abort_for_thread(thd, thd_table);
|
||||
if (thd && WSREP(thd) && wsrep_thd_is_BF((void *)thd, true))
|
||||
if (thd && WSREP(thd) && wsrep_thd_is_BF(thd, true))
|
||||
{
|
||||
WSREP_DEBUG("remove_table_from_cache: %llu",
|
||||
(unsigned long long) thd->real_id);
|
||||
|
||||
@ -1949,7 +1949,7 @@ bool THD::notify_shared_lock(MDL_context_owner *ctx_in_use,
|
||||
if (!thd_table->needs_reopen())
|
||||
{
|
||||
signalled|= mysql_lock_abort_for_thread(this, thd_table);
|
||||
if (this && WSREP(this) && wsrep_thd_is_BF((void *)this, FALSE))
|
||||
if (this && WSREP(this) && wsrep_thd_is_BF(this, FALSE))
|
||||
{
|
||||
WSREP_DEBUG("remove_table_from_cache: %llu",
|
||||
(unsigned long long) this->real_id);
|
||||
|
||||
@ -16,6 +16,7 @@
|
||||
|
||||
/* support for Services */
|
||||
#include <service_versions.h>
|
||||
#include <mysql/service_wsrep.h>
|
||||
|
||||
struct st_service_ref {
|
||||
const char *name;
|
||||
@ -99,6 +100,45 @@ static struct thd_error_context_service_st thd_error_conext_handler= {
|
||||
thd_get_error_context_description
|
||||
};
|
||||
|
||||
static struct wsrep_service_st wsrep_handler = {
|
||||
get_wsrep,
|
||||
get_wsrep_certify_nonPK,
|
||||
get_wsrep_debug,
|
||||
get_wsrep_drupal_282555_workaround,
|
||||
get_wsrep_load_data_splitting,
|
||||
get_wsrep_log_conflicts,
|
||||
get_wsrep_protocol_version,
|
||||
wsrep_aborting_thd_contains,
|
||||
wsrep_aborting_thd_enqueue,
|
||||
wsrep_consistency_check,
|
||||
wsrep_is_wsrep_xid,
|
||||
wsrep_lock_rollback,
|
||||
wsrep_on,
|
||||
wsrep_post_commit,
|
||||
wsrep_prepare_key,
|
||||
wsrep_run_wsrep_commit,
|
||||
wsrep_thd_LOCK,
|
||||
wsrep_thd_UNLOCK,
|
||||
wsrep_thd_awake,
|
||||
wsrep_thd_conflict_state,
|
||||
wsrep_thd_conflict_state_str,
|
||||
wsrep_thd_exec_mode,
|
||||
wsrep_thd_exec_mode_str,
|
||||
wsrep_thd_get_conflict_state,
|
||||
wsrep_thd_is_BF,
|
||||
wsrep_thd_is_wsrep,
|
||||
wsrep_thd_query,
|
||||
wsrep_thd_query_state,
|
||||
wsrep_thd_query_state_str,
|
||||
wsrep_thd_retry_counter,
|
||||
wsrep_thd_set_conflict_state,
|
||||
wsrep_thd_trx_seqno,
|
||||
wsrep_thd_ws_handle,
|
||||
wsrep_trx_is_aborting,
|
||||
wsrep_trx_order_before,
|
||||
wsrep_unlock_rollback
|
||||
};
|
||||
|
||||
static struct st_service_ref list_of_services[]=
|
||||
{
|
||||
{ "my_snprintf_service", VERSION_my_snprintf, &my_snprintf_handler },
|
||||
@ -112,6 +152,7 @@ static struct st_service_ref list_of_services[]=
|
||||
{ "my_md5_service", VERSION_my_md5, &my_md5_handler},
|
||||
{ "logger_service", VERSION_logger, &logger_service_handler },
|
||||
{ "thd_autoinc_service", VERSION_thd_autoinc, &thd_autoinc_handler },
|
||||
{ "wsrep_service", VERSION_wsrep, &wsrep_handler },
|
||||
{ "thd_error_context_service", VERSION_thd_error_context, &thd_error_conext_handler },
|
||||
};
|
||||
|
||||
|
||||
126
sql/wsrep_dummy.cc
Normal file
126
sql/wsrep_dummy.cc
Normal file
@ -0,0 +1,126 @@
|
||||
/* Copyright (C) 2014 SkySQL Ab.
|
||||
|
||||
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 Street, Fifth Floor, Boston, MA 02110-1301 USA. */
|
||||
|
||||
#include <my_global.h>
|
||||
#include <sql_class.h>
|
||||
#include <mysql/service_wsrep.h>
|
||||
|
||||
my_bool wsrep_thd_is_BF(THD *, my_bool)
|
||||
{ return 0; }
|
||||
|
||||
int wsrep_trx_order_before(THD *, THD *)
|
||||
{ return 0; }
|
||||
|
||||
enum wsrep_conflict_state wsrep_thd_conflict_state(THD *, my_bool)
|
||||
{ return NO_CONFLICT; }
|
||||
|
||||
int wsrep_is_wsrep_xid(const XID*)
|
||||
{ return 0; }
|
||||
|
||||
bool wsrep_prepare_key(const uchar*, size_t, const uchar*, size_t, struct wsrep_buf*, size_t*)
|
||||
{ return 0; }
|
||||
|
||||
struct wsrep *get_wsrep()
|
||||
{ return 0; }
|
||||
|
||||
my_bool get_wsrep_certify_nonPK()
|
||||
{ return 0; }
|
||||
|
||||
my_bool get_wsrep_debug()
|
||||
{ return 0; }
|
||||
|
||||
my_bool get_wsrep_drupal_282555_workaround()
|
||||
{ return 0; }
|
||||
|
||||
my_bool get_wsrep_load_data_splitting()
|
||||
{ return 0; }
|
||||
|
||||
my_bool get_wsrep_log_conflicts()
|
||||
{ return 0; }
|
||||
|
||||
long get_wsrep_protocol_version()
|
||||
{ return 0; }
|
||||
|
||||
my_bool wsrep_aborting_thd_contains(THD *)
|
||||
{ return 0; }
|
||||
|
||||
void wsrep_aborting_thd_enqueue(THD *)
|
||||
{ }
|
||||
|
||||
bool wsrep_consistency_check(THD *)
|
||||
{ return 0; }
|
||||
|
||||
void wsrep_lock_rollback()
|
||||
{ }
|
||||
|
||||
int wsrep_on(THD *thd)
|
||||
{ return 0; }
|
||||
|
||||
void wsrep_post_commit(THD*, bool)
|
||||
{ }
|
||||
|
||||
enum wsrep_trx_status wsrep_run_wsrep_commit(THD *, handlerton *, bool)
|
||||
{ return WSREP_TRX_ERROR; }
|
||||
|
||||
void wsrep_thd_LOCK(THD *)
|
||||
{ }
|
||||
|
||||
void wsrep_thd_UNLOCK(THD *)
|
||||
{ }
|
||||
|
||||
void wsrep_thd_awake(THD *, my_bool)
|
||||
{ }
|
||||
|
||||
const char *wsrep_thd_conflict_state_str(THD *)
|
||||
{ return 0; }
|
||||
|
||||
enum wsrep_exec_mode wsrep_thd_exec_mode(THD *)
|
||||
{ return LOCAL_STATE; }
|
||||
|
||||
const char *wsrep_thd_exec_mode_str(THD *)
|
||||
{ return NULL; }
|
||||
|
||||
enum wsrep_conflict_state wsrep_thd_get_conflict_state(THD *)
|
||||
{ return NO_CONFLICT; }
|
||||
|
||||
my_bool wsrep_thd_is_wsrep(THD *)
|
||||
{ return 0; }
|
||||
|
||||
char *wsrep_thd_query(THD *)
|
||||
{ return 0; }
|
||||
|
||||
enum wsrep_query_state wsrep_thd_query_state(THD *)
|
||||
{ return QUERY_IDLE; }
|
||||
|
||||
const char *wsrep_thd_query_state_str(THD *)
|
||||
{ return 0; }
|
||||
|
||||
int wsrep_thd_retry_counter(THD *)
|
||||
{ return 0; }
|
||||
|
||||
void wsrep_thd_set_conflict_state(THD *, enum wsrep_conflict_state)
|
||||
{ }
|
||||
|
||||
longlong wsrep_thd_trx_seqno(THD *)
|
||||
{ return -1; }
|
||||
|
||||
struct wsrep_ws_handle* wsrep_thd_ws_handle(THD *)
|
||||
{ return 0; }
|
||||
|
||||
int wsrep_trx_is_aborting(THD *)
|
||||
{ return 0; }
|
||||
|
||||
void wsrep_unlock_rollback()
|
||||
{ }
|
||||
@ -782,14 +782,15 @@ int wsrep_init()
|
||||
return rcode;
|
||||
}
|
||||
|
||||
extern int wsrep_on(void *);
|
||||
|
||||
void wsrep_init_startup (bool first)
|
||||
{
|
||||
if (wsrep_init()) unireg_abort(1);
|
||||
|
||||
wsrep_thr_lock_init(wsrep_thd_is_BF, wsrep_abort_thd,
|
||||
wsrep_debug, wsrep_convert_LOCK_to_trx, wsrep_on);
|
||||
wsrep_thr_lock_init(
|
||||
(wsrep_thd_is_brute_force_fun)wsrep_thd_is_BF,
|
||||
(wsrep_abort_thd_fun)wsrep_abort_thd,
|
||||
wsrep_debug, wsrep_convert_LOCK_to_trx,
|
||||
(wsrep_on_fun)wsrep_on);
|
||||
|
||||
/* Skip replication start if no cluster address */
|
||||
if (!wsrep_cluster_address || strlen(wsrep_cluster_address) == 0) return;
|
||||
@ -1187,12 +1188,9 @@ err:
|
||||
}
|
||||
|
||||
|
||||
bool wsrep_prepare_key_for_innodb(const uchar* cache_key,
|
||||
size_t cache_key_len,
|
||||
const uchar* row_id,
|
||||
size_t row_id_len,
|
||||
wsrep_buf_t* key,
|
||||
size_t* key_len)
|
||||
bool wsrep_prepare_key(const uchar* cache_key, size_t cache_key_len,
|
||||
const uchar* row_id, size_t row_id_len,
|
||||
wsrep_buf_t* key, size_t* key_len)
|
||||
{
|
||||
if (*key_len < 3) return false;
|
||||
|
||||
@ -2112,9 +2110,9 @@ int wsrep_create_sp(THD *thd, uchar** buf, size_t* buf_len)
|
||||
}
|
||||
|
||||
|
||||
extern int wsrep_on(void *thd)
|
||||
extern int wsrep_on(THD *thd)
|
||||
{
|
||||
return (int)(WSREP(((THD*)thd)));
|
||||
return (int)(WSREP(thd));
|
||||
}
|
||||
|
||||
|
||||
@ -2124,9 +2122,9 @@ extern "C" bool wsrep_thd_is_wsrep_on(THD *thd)
|
||||
}
|
||||
|
||||
|
||||
extern "C" bool wsrep_consistency_check(void *thd)
|
||||
bool wsrep_consistency_check(THD *thd)
|
||||
{
|
||||
return ((THD*)thd)->wsrep_consistency_check == CONSISTENCY_CHECK_RUNNING;
|
||||
return thd->wsrep_consistency_check == CONSISTENCY_CHECK_RUNNING;
|
||||
}
|
||||
|
||||
|
||||
@ -2143,20 +2141,19 @@ extern "C" void wsrep_thd_set_query_state(
|
||||
}
|
||||
|
||||
|
||||
extern "C" void wsrep_thd_set_conflict_state(
|
||||
THD *thd, enum wsrep_conflict_state state)
|
||||
void wsrep_thd_set_conflict_state(THD *thd, enum wsrep_conflict_state state)
|
||||
{
|
||||
thd->wsrep_conflict_state= state;
|
||||
}
|
||||
|
||||
|
||||
extern "C" enum wsrep_exec_mode wsrep_thd_exec_mode(THD *thd)
|
||||
enum wsrep_exec_mode wsrep_thd_exec_mode(THD *thd)
|
||||
{
|
||||
return thd->wsrep_exec_mode;
|
||||
}
|
||||
|
||||
|
||||
extern "C" const char *wsrep_thd_exec_mode_str(THD *thd)
|
||||
const char *wsrep_thd_exec_mode_str(THD *thd)
|
||||
{
|
||||
return
|
||||
(!thd) ? "void" :
|
||||
@ -2167,13 +2164,13 @@ extern "C" const char *wsrep_thd_exec_mode_str(THD *thd)
|
||||
}
|
||||
|
||||
|
||||
extern "C" enum wsrep_query_state wsrep_thd_query_state(THD *thd)
|
||||
enum wsrep_query_state wsrep_thd_query_state(THD *thd)
|
||||
{
|
||||
return thd->wsrep_query_state;
|
||||
}
|
||||
|
||||
|
||||
extern "C" const char *wsrep_thd_query_state_str(THD *thd)
|
||||
const char *wsrep_thd_query_state_str(THD *thd)
|
||||
{
|
||||
return
|
||||
(!thd) ? "void" :
|
||||
@ -2185,13 +2182,13 @@ extern "C" const char *wsrep_thd_query_state_str(THD *thd)
|
||||
}
|
||||
|
||||
|
||||
extern "C" enum wsrep_conflict_state wsrep_thd_conflict_state(THD *thd)
|
||||
enum wsrep_conflict_state wsrep_thd_get_conflict_state(THD *thd)
|
||||
{
|
||||
return thd->wsrep_conflict_state;
|
||||
}
|
||||
|
||||
|
||||
extern "C" const char *wsrep_thd_conflict_state_str(THD *thd)
|
||||
const char *wsrep_thd_conflict_state_str(THD *thd)
|
||||
{
|
||||
return
|
||||
(!thd) ? "void" :
|
||||
@ -2205,19 +2202,19 @@ extern "C" const char *wsrep_thd_conflict_state_str(THD *thd)
|
||||
}
|
||||
|
||||
|
||||
extern "C" wsrep_ws_handle_t* wsrep_thd_ws_handle(THD *thd)
|
||||
wsrep_ws_handle_t* wsrep_thd_ws_handle(THD *thd)
|
||||
{
|
||||
return &thd->wsrep_ws_handle;
|
||||
}
|
||||
|
||||
|
||||
extern "C" void wsrep_thd_LOCK(THD *thd)
|
||||
void wsrep_thd_LOCK(THD *thd)
|
||||
{
|
||||
mysql_mutex_lock(&thd->LOCK_wsrep_thd);
|
||||
}
|
||||
|
||||
|
||||
extern "C" void wsrep_thd_UNLOCK(THD *thd)
|
||||
void wsrep_thd_UNLOCK(THD *thd)
|
||||
{
|
||||
mysql_mutex_unlock(&thd->LOCK_wsrep_thd);
|
||||
}
|
||||
@ -2234,14 +2231,7 @@ extern "C" uint32 wsrep_thd_wsrep_rand(THD *thd)
|
||||
return thd->wsrep_rand;
|
||||
}
|
||||
|
||||
|
||||
extern "C" my_thread_id wsrep_thd_thread_id(THD *thd)
|
||||
{
|
||||
return thd->thread_id;
|
||||
}
|
||||
|
||||
|
||||
extern "C" wsrep_seqno_t wsrep_thd_trx_seqno(THD *thd)
|
||||
longlong wsrep_thd_trx_seqno(THD *thd)
|
||||
{
|
||||
return (thd) ? thd->wsrep_trx_meta.gtid.seqno : WSREP_SEQNO_UNDEFINED;
|
||||
}
|
||||
@ -2253,7 +2243,7 @@ extern "C" query_id_t wsrep_thd_query_id(THD *thd)
|
||||
}
|
||||
|
||||
|
||||
extern "C" char *wsrep_thd_query(THD *thd)
|
||||
char *wsrep_thd_query(THD *thd)
|
||||
{
|
||||
return (thd) ? thd->query() : NULL;
|
||||
}
|
||||
@ -2288,30 +2278,29 @@ extern "C" void wsrep_thd_awake(THD *thd, my_bool signal)
|
||||
}
|
||||
|
||||
|
||||
extern "C" int wsrep_thd_retry_counter(THD *thd)
|
||||
int wsrep_thd_retry_counter(THD *thd)
|
||||
{
|
||||
return(thd->wsrep_retry_counter);
|
||||
}
|
||||
|
||||
|
||||
extern int
|
||||
wsrep_trx_order_before(void *thd1, void *thd2)
|
||||
wsrep_trx_order_before(THD *thd1, THD *thd2)
|
||||
{
|
||||
if (wsrep_thd_trx_seqno((THD*)thd1) < wsrep_thd_trx_seqno((THD*)thd2)) {
|
||||
if (wsrep_thd_trx_seqno(thd1) < wsrep_thd_trx_seqno(thd2)) {
|
||||
WSREP_DEBUG("BF conflict, order: %lld %lld\n",
|
||||
(long long)wsrep_thd_trx_seqno((THD*)thd1),
|
||||
(long long)wsrep_thd_trx_seqno((THD*)thd2));
|
||||
(long long)wsrep_thd_trx_seqno(thd1),
|
||||
(long long)wsrep_thd_trx_seqno(thd2));
|
||||
return 1;
|
||||
}
|
||||
WSREP_DEBUG("waiting for BF, trx order: %lld %lld\n",
|
||||
(long long)wsrep_thd_trx_seqno((THD*)thd1),
|
||||
(long long)wsrep_thd_trx_seqno((THD*)thd2));
|
||||
(long long)wsrep_thd_trx_seqno(thd1),
|
||||
(long long)wsrep_thd_trx_seqno(thd2));
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
extern "C" int
|
||||
wsrep_trx_is_aborting(void *thd_ptr)
|
||||
int wsrep_trx_is_aborting(THD *thd_ptr)
|
||||
{
|
||||
if (thd_ptr) {
|
||||
if ((((THD *)thd_ptr)->wsrep_conflict_state == MUST_ABORT) ||
|
||||
@ -2456,3 +2445,72 @@ int wsrep_create_trigger_query(THD *thd, uchar** buf, size_t* buf_len)
|
||||
return wsrep_to_buf_helper(thd, stmt_query.c_ptr(), stmt_query.length(),
|
||||
buf, buf_len);
|
||||
}
|
||||
|
||||
/***** callbacks for wsrep service ************/
|
||||
|
||||
my_bool get_wsrep_debug()
|
||||
{
|
||||
return wsrep_debug;
|
||||
}
|
||||
|
||||
my_bool get_wsrep_load_data_splitting()
|
||||
{
|
||||
return wsrep_load_data_splitting;
|
||||
}
|
||||
|
||||
long get_wsrep_protocol_version()
|
||||
{
|
||||
return wsrep_protocol_version;
|
||||
}
|
||||
|
||||
my_bool get_wsrep_drupal_282555_workaround()
|
||||
{
|
||||
return wsrep_drupal_282555_workaround;
|
||||
}
|
||||
|
||||
my_bool get_wsrep_log_conflicts()
|
||||
{
|
||||
return wsrep_log_conflicts;
|
||||
}
|
||||
|
||||
wsrep_t *get_wsrep()
|
||||
{
|
||||
return wsrep;
|
||||
}
|
||||
|
||||
my_bool get_wsrep_certify_nonPK()
|
||||
{
|
||||
return wsrep_certify_nonPK;
|
||||
}
|
||||
|
||||
void wsrep_lock_rollback()
|
||||
{
|
||||
mysql_mutex_lock(&LOCK_wsrep_rollback);
|
||||
}
|
||||
|
||||
void wsrep_unlock_rollback()
|
||||
{
|
||||
mysql_cond_signal(&COND_wsrep_rollback);
|
||||
mysql_mutex_unlock(&LOCK_wsrep_rollback);
|
||||
}
|
||||
|
||||
my_bool wsrep_aborting_thd_contains(THD *thd)
|
||||
{
|
||||
wsrep_aborting_thd_t abortees = wsrep_aborting_thd;
|
||||
while (abortees)
|
||||
{
|
||||
if (abortees->aborting_thd == thd)
|
||||
return true;
|
||||
abortees = abortees->next;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void wsrep_aborting_thd_enqueue(THD *thd)
|
||||
{
|
||||
wsrep_aborting_thd_t aborting = (wsrep_aborting_thd_t)
|
||||
my_malloc(sizeof(struct wsrep_aborting_thd), MYF(0));
|
||||
aborting->aborting_thd = thd;
|
||||
aborting->next = wsrep_aborting_thd;
|
||||
wsrep_aborting_thd = aborting;
|
||||
}
|
||||
|
||||
@ -18,6 +18,9 @@
|
||||
#ifndef WSREP_MYSQLD_H
|
||||
#define WSREP_MYSQLD_H
|
||||
|
||||
#include <mysql/plugin.h>
|
||||
#include <mysql/service_wsrep.h>
|
||||
|
||||
#ifdef WITH_WSREP
|
||||
|
||||
typedef struct st_mysql_show_var SHOW_VAR;
|
||||
@ -33,32 +36,6 @@ typedef struct st_mysql_show_var SHOW_VAR;
|
||||
class set_var;
|
||||
class THD;
|
||||
|
||||
enum wsrep_exec_mode {
|
||||
LOCAL_STATE,
|
||||
REPL_RECV,
|
||||
TOTAL_ORDER,
|
||||
LOCAL_COMMIT
|
||||
};
|
||||
|
||||
enum wsrep_query_state {
|
||||
QUERY_IDLE,
|
||||
QUERY_EXEC,
|
||||
QUERY_COMMITTING,
|
||||
QUERY_EXITING,
|
||||
QUERY_ROLLINGBACK,
|
||||
};
|
||||
|
||||
enum wsrep_conflict_state {
|
||||
NO_CONFLICT,
|
||||
MUST_ABORT,
|
||||
ABORTING,
|
||||
ABORTED,
|
||||
MUST_REPLAY,
|
||||
REPLAYING,
|
||||
RETRY_AUTOCOMMIT,
|
||||
CERT_FAILURE,
|
||||
};
|
||||
|
||||
enum wsrep_consistency_check_mode {
|
||||
NO_CONSISTENCY_CHECK,
|
||||
CONSISTENCY_CHECK_DECLARED,
|
||||
@ -90,27 +67,21 @@ extern const char* wsrep_data_home_dir;
|
||||
extern const char* wsrep_dbug_option;
|
||||
extern long wsrep_slave_threads;
|
||||
extern int wsrep_slave_count_change;
|
||||
extern MYSQL_PLUGIN_IMPORT my_bool wsrep_debug;
|
||||
extern my_bool wsrep_convert_LOCK_to_trx;
|
||||
extern ulong wsrep_retry_autocommit;
|
||||
extern my_bool wsrep_auto_increment_control;
|
||||
extern my_bool wsrep_drupal_282555_workaround;
|
||||
extern my_bool wsrep_incremental_data_collection;
|
||||
extern const char* wsrep_start_position;
|
||||
extern ulong wsrep_max_ws_size;
|
||||
extern ulong wsrep_max_ws_rows;
|
||||
extern const char* wsrep_notify_cmd;
|
||||
extern my_bool wsrep_certify_nonPK;
|
||||
extern long wsrep_max_protocol_version;
|
||||
extern long wsrep_protocol_version;
|
||||
extern ulong wsrep_forced_binlog_format;
|
||||
extern ulong wsrep_OSU_method_options;
|
||||
extern my_bool wsrep_desync;
|
||||
extern my_bool wsrep_recovery;
|
||||
extern my_bool wsrep_replicate_myisam;
|
||||
extern my_bool wsrep_log_conflicts;
|
||||
extern ulong wsrep_mysql_replication_bundle;
|
||||
extern my_bool wsrep_load_data_splitting;
|
||||
extern my_bool wsrep_restart_slave;
|
||||
extern my_bool wsrep_restart_slave_activated;
|
||||
extern my_bool wsrep_slave_FK_checks;
|
||||
@ -157,34 +128,18 @@ void wsrep_init_startup(bool before);
|
||||
// Other wsrep global variables
|
||||
extern my_bool wsrep_inited; // whether wsrep is initialized ?
|
||||
|
||||
extern "C" enum wsrep_exec_mode wsrep_thd_exec_mode(THD *thd);
|
||||
extern "C" enum wsrep_conflict_state wsrep_thd_conflict_state(THD *thd);
|
||||
extern "C" enum wsrep_query_state wsrep_thd_query_state(THD *thd);
|
||||
extern "C" const char * wsrep_thd_exec_mode_str(THD *thd);
|
||||
extern "C" const char * wsrep_thd_conflict_state_str(THD *thd);
|
||||
extern "C" const char * wsrep_thd_query_state_str(THD *thd);
|
||||
extern "C" wsrep_ws_handle_t* wsrep_thd_ws_handle(THD *thd);
|
||||
|
||||
extern "C" void wsrep_thd_set_exec_mode(THD *thd, enum wsrep_exec_mode mode);
|
||||
extern "C" void wsrep_thd_set_query_state(
|
||||
THD *thd, enum wsrep_query_state state);
|
||||
extern "C" void wsrep_thd_set_conflict_state(
|
||||
THD *thd, enum wsrep_conflict_state state);
|
||||
|
||||
extern "C" void wsrep_thd_set_trx_to_replay(THD *thd, uint64 trx_id);
|
||||
|
||||
extern "C" void wsrep_thd_LOCK(THD *thd);
|
||||
extern "C" void wsrep_thd_UNLOCK(THD *thd);
|
||||
extern "C" uint32 wsrep_thd_wsrep_rand(THD *thd);
|
||||
extern "C" time_t wsrep_thd_query_start(THD *thd);
|
||||
extern "C" my_thread_id wsrep_thd_thread_id(THD *thd);
|
||||
extern "C" int64_t wsrep_thd_trx_seqno(THD *thd);
|
||||
extern "C" query_id_t wsrep_thd_query_id(THD *thd);
|
||||
extern "C" char * wsrep_thd_query(THD *thd);
|
||||
extern "C" query_id_t wsrep_thd_wsrep_last_query_id(THD *thd);
|
||||
extern "C" void wsrep_thd_set_wsrep_last_query_id(THD *thd, query_id_t id);
|
||||
extern "C" void wsrep_thd_awake(THD *thd, my_bool signal);
|
||||
extern "C" int wsrep_thd_retry_counter(THD *thd);
|
||||
|
||||
|
||||
extern void wsrep_close_client_connections(my_bool wait_to_end);
|
||||
@ -231,7 +186,7 @@ extern wsrep_seqno_t wsrep_locked_seqno;
|
||||
"%s: \n " \
|
||||
" THD: %lu, mode: %s, state: %s, conflict: %s, seqno: %lld\n " \
|
||||
" SQL: %s", \
|
||||
role, wsrep_thd_thread_id(thd), wsrep_thd_exec_mode_str(thd), \
|
||||
role, thd_get_thread_id(thd), wsrep_thd_exec_mode_str(thd), \
|
||||
wsrep_thd_query_state_str(thd), \
|
||||
wsrep_thd_conflict_state_str(thd), (long long)wsrep_thd_trx_seqno(thd), \
|
||||
wsrep_thd_query(thd) \
|
||||
@ -252,24 +207,12 @@ extern wsrep_seqno_t wsrep_locked_seqno;
|
||||
|
||||
extern void wsrep_ready_wait();
|
||||
|
||||
enum wsrep_trx_status {
|
||||
WSREP_TRX_OK,
|
||||
WSREP_TRX_CERT_FAIL, /* certification failure, must abort */
|
||||
WSREP_TRX_SIZE_EXCEEDED, /* trx size exceeded */
|
||||
WSREP_TRX_ERROR, /* native mysql error */
|
||||
};
|
||||
|
||||
extern enum wsrep_trx_status
|
||||
wsrep_run_wsrep_commit(THD *thd, handlerton *hton, bool all);
|
||||
class Ha_trx_info;
|
||||
struct THD_TRANS;
|
||||
void wsrep_register_hton(THD* thd, bool all);
|
||||
void wsrep_post_commit(THD* thd, bool all);
|
||||
void wsrep_brute_force_killer(THD *thd);
|
||||
int wsrep_hire_brute_force_killer(THD *thd, uint64_t trx_id);
|
||||
|
||||
extern "C" bool wsrep_consistency_check(void *thd_ptr);
|
||||
|
||||
/* this is visible for client build so that innodb plugin gets this */
|
||||
typedef struct wsrep_aborting_thd {
|
||||
struct wsrep_aborting_thd *next;
|
||||
@ -335,10 +278,6 @@ void wsrep_init_sidno(const wsrep_uuid_t&);
|
||||
void wsrep_xid_init(xid_t*, const wsrep_uuid_t*, wsrep_seqno_t);
|
||||
const wsrep_uuid_t* wsrep_xid_uuid(const xid_t*);
|
||||
wsrep_seqno_t wsrep_xid_seqno(const xid_t*);
|
||||
extern "C" int wsrep_is_wsrep_xid(const void* xid);
|
||||
|
||||
extern "C" my_thread_id wsrep_thd_thread_id(THD *thd);
|
||||
extern "C" char *wsrep_thd_query(THD *thd);
|
||||
|
||||
extern bool
|
||||
wsrep_grant_mdl_exception(MDL_context *requestor_ctx,
|
||||
@ -375,7 +314,6 @@ int wsrep_create_trigger_query(THD *thd, uchar** buf, size_t* buf_len);
|
||||
#define WSREP_CLIENT(thd) (0)
|
||||
#define wsrep_emulate_bin_log (0)
|
||||
#define wsrep_xid_seqno(X) (0)
|
||||
#define wsrep_is_wsrep_xid(X) (0)
|
||||
#define wsrep_to_isolation (0)
|
||||
#define wsrep_recovery (0)
|
||||
#define wsrep_init() (1)
|
||||
@ -385,7 +323,6 @@ int wsrep_create_trigger_query(THD *thd, uchar** buf, size_t* buf_len);
|
||||
#define wsrep_sync_wait(...) (0)
|
||||
#define wsrep_to_isolation_begin(...) (0)
|
||||
#define wsrep_register_hton(...) do { } while(0)
|
||||
#define wsrep_post_commit(...) do { } while(0)
|
||||
#define wsrep_check_opts() (0)
|
||||
#define wsrep_stop_replication(X) do { } while(0)
|
||||
#define wsrep_inited (0)
|
||||
|
||||
@ -491,12 +491,11 @@ void wsrep_thd_set_PA_safe(void *thd_ptr, my_bool safe)
|
||||
}
|
||||
}
|
||||
|
||||
int wsrep_thd_conflict_state(void *thd_ptr, my_bool sync)
|
||||
enum wsrep_conflict_state wsrep_thd_conflict_state(THD *thd, my_bool sync)
|
||||
{
|
||||
int state = -1;
|
||||
if (thd_ptr)
|
||||
enum wsrep_conflict_state state = NO_CONFLICT;
|
||||
if (thd)
|
||||
{
|
||||
THD* thd = (THD*)thd_ptr;
|
||||
if (sync) mysql_mutex_lock(&thd->LOCK_wsrep_thd);
|
||||
|
||||
state = thd->wsrep_conflict_state;
|
||||
@ -505,26 +504,23 @@ int wsrep_thd_conflict_state(void *thd_ptr, my_bool sync)
|
||||
return state;
|
||||
}
|
||||
|
||||
my_bool wsrep_thd_is_wsrep(void *thd_ptr)
|
||||
my_bool wsrep_thd_is_wsrep(THD *thd)
|
||||
{
|
||||
my_bool status = FALSE;
|
||||
if (thd_ptr)
|
||||
if (thd)
|
||||
{
|
||||
THD* thd = (THD*)thd_ptr;
|
||||
|
||||
status = (WSREP(thd) && WSREP_PROVIDER_EXISTS);
|
||||
}
|
||||
return status;
|
||||
}
|
||||
|
||||
my_bool wsrep_thd_is_BF(void *thd_ptr, my_bool sync)
|
||||
my_bool wsrep_thd_is_BF(THD *thd, my_bool sync)
|
||||
{
|
||||
my_bool status = FALSE;
|
||||
if (thd_ptr)
|
||||
if (thd)
|
||||
{
|
||||
THD* thd = (THD*)thd_ptr;
|
||||
// THD can be BF only if provider exists
|
||||
if (wsrep_thd_is_wsrep(thd_ptr))
|
||||
if (wsrep_thd_is_wsrep(thd))
|
||||
{
|
||||
if (sync)
|
||||
mysql_mutex_lock(&thd->LOCK_wsrep_thd);
|
||||
|
||||
@ -32,11 +32,10 @@ int wsrep_abort_thd(void *bf_thd_ptr, void *victim_thd_ptr,
|
||||
my_bool signal);
|
||||
|
||||
extern void wsrep_thd_set_PA_safe(void *thd_ptr, my_bool safe);
|
||||
extern my_bool wsrep_thd_is_BF(void *thd_ptr, my_bool sync);
|
||||
extern my_bool wsrep_thd_is_BF(THD *thd, my_bool sync);
|
||||
extern my_bool wsrep_thd_is_wsrep(void *thd_ptr);
|
||||
|
||||
extern int wsrep_thd_conflict_state(void *thd_ptr, my_bool sync);
|
||||
//extern "C" my_bool wsrep_thd_is_BF(void *thd_ptr, my_bool sync);
|
||||
enum wsrep_conflict_state wsrep_thd_conflict_state(void *thd_ptr, my_bool sync);
|
||||
extern "C" my_bool wsrep_thd_is_BF_or_commit(void *thd_ptr, my_bool sync);
|
||||
extern "C" my_bool wsrep_thd_is_local(void *thd_ptr, my_bool sync);
|
||||
extern "C" int wsrep_thd_in_locking_session(void *thd_ptr);
|
||||
|
||||
@ -514,9 +514,8 @@ wsrep_seqno_t wsrep_xid_seqno(const XID* xid)
|
||||
}
|
||||
|
||||
extern
|
||||
int wsrep_is_wsrep_xid(const void* xid_ptr)
|
||||
int wsrep_is_wsrep_xid(const XID* xid)
|
||||
{
|
||||
const XID* xid= reinterpret_cast<const XID*>(xid_ptr);
|
||||
return (xid->formatID == 1 &&
|
||||
xid->gtrid_length == WSREP_XID_GTRID_LEN &&
|
||||
xid->bqual_length == 0 &&
|
||||
|
||||
@ -114,6 +114,9 @@ this program; if not, write to the Free Software Foundation, Inc.,
|
||||
#include "ha_innodb.h"
|
||||
#include "i_s.h"
|
||||
|
||||
#include <mysql/plugin.h>
|
||||
#include <mysql/service_wsrep.h>
|
||||
|
||||
# ifndef MYSQL_PLUGIN_IMPORT
|
||||
# define MYSQL_PLUGIN_IMPORT /* nothing */
|
||||
# endif /* MYSQL_PLUGIN_IMPORT */
|
||||
@ -121,17 +124,12 @@ this program; if not, write to the Free Software Foundation, Inc.,
|
||||
#ifdef WITH_WSREP
|
||||
#include "dict0priv.h"
|
||||
#include "../storage/innobase/include/ut0byte.h"
|
||||
#include <wsrep_mysqld.h>
|
||||
#include <mysql/service_md5.h>
|
||||
|
||||
extern my_bool wsrep_certify_nonPK;
|
||||
class binlog_trx_data;
|
||||
extern handlerton *binlog_hton;
|
||||
|
||||
extern MYSQL_PLUGIN_IMPORT MYSQL_BIN_LOG mysql_bin_log;
|
||||
extern MYSQL_PLUGIN_IMPORT mysql_mutex_t LOCK_wsrep_rollback;
|
||||
extern MYSQL_PLUGIN_IMPORT mysql_cond_t COND_wsrep_rollback;
|
||||
extern MYSQL_PLUGIN_IMPORT wsrep_aborting_thd_t wsrep_aborting_thd;
|
||||
|
||||
static inline wsrep_ws_handle_t*
|
||||
wsrep_ws_handle(THD* thd, const trx_t* trx) {
|
||||
@ -139,14 +137,6 @@ wsrep_ws_handle(THD* thd, const trx_t* trx) {
|
||||
(wsrep_trx_id_t)trx->id);
|
||||
}
|
||||
|
||||
extern bool wsrep_prepare_key_for_innodb(const uchar *cache_key,
|
||||
size_t cache_key_len,
|
||||
const uchar* row_id,
|
||||
size_t row_id_len,
|
||||
wsrep_buf_t* key,
|
||||
size_t* key_len);
|
||||
|
||||
extern handlerton * wsrep_hton;
|
||||
extern TC_LOG* tc_log;
|
||||
extern void wsrep_cleanup_transaction(THD *thd);
|
||||
static int
|
||||
@ -3702,7 +3692,7 @@ innobase_commit_low(
|
||||
#ifdef WITH_WSREP
|
||||
THD* thd = (THD*)trx->mysql_thd;
|
||||
const char* tmp = 0;
|
||||
if (wsrep_on((void*)thd)) {
|
||||
if (wsrep_on(thd)) {
|
||||
#ifdef WSREP_PROC_INFO
|
||||
char info[64];
|
||||
info[sizeof(info) - 1] = '\0';
|
||||
@ -3721,7 +3711,7 @@ innobase_commit_low(
|
||||
trx_commit_for_mysql(trx);
|
||||
}
|
||||
#ifdef WITH_WSREP
|
||||
if (wsrep_on((void*)thd)) { thd_proc_info(thd, tmp); }
|
||||
if (wsrep_on(thd)) { thd_proc_info(thd, tmp); }
|
||||
#endif /* WITH_WSREP */
|
||||
}
|
||||
|
||||
@ -4449,7 +4439,7 @@ innobase_kill_query(
|
||||
|
||||
#ifdef WITH_WSREP
|
||||
wsrep_thd_LOCK(thd);
|
||||
if (wsrep_thd_conflict_state(thd) != NO_CONFLICT) {
|
||||
if (wsrep_thd_get_conflict_state(thd) != NO_CONFLICT) {
|
||||
/* if victim has been signaled by BF thread and/or aborting
|
||||
is already progressing, following query aborting is not necessary
|
||||
any more.
|
||||
@ -7584,7 +7574,7 @@ no_commit:
|
||||
;
|
||||
} else if (src_table == prebuilt->table) {
|
||||
#ifdef WITH_WSREP
|
||||
switch (wsrep_run_wsrep_commit(user_thd, wsrep_hton, 1))
|
||||
switch (wsrep_run_wsrep_commit(user_thd, 0, 1))
|
||||
{
|
||||
case WSREP_TRX_OK:
|
||||
break;
|
||||
@ -7609,7 +7599,7 @@ no_commit:
|
||||
prebuilt->sql_stat_start = TRUE;
|
||||
} else {
|
||||
#ifdef WITH_WSREP
|
||||
switch (wsrep_run_wsrep_commit(user_thd, wsrep_hton, 1))
|
||||
switch (wsrep_run_wsrep_commit(user_thd, 0, 1))
|
||||
{
|
||||
case WSREP_TRX_OK:
|
||||
break;
|
||||
@ -9735,7 +9725,7 @@ wsrep_append_foreign_key(
|
||||
|
||||
wsrep_buf_t wkey_part[3];
|
||||
wsrep_key_t wkey = {wkey_part, 3};
|
||||
if (!wsrep_prepare_key_for_innodb(
|
||||
if (!wsrep_prepare_key(
|
||||
(const uchar*)cache_key,
|
||||
cache_key_len + 1,
|
||||
(const uchar*)key, len+1,
|
||||
@ -9746,6 +9736,7 @@ wsrep_append_foreign_key(
|
||||
wsrep_thd_query(thd) : "void");
|
||||
return DB_ERROR;
|
||||
}
|
||||
wsrep_t *wsrep= get_wsrep();
|
||||
rcode = (int)wsrep->append_key(
|
||||
wsrep,
|
||||
wsrep_ws_handle(thd, trx),
|
||||
@ -9781,7 +9772,7 @@ wsrep_append_key(
|
||||
#ifdef WSREP_DEBUG_PRINT
|
||||
fprintf(stderr, "%s conn %ld, trx %llu, keylen %d, table %s ",
|
||||
(shared) ? "Shared" : "Exclusive",
|
||||
wsrep_thd_thread_id(thd), (long long)trx->id, key_len,
|
||||
thd_get_thread_id(thd), (long long)trx->id, key_len,
|
||||
table_share->table_name.str);
|
||||
for (int i=0; i<key_len; i++) {
|
||||
fprintf(stderr, "%hhX, ", key[i]);
|
||||
@ -9790,7 +9781,7 @@ wsrep_append_key(
|
||||
#endif
|
||||
wsrep_buf_t wkey_part[3];
|
||||
wsrep_key_t wkey = {wkey_part, 3};
|
||||
if (!wsrep_prepare_key_for_innodb(
|
||||
if (!wsrep_prepare_key(
|
||||
(const uchar*)table_share->table_cache_key.str,
|
||||
table_share->table_cache_key.length,
|
||||
(const uchar*)key, key_len,
|
||||
@ -9802,6 +9793,7 @@ wsrep_append_key(
|
||||
DBUG_RETURN(HA_ERR_INTERNAL_ERROR);
|
||||
}
|
||||
|
||||
wsrep_t *wsrep= get_wsrep();
|
||||
int rcode = (int)wsrep->append_key(
|
||||
wsrep,
|
||||
wsrep_ws_handle(thd, trx),
|
||||
@ -9838,7 +9830,7 @@ ha_innobase::wsrep_append_keys(
|
||||
|
||||
if (table_share && table_share->tmp_table != NO_TMP_TABLE) {
|
||||
WSREP_DEBUG("skipping tmp table DML: THD: %lu tmp: %d SQL: %s",
|
||||
wsrep_thd_thread_id(thd),
|
||||
thd_get_thread_id(thd),
|
||||
table_share->tmp_table,
|
||||
(wsrep_thd_query(thd)) ?
|
||||
wsrep_thd_query(thd) : "void");
|
||||
@ -17518,7 +17510,7 @@ wsrep_innobase_kill_one_trx(void * const bf_thd_ptr,
|
||||
|
||||
WSREP_DEBUG("BF kill (%lu, seqno: %lld), victim: (%lu) trx: %lu",
|
||||
signal, (long long)bf_seqno,
|
||||
wsrep_thd_thread_id(thd),
|
||||
thd_get_thread_id(thd),
|
||||
victim_trx->id);
|
||||
|
||||
WSREP_DEBUG("Aborting query: %s",
|
||||
@ -17534,10 +17526,10 @@ wsrep_innobase_kill_one_trx(void * const bf_thd_ptr,
|
||||
if(wsrep_thd_exec_mode(thd) != LOCAL_STATE) {
|
||||
WSREP_DEBUG("withdraw for BF trx: %lu, state: %d",
|
||||
victim_trx->id,
|
||||
wsrep_thd_conflict_state(thd));
|
||||
wsrep_thd_get_conflict_state(thd));
|
||||
}
|
||||
|
||||
switch (wsrep_thd_conflict_state(thd)) {
|
||||
switch (wsrep_thd_get_conflict_state(thd)) {
|
||||
case NO_CONFLICT:
|
||||
wsrep_thd_set_conflict_state(thd, MUST_ABORT);
|
||||
break;
|
||||
@ -17552,7 +17544,7 @@ wsrep_innobase_kill_one_trx(void * const bf_thd_ptr,
|
||||
case ABORTING: // fall through
|
||||
default:
|
||||
WSREP_DEBUG("victim %lu in state %d",
|
||||
victim_trx->id, wsrep_thd_conflict_state(thd));
|
||||
victim_trx->id, wsrep_thd_get_conflict_state(thd));
|
||||
wsrep_thd_UNLOCK(thd);
|
||||
DBUG_RETURN(0);
|
||||
break;
|
||||
@ -17563,7 +17555,7 @@ wsrep_innobase_kill_one_trx(void * const bf_thd_ptr,
|
||||
enum wsrep_status rcode;
|
||||
|
||||
WSREP_DEBUG("kill query for: %ld",
|
||||
wsrep_thd_thread_id(thd));
|
||||
thd_get_thread_id(thd));
|
||||
WSREP_DEBUG("kill trx QUERY_COMMITTING for %lu",
|
||||
victim_trx->id);
|
||||
|
||||
@ -17571,6 +17563,7 @@ wsrep_innobase_kill_one_trx(void * const bf_thd_ptr,
|
||||
wsrep_abort_slave_trx(bf_seqno,
|
||||
wsrep_thd_trx_seqno(thd));
|
||||
} else {
|
||||
wsrep_t *wsrep= get_wsrep();
|
||||
rcode = wsrep->abort_pre_commit(
|
||||
wsrep, bf_seqno,
|
||||
(wsrep_trx_id_t)victim_trx->id
|
||||
@ -17611,7 +17604,7 @@ wsrep_innobase_kill_one_trx(void * const bf_thd_ptr,
|
||||
victim_trx->lock.was_chosen_as_deadlock_victim= TRUE;
|
||||
if (victim_trx->lock.wait_lock) {
|
||||
WSREP_DEBUG("victim has wait flag: %ld",
|
||||
wsrep_thd_thread_id(thd));
|
||||
thd_get_thread_id(thd));
|
||||
lock_t* wait_lock = victim_trx->lock.wait_lock;
|
||||
if (wait_lock) {
|
||||
WSREP_DEBUG("canceling wait lock");
|
||||
@ -17624,9 +17617,9 @@ wsrep_innobase_kill_one_trx(void * const bf_thd_ptr,
|
||||
} else {
|
||||
/* abort currently executing query */
|
||||
DBUG_PRINT("wsrep",("sending KILL_QUERY to: %ld",
|
||||
wsrep_thd_thread_id(thd)));
|
||||
thd_get_thread_id(thd)));
|
||||
WSREP_DEBUG("kill query for: %ld",
|
||||
wsrep_thd_thread_id(thd));
|
||||
thd_get_thread_id(thd));
|
||||
/* Note that innobase_kill_connection will take lock_mutex
|
||||
and trx_mutex */
|
||||
wsrep_thd_UNLOCK(thd);
|
||||
@ -17641,9 +17634,6 @@ wsrep_innobase_kill_one_trx(void * const bf_thd_ptr,
|
||||
break;
|
||||
case QUERY_IDLE:
|
||||
{
|
||||
bool skip_abort= false;
|
||||
wsrep_aborting_thd_t abortees;
|
||||
|
||||
WSREP_DEBUG("kill IDLE for %lu", victim_trx->id);
|
||||
|
||||
if (wsrep_thd_exec_mode(thd) == REPL_RECV) {
|
||||
@ -17657,35 +17647,22 @@ wsrep_innobase_kill_one_trx(void * const bf_thd_ptr,
|
||||
/* This will lock thd from proceeding after net_read() */
|
||||
wsrep_thd_set_conflict_state(thd, ABORTING);
|
||||
|
||||
mysql_mutex_lock(&LOCK_wsrep_rollback);
|
||||
wsrep_lock_rollback();
|
||||
|
||||
abortees = wsrep_aborting_thd;
|
||||
while (abortees && !skip_abort) {
|
||||
/* check if we have a kill message for this already */
|
||||
if (abortees->aborting_thd == thd) {
|
||||
skip_abort = true;
|
||||
WSREP_WARN("duplicate thd aborter %lu",
|
||||
wsrep_thd_thread_id(thd));
|
||||
}
|
||||
abortees = abortees->next;
|
||||
}
|
||||
if (!skip_abort) {
|
||||
wsrep_aborting_thd_t aborting = (wsrep_aborting_thd_t)
|
||||
my_malloc(sizeof(struct wsrep_aborting_thd),
|
||||
MYF(0));
|
||||
aborting->aborting_thd = thd;
|
||||
aborting->next = wsrep_aborting_thd;
|
||||
wsrep_aborting_thd = aborting;
|
||||
DBUG_PRINT("wsrep",("enqueuing trx abort for %lu",
|
||||
wsrep_thd_thread_id(thd)));
|
||||
WSREP_DEBUG("enqueuing trx abort for (%lu)",
|
||||
wsrep_thd_thread_id(thd));
|
||||
if (wsrep_aborting_thd_contains(thd)) {
|
||||
WSREP_WARN("duplicate thd aborter %lu",
|
||||
thd_get_thread_id(thd));
|
||||
} else {
|
||||
wsrep_aborting_thd_enqueue(thd);
|
||||
DBUG_PRINT("wsrep",("enqueuing trx abort for %lu",
|
||||
thd_get_thread_id(thd)));
|
||||
WSREP_DEBUG("enqueuing trx abort for (%lu)",
|
||||
thd_get_thread_id(thd));
|
||||
}
|
||||
|
||||
DBUG_PRINT("wsrep",("signalling wsrep rollbacker"));
|
||||
WSREP_DEBUG("signaling aborter");
|
||||
mysql_cond_signal(&COND_wsrep_rollback);
|
||||
mysql_mutex_unlock(&LOCK_wsrep_rollback);
|
||||
wsrep_unlock_rollback();
|
||||
wsrep_thd_UNLOCK(thd);
|
||||
|
||||
break;
|
||||
|
||||
@ -476,38 +476,7 @@ __attribute__((nonnull));
|
||||
extern void mysql_bin_log_commit_pos(THD *thd, ulonglong *out_pos, const char **out_file);
|
||||
|
||||
#ifdef WITH_WSREP
|
||||
#include <wsrep_mysqld.h>
|
||||
//extern "C" int wsrep_trx_order_before(void *thd1, void *thd2);
|
||||
|
||||
extern "C" bool wsrep_thd_is_wsrep_on(THD *thd);
|
||||
|
||||
extern "C" enum wsrep_exec_mode wsrep_thd_exec_mode(THD *thd);
|
||||
extern "C" enum wsrep_conflict_state wsrep_thd_conflict_state(THD *thd);
|
||||
extern "C" enum wsrep_query_state wsrep_thd_query_state(THD *thd);
|
||||
extern "C" const char * wsrep_thd_exec_mode_str(THD *thd);
|
||||
extern "C" const char * wsrep_thd_conflict_state_str(THD *thd);
|
||||
extern "C" const char * wsrep_thd_query_state_str(THD *thd);
|
||||
extern "C" wsrep_ws_handle_t* wsrep_thd_ws_handle(THD *thd);
|
||||
|
||||
extern "C" void wsrep_thd_set_exec_mode(THD *thd, enum wsrep_exec_mode mode);
|
||||
extern "C" void wsrep_thd_set_query_state(
|
||||
THD *thd, enum wsrep_query_state state);
|
||||
extern "C" void wsrep_thd_set_conflict_state(
|
||||
THD *thd, enum wsrep_conflict_state state);
|
||||
|
||||
extern "C" void wsrep_thd_set_trx_to_replay(THD *thd, uint64 trx_id);
|
||||
|
||||
extern "C"void wsrep_thd_LOCK(THD *thd);
|
||||
extern "C"void wsrep_thd_UNLOCK(THD *thd);
|
||||
extern "C" uint32 wsrep_thd_wsrep_rand(THD *thd);
|
||||
extern "C" time_t wsrep_thd_query_start(THD *thd);
|
||||
extern "C" my_thread_id wsrep_thd_thread_id(THD *thd);
|
||||
extern "C" int64_t wsrep_thd_trx_seqno(THD *thd);
|
||||
extern "C" query_id_t wsrep_thd_query_id(THD *thd);
|
||||
extern "C" char * wsrep_thd_query(THD *thd);
|
||||
extern "C" query_id_t wsrep_thd_wsrep_last_query_id(THD *thd);
|
||||
extern "C" void wsrep_thd_set_wsrep_last_query_id(THD *thd, query_id_t id);
|
||||
extern "C" void wsrep_thd_awake(THD* thd, my_bool signal);
|
||||
#include <mysql/service_wsrep.h>
|
||||
#endif
|
||||
|
||||
extern const struct _ft_vft ft_vft_result;
|
||||
|
||||
@ -49,10 +49,6 @@ Smart ALTER TABLE
|
||||
#include "pars0pars.h"
|
||||
#include "row0sel.h"
|
||||
#include "ha_innodb.h"
|
||||
#ifdef WITH_WSREP
|
||||
//#include "wsrep_api.h"
|
||||
#include <sql_acl.h> // PROCESS_ACL
|
||||
#endif
|
||||
|
||||
/** Operations for creating secondary indexes (no rebuild needed) */
|
||||
static const Alter_inplace_info::HA_ALTER_FLAGS INNOBASE_ONLINE_CREATE
|
||||
|
||||
@ -291,18 +291,11 @@ UNIV_INTERN
|
||||
int
|
||||
wsrep_innobase_kill_one_trx(void *thd_ptr,
|
||||
const trx_t *bf_trx, trx_t *victim_trx, ibool signal);
|
||||
my_bool wsrep_thd_set_PA_safe(void *thd_ptr, my_bool safe);
|
||||
int wsrep_thd_conflict_state(void *thd_ptr, my_bool sync);
|
||||
my_bool wsrep_thd_is_BF(void *thd_ptr, my_bool sync);
|
||||
my_bool wsrep_thd_is_wsrep(void *thd_ptr);
|
||||
int wsrep_trx_order_before(void *thd1, void *thd2);
|
||||
int wsrep_innobase_mysql_sort(int mysql_type, uint charset_number,
|
||||
unsigned char* str, unsigned int str_length,
|
||||
unsigned int buf_length);
|
||||
int
|
||||
wsrep_on(void *thd_ptr);
|
||||
extern "C" int wsrep_is_wsrep_xid(const void*);
|
||||
unsigned char* str, unsigned int str_length,
|
||||
unsigned int buf_length);
|
||||
#endif /* WITH_WSREP */
|
||||
|
||||
/**********************************************************************//**
|
||||
Determines the connection character set.
|
||||
@return connection character set */
|
||||
|
||||
@ -50,11 +50,8 @@ Created 5/7/1996 Heikki Tuuri
|
||||
#include "dict0boot.h"
|
||||
#include <set>
|
||||
|
||||
#ifdef WITH_WSREP
|
||||
extern my_bool wsrep_debug;
|
||||
extern my_bool wsrep_log_conflicts;
|
||||
#include "ha_prototypes.h"
|
||||
#endif
|
||||
#include <mysql/service_wsrep.h>
|
||||
|
||||
/* Restricts the length of search we will do in the waits-for
|
||||
graph of transactions */
|
||||
#define LOCK_MAX_N_STEPS_IN_DEADLOCK_CHECK 1000000
|
||||
|
||||
@ -51,10 +51,9 @@ Created 12/27/1996 Heikki Tuuri
|
||||
#include "pars0sym.h"
|
||||
#include "eval0eval.h"
|
||||
#include "buf0lru.h"
|
||||
#ifdef WITH_WSREP
|
||||
extern my_bool wsrep_debug;
|
||||
#endif
|
||||
|
||||
#include <mysql/plugin.h>
|
||||
#include <mysql/service_wsrep.h>
|
||||
|
||||
/* What kind of latch and lock can we assume when the control comes to
|
||||
-------------------------------------------------------------------
|
||||
|
||||
@ -41,11 +41,8 @@ Created 2011/04/18 Sunny Bains
|
||||
#include "sync0sync.h"
|
||||
#include "trx0trx.h"
|
||||
|
||||
#include "mysql/plugin.h"
|
||||
#ifdef WITH_WSREP
|
||||
extern "C" int wsrep_trx_is_aborting(void *thd_ptr);
|
||||
extern my_bool wsrep_debug;
|
||||
#endif
|
||||
#include <mysql/plugin.h>
|
||||
#include <mysql/service_wsrep.h>
|
||||
|
||||
/** Number of times a thread is allowed to enter InnoDB within the same
|
||||
SQL query after it has once got the ticket. */
|
||||
|
||||
@ -44,9 +44,7 @@ Created 3/26/1996 Heikki Tuuri
|
||||
#include "os0file.h"
|
||||
#include "read0read.h"
|
||||
|
||||
#ifdef WITH_WSREP
|
||||
#include "ha_prototypes.h" /* wsrep_is_wsrep_xid() */
|
||||
#endif /* */
|
||||
#include <mysql/service_wsrep.h>
|
||||
|
||||
/** The file format tag structure with id and name. */
|
||||
struct file_format_t {
|
||||
|
||||
@ -29,6 +29,8 @@ Created 3/26/1996 Heikki Tuuri
|
||||
#include "trx0trx.ic"
|
||||
#endif
|
||||
|
||||
#include <mysql/service_wsrep.h>
|
||||
|
||||
#include "trx0undo.h"
|
||||
#include "trx0rseg.h"
|
||||
#include "log0log.h"
|
||||
@ -1028,7 +1030,7 @@ trx_write_serialisation_history(
|
||||
#ifdef WITH_WSREP
|
||||
sys_header = trx_sysf_get(mtr);
|
||||
/* Update latest MySQL wsrep XID in trx sys header. */
|
||||
if (wsrep_is_wsrep_xid((const void *)&trx->xid))
|
||||
if (wsrep_is_wsrep_xid(&trx->xid))
|
||||
{
|
||||
trx_sys_update_wsrep_checkpoint(&trx->xid, sys_header, mtr);
|
||||
}
|
||||
|
||||
@ -117,6 +117,9 @@ this program; if not, write to the Free Software Foundation, Inc.,
|
||||
#include "i_s.h"
|
||||
#include "xtradb_i_s.h"
|
||||
|
||||
#include <mysql/plugin.h>
|
||||
#include <mysql/service_wsrep.h>
|
||||
|
||||
# ifndef MYSQL_PLUGIN_IMPORT
|
||||
# define MYSQL_PLUGIN_IMPORT /* nothing */
|
||||
# endif /* MYSQL_PLUGIN_IMPORT */
|
||||
@ -141,13 +144,6 @@ wsrep_ws_handle(THD* thd, const trx_t* trx) {
|
||||
(wsrep_trx_id_t)trx->id);
|
||||
}
|
||||
|
||||
extern bool wsrep_prepare_key_for_innodb(const uchar *cache_key,
|
||||
size_t cache_key_len,
|
||||
const uchar* row_id,
|
||||
size_t row_id_len,
|
||||
wsrep_buf_t* key,
|
||||
size_t* key_len);
|
||||
|
||||
extern handlerton * wsrep_hton;
|
||||
extern TC_LOG* tc_log;
|
||||
extern void wsrep_cleanup_transaction(THD *thd);
|
||||
@ -4136,7 +4132,7 @@ innobase_commit_low(
|
||||
#ifdef WITH_WSREP
|
||||
THD* thd = (THD*)trx->mysql_thd;
|
||||
const char* tmp = 0;
|
||||
if (wsrep_on((void*)thd)) {
|
||||
if (wsrep_on(thd)) {
|
||||
#ifdef WSREP_PROC_INFO
|
||||
char info[64];
|
||||
info[sizeof(info) - 1] = '\0';
|
||||
@ -4155,7 +4151,7 @@ innobase_commit_low(
|
||||
trx_commit_for_mysql(trx);
|
||||
}
|
||||
#ifdef WITH_WSREP
|
||||
if (wsrep_on((void*)thd)) { thd_proc_info(thd, tmp); }
|
||||
if (wsrep_on(thd)) { thd_proc_info(thd, tmp); }
|
||||
#endif /* WITH_WSREP */
|
||||
}
|
||||
|
||||
@ -4933,7 +4929,7 @@ innobase_kill_connection(
|
||||
|
||||
#ifdef WITH_WSREP
|
||||
wsrep_thd_LOCK(thd);
|
||||
if (wsrep_thd_conflict_state(thd) != NO_CONFLICT) {
|
||||
if (wsrep_thd_get_conflict_state(thd) != NO_CONFLICT) {
|
||||
/* if victim has been signaled by BF thread and/or aborting
|
||||
is already progressing, following query aborting is not necessary
|
||||
any more.
|
||||
@ -10250,7 +10246,7 @@ wsrep_append_foreign_key(
|
||||
|
||||
wsrep_buf_t wkey_part[3];
|
||||
wsrep_key_t wkey = {wkey_part, 3};
|
||||
if (!wsrep_prepare_key_for_innodb(
|
||||
if (!wsrep_prepare_key(
|
||||
(const uchar*)cache_key,
|
||||
cache_key_len + 1,
|
||||
(const uchar*)key, len+1,
|
||||
@ -10296,7 +10292,7 @@ wsrep_append_key(
|
||||
#ifdef WSREP_DEBUG_PRINT
|
||||
fprintf(stderr, "%s conn %ld, trx %lu, keylen %d, table %s ",
|
||||
(shared) ? "Shared" : "Exclusive",
|
||||
wsrep_thd_thread_id(thd), (long long)trx->id, key_len,
|
||||
thd_get_thread_id(thd), (long long)trx->id, key_len,
|
||||
table_share->table_name.str);
|
||||
for (int i=0; i<key_len; i++) {
|
||||
fprintf(stderr, "%hhX, ", key[i]);
|
||||
@ -10305,7 +10301,7 @@ wsrep_append_key(
|
||||
#endif
|
||||
wsrep_buf_t wkey_part[3];
|
||||
wsrep_key_t wkey = {wkey_part, 3};
|
||||
if (!wsrep_prepare_key_for_innodb(
|
||||
if (!wsrep_prepare_key(
|
||||
(const uchar*)table_share->table_cache_key.str,
|
||||
table_share->table_cache_key.length,
|
||||
(const uchar*)key, key_len,
|
||||
@ -10353,7 +10349,7 @@ ha_innobase::wsrep_append_keys(
|
||||
|
||||
if (table_share && table_share->tmp_table != NO_TMP_TABLE) {
|
||||
WSREP_DEBUG("skipping tmp table DML: THD: %lu tmp: %d SQL: %s",
|
||||
wsrep_thd_thread_id(thd),
|
||||
thd_get_thread_id(thd),
|
||||
table_share->tmp_table,
|
||||
(wsrep_thd_query(thd)) ?
|
||||
wsrep_thd_query(thd) : "void");
|
||||
@ -18444,7 +18440,7 @@ wsrep_innobase_kill_one_trx(void * const bf_thd_ptr,
|
||||
|
||||
WSREP_DEBUG("BF kill (%lu, seqno: %lld), victim: (%lu) trx: %lu",
|
||||
signal, (long long)bf_seqno,
|
||||
wsrep_thd_thread_id(thd),
|
||||
thd_get_thread_id(thd),
|
||||
victim_trx->id);
|
||||
|
||||
WSREP_DEBUG("Aborting query: %s",
|
||||
@ -18460,10 +18456,10 @@ wsrep_innobase_kill_one_trx(void * const bf_thd_ptr,
|
||||
if(wsrep_thd_exec_mode(thd) != LOCAL_STATE) {
|
||||
WSREP_DEBUG("withdraw for BF trx: %lu, state: %d",
|
||||
victim_trx->id,
|
||||
wsrep_thd_conflict_state(thd));
|
||||
wsrep_thd_get_conflict_state(thd));
|
||||
}
|
||||
|
||||
switch (wsrep_thd_conflict_state(thd)) {
|
||||
switch (wsrep_thd_get_conflict_state(thd)) {
|
||||
case NO_CONFLICT:
|
||||
wsrep_thd_set_conflict_state(thd, MUST_ABORT);
|
||||
break;
|
||||
@ -18478,7 +18474,7 @@ wsrep_innobase_kill_one_trx(void * const bf_thd_ptr,
|
||||
case ABORTING: // fall through
|
||||
default:
|
||||
WSREP_DEBUG("victim %lu in state %d",
|
||||
victim_trx->id, wsrep_thd_conflict_state(thd));
|
||||
victim_trx->id, wsrep_thd_get_conflict_state(thd));
|
||||
wsrep_thd_UNLOCK(thd);
|
||||
DBUG_RETURN(0);
|
||||
break;
|
||||
@ -18489,7 +18485,7 @@ wsrep_innobase_kill_one_trx(void * const bf_thd_ptr,
|
||||
enum wsrep_status rcode;
|
||||
|
||||
WSREP_DEBUG("kill query for: %ld",
|
||||
wsrep_thd_thread_id(thd));
|
||||
thd_get_thread_id(thd));
|
||||
WSREP_DEBUG("kill trx QUERY_COMMITTING for %lu",
|
||||
victim_trx->id);
|
||||
|
||||
@ -18537,7 +18533,7 @@ wsrep_innobase_kill_one_trx(void * const bf_thd_ptr,
|
||||
victim_trx->lock.was_chosen_as_deadlock_victim= TRUE;
|
||||
if (victim_trx->lock.wait_lock) {
|
||||
WSREP_DEBUG("victim has wait flag: %ld",
|
||||
wsrep_thd_thread_id(thd));
|
||||
thd_get_thread_id(thd));
|
||||
lock_t* wait_lock = victim_trx->lock.wait_lock;
|
||||
if (wait_lock) {
|
||||
WSREP_DEBUG("canceling wait lock");
|
||||
@ -18550,9 +18546,9 @@ wsrep_innobase_kill_one_trx(void * const bf_thd_ptr,
|
||||
} else {
|
||||
/* abort currently executing query */
|
||||
DBUG_PRINT("wsrep",("sending KILL_QUERY to: %ld",
|
||||
wsrep_thd_thread_id(thd)));
|
||||
thd_get_thread_id(thd)));
|
||||
WSREP_DEBUG("kill query for: %ld",
|
||||
wsrep_thd_thread_id(thd));
|
||||
thd_get_thread_id(thd));
|
||||
/* Note that innobase_kill_connection will take lock_mutex
|
||||
and trx_mutex */
|
||||
wsrep_thd_UNLOCK(thd);
|
||||
@ -18591,7 +18587,7 @@ wsrep_innobase_kill_one_trx(void * const bf_thd_ptr,
|
||||
if (abortees->aborting_thd == thd) {
|
||||
skip_abort = true;
|
||||
WSREP_WARN("duplicate thd aborter %lu",
|
||||
wsrep_thd_thread_id(thd));
|
||||
thd_get_thread_id(thd));
|
||||
}
|
||||
abortees = abortees->next;
|
||||
}
|
||||
@ -18602,10 +18598,10 @@ wsrep_innobase_kill_one_trx(void * const bf_thd_ptr,
|
||||
aborting->aborting_thd = thd;
|
||||
aborting->next = wsrep_aborting_thd;
|
||||
wsrep_aborting_thd = aborting;
|
||||
DBUG_PRINT("wsrep",("enqueuing trx abort for %lu",
|
||||
wsrep_thd_thread_id(thd)));
|
||||
DBUG_PRINT("wsrep",("enqueuing trx abort for %lu",
|
||||
thd_get_thread_id(thd)));
|
||||
WSREP_DEBUG("enqueuing trx abort for (%lu)",
|
||||
wsrep_thd_thread_id(thd));
|
||||
thd_get_thread_id(thd));
|
||||
}
|
||||
|
||||
DBUG_PRINT("wsrep",("signalling wsrep rollbacker"));
|
||||
@ -18660,7 +18656,7 @@ wsrep_abort_transaction(handlerton* hton, THD *bf_thd, THD *victim_thd,
|
||||
static int innobase_wsrep_set_checkpoint(handlerton* hton, const XID* xid)
|
||||
{
|
||||
DBUG_ASSERT(hton == innodb_hton_ptr);
|
||||
if (wsrep_is_wsrep_xid((const void *)xid)) {
|
||||
if (wsrep_is_wsrep_xid(xid)) {
|
||||
mtr_t mtr;
|
||||
mtr_start(&mtr);
|
||||
trx_sysf_t* sys_header = trx_sysf_get(&mtr);
|
||||
|
||||
@ -487,33 +487,18 @@ struct trx_t;
|
||||
|
||||
extern "C" bool wsrep_thd_is_wsrep_on(THD *thd);
|
||||
|
||||
extern "C" enum wsrep_exec_mode wsrep_thd_exec_mode(THD *thd);
|
||||
extern "C" enum wsrep_conflict_state wsrep_thd_conflict_state(THD *thd);
|
||||
extern "C" enum wsrep_query_state wsrep_thd_query_state(THD *thd);
|
||||
extern "C" const char * wsrep_thd_exec_mode_str(THD *thd);
|
||||
extern "C" const char * wsrep_thd_conflict_state_str(THD *thd);
|
||||
extern "C" const char * wsrep_thd_query_state_str(THD *thd);
|
||||
extern "C" wsrep_ws_handle_t* wsrep_thd_ws_handle(THD *thd);
|
||||
|
||||
extern "C" void wsrep_thd_set_exec_mode(THD *thd, enum wsrep_exec_mode mode);
|
||||
extern "C" void wsrep_thd_set_query_state(
|
||||
THD *thd, enum wsrep_query_state state);
|
||||
extern "C" void wsrep_thd_set_conflict_state(
|
||||
THD *thd, enum wsrep_conflict_state state);
|
||||
|
||||
extern "C" void wsrep_thd_set_trx_to_replay(THD *thd, uint64 trx_id);
|
||||
|
||||
extern "C"void wsrep_thd_LOCK(THD *thd);
|
||||
extern "C"void wsrep_thd_UNLOCK(THD *thd);
|
||||
extern "C" uint32 wsrep_thd_wsrep_rand(THD *thd);
|
||||
extern "C" time_t wsrep_thd_query_start(THD *thd);
|
||||
extern "C" my_thread_id wsrep_thd_thread_id(THD *thd);
|
||||
extern "C" int64_t wsrep_thd_trx_seqno(THD *thd);
|
||||
extern "C" query_id_t wsrep_thd_query_id(THD *thd);
|
||||
extern "C" char * wsrep_thd_query(THD *thd);
|
||||
extern "C" query_id_t wsrep_thd_wsrep_last_query_id(THD *thd);
|
||||
extern "C" void wsrep_thd_set_wsrep_last_query_id(THD *thd, query_id_t id);
|
||||
extern "C" void wsrep_thd_awake(THD* thd, my_bool signal);
|
||||
#endif
|
||||
|
||||
extern const struct _ft_vft ft_vft_result;
|
||||
|
||||
@ -290,17 +290,9 @@ UNIV_INTERN
|
||||
int
|
||||
wsrep_innobase_kill_one_trx(void *thd_ptr,
|
||||
const trx_t *bf_trx, trx_t *victim_trx, ibool signal);
|
||||
my_bool wsrep_thd_set_PA_safe(void *thd_ptr, my_bool safe);
|
||||
int wsrep_thd_conflict_state(void *thd_ptr, my_bool sync);
|
||||
my_bool wsrep_thd_is_BF(void *thd_ptr, my_bool sync);
|
||||
my_bool wsrep_thd_is_wsrep(void *thd_ptr);
|
||||
int wsrep_trx_order_before(void *thd1, void *thd2);
|
||||
int wsrep_innobase_mysql_sort(int mysql_type, uint charset_number,
|
||||
unsigned char* str, unsigned int str_length,
|
||||
unsigned int buf_length);
|
||||
int
|
||||
wsrep_on(void *thd_ptr);
|
||||
extern "C" int wsrep_is_wsrep_xid(const void*);
|
||||
#endif /* WITH_WSREP */
|
||||
/**********************************************************************//**
|
||||
Determines the connection character set.
|
||||
|
||||
@ -50,11 +50,8 @@ Created 5/7/1996 Heikki Tuuri
|
||||
#include "dict0boot.h"
|
||||
#include <set>
|
||||
|
||||
#ifdef WITH_WSREP
|
||||
extern my_bool wsrep_debug;
|
||||
extern my_bool wsrep_log_conflicts;
|
||||
#include "ha_prototypes.h"
|
||||
#endif
|
||||
#include <mysql/service_wsrep.h>
|
||||
|
||||
/* Restricts the length of search we will do in the waits-for
|
||||
graph of transactions */
|
||||
#define LOCK_MAX_N_STEPS_IN_DEADLOCK_CHECK 1000000
|
||||
|
||||
@ -33,6 +33,8 @@ Created 25/5/2010 Sunny Bains
|
||||
#include "ha_prototypes.h"
|
||||
#include "lock0priv.h"
|
||||
|
||||
#include <mysql/service_wsrep.h>
|
||||
|
||||
/*********************************************************************//**
|
||||
Print the contents of the lock_sys_t::waiting_threads array. */
|
||||
static
|
||||
|
||||
@ -53,10 +53,9 @@ Created 12/27/1996 Heikki Tuuri
|
||||
#include "pars0sym.h"
|
||||
#include "eval0eval.h"
|
||||
#include "buf0lru.h"
|
||||
#ifdef WITH_WSREP
|
||||
extern my_bool wsrep_debug;
|
||||
#endif
|
||||
|
||||
#include <mysql/plugin.h>
|
||||
#include <mysql/service_wsrep.h>
|
||||
|
||||
/* What kind of latch and lock can we assume when the control comes to
|
||||
-------------------------------------------------------------------
|
||||
|
||||
@ -42,11 +42,8 @@ Created 2011/04/18 Sunny Bains
|
||||
#include "btr0types.h"
|
||||
#include "trx0trx.h"
|
||||
|
||||
#include "mysql/plugin.h"
|
||||
#ifdef WITH_WSREP
|
||||
extern "C" int wsrep_trx_is_aborting(void *thd_ptr);
|
||||
extern my_bool wsrep_debug;
|
||||
#endif
|
||||
#include <mysql/plugin.h>
|
||||
#include <mysql/service_wsrep.h>
|
||||
|
||||
/** Number of times a thread is allowed to enter InnoDB within the same
|
||||
SQL query after it has once got the ticket. */
|
||||
|
||||
@ -29,6 +29,8 @@ Created 3/26/1996 Heikki Tuuri
|
||||
#include "trx0roll.ic"
|
||||
#endif
|
||||
|
||||
#include <mysql/service_wsrep.h>
|
||||
|
||||
#include "fsp0fsp.h"
|
||||
#include "mach0data.h"
|
||||
#include "trx0rseg.h"
|
||||
|
||||
@ -48,6 +48,8 @@ Created 3/26/1996 Heikki Tuuri
|
||||
#include "ha_prototypes.h" /* wsrep_is_wsrep_xid() */
|
||||
#endif /* */
|
||||
|
||||
#include <mysql/service_wsrep.h>
|
||||
|
||||
/** The file format tag structure with id and name. */
|
||||
struct file_format_t {
|
||||
ulint id; /*!< id of the file format */
|
||||
@ -362,7 +364,7 @@ trx_sys_update_wsrep_checkpoint(
|
||||
#endif /* UNIV_DEBUG */
|
||||
|
||||
ut_ad(xid && mtr);
|
||||
ut_a(xid->formatID == -1 || wsrep_is_wsrep_xid((const void *)xid));
|
||||
ut_a(xid->formatID == -1 || wsrep_is_wsrep_xid(xid));
|
||||
|
||||
if (mach_read_from_4(sys_header + TRX_SYS_WSREP_XID_INFO
|
||||
+ TRX_SYS_WSREP_XID_MAGIC_N_FLD)
|
||||
|
||||
@ -30,6 +30,8 @@ Created 3/26/1996 Heikki Tuuri
|
||||
#include "trx0trx.ic"
|
||||
#endif
|
||||
|
||||
#include <mysql/service_wsrep.h>
|
||||
|
||||
#include "trx0undo.h"
|
||||
#include "trx0rseg.h"
|
||||
#include "log0log.h"
|
||||
@ -1226,7 +1228,7 @@ trx_write_serialisation_history(
|
||||
#ifdef WITH_WSREP
|
||||
sys_header = trx_sysf_get(mtr);
|
||||
/* Update latest MySQL wsrep XID in trx sys header. */
|
||||
if (wsrep_is_wsrep_xid((const void *)&trx->xid))
|
||||
if (wsrep_is_wsrep_xid(&trx->xid))
|
||||
{
|
||||
trx_sys_update_wsrep_checkpoint(&trx->xid, sys_header, mtr);
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user