diff options
-rw-r--r-- | cmake/wsrep.cmake | 1 | ||||
-rw-r--r-- | extra/mariabackup/wsrep.cc | 107 | ||||
-rw-r--r-- | include/mysql/service_wsrep.h | 6 | ||||
-rw-r--r-- | sql/wsrep_xid.cc | 30 | ||||
-rw-r--r-- | storage/innobase/trx/trx0rseg.cc | 16 |
5 files changed, 34 insertions, 126 deletions
diff --git a/cmake/wsrep.cmake b/cmake/wsrep.cmake index b5dc8b9f157..6208688ecfc 100644 --- a/cmake/wsrep.cmake +++ b/cmake/wsrep.cmake @@ -40,4 +40,5 @@ SET(WSREP_PROC_INFO ${WITH_WSREP}) IF(WITH_WSREP) SET(WSREP_PATCH_VERSION "wsrep_${WSREP_VERSION}") + INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/wsrep) ENDIF() diff --git a/extra/mariabackup/wsrep.cc b/extra/mariabackup/wsrep.cc index 33ba1c14fbf..dd3d5cb60d2 100644 --- a/extra/mariabackup/wsrep.cc +++ b/extra/mariabackup/wsrep.cc @@ -44,115 +44,14 @@ permission notice: #include <my_base.h> #include <handler.h> #include <trx0rseg.h> +#include <mysql/service_wsrep.h> #include "common.h" #ifdef WITH_WSREP -#define WSREP_XID_PREFIX "WSREPXid" -#define WSREP_XID_PREFIX_LEN MYSQL_XID_PREFIX_LEN -#define WSREP_XID_UUID_OFFSET 8 -#define WSREP_XID_SEQNO_OFFSET (WSREP_XID_UUID_OFFSET + sizeof(wsrep_uuid_t)) -#define WSREP_XID_GTRID_LEN (WSREP_XID_SEQNO_OFFSET + sizeof(wsrep_seqno_t)) - -/*! undefined seqno */ -#define WSREP_SEQNO_UNDEFINED (-1) /*! Name of file where Galera info is stored on recovery */ #define XB_GALERA_INFO_FILENAME "xtrabackup_galera_info" -/* Galera UUID type - for all unique IDs */ -typedef struct wsrep_uuid { - unsigned char data[16]; -} wsrep_uuid_t; - -/* sequence number of a writeset, etc. */ -typedef long long wsrep_seqno_t; - -/* Undefined UUID */ -static const wsrep_uuid_t WSREP_UUID_UNDEFINED = {{0,}}; - -/***********************************************************************//** -Check if a given WSREP XID is valid. - -@return true if valid. -*/ -static -bool -wsrep_is_wsrep_xid( -/*===============*/ - const void* xid_ptr) -{ - const XID* xid = reinterpret_cast<const XID*>(xid_ptr); - - return((xid->formatID == 1 && - xid->gtrid_length == WSREP_XID_GTRID_LEN && - xid->bqual_length == 0 && - !memcmp(xid->data, WSREP_XID_PREFIX, WSREP_XID_PREFIX_LEN))); -} - -/***********************************************************************//** -Retrieve binary WSREP UUID from XID. - -@return binary WSREP UUID represenataion, if UUID is valid, or - WSREP_UUID_UNDEFINED otherwise. -*/ -static -const wsrep_uuid_t* -wsrep_xid_uuid( -/*===========*/ - const XID* xid) -{ - if (wsrep_is_wsrep_xid(xid)) { - return(reinterpret_cast<const wsrep_uuid_t*> - (xid->data + WSREP_XID_UUID_OFFSET)); - } else { - return(&WSREP_UUID_UNDEFINED); - } -} - -/***********************************************************************//** -Retrieve WSREP seqno from XID. - -@return WSREP seqno, if it is valid, or WSREP_SEQNO_UNDEFINED otherwise. -*/ -wsrep_seqno_t wsrep_xid_seqno( -/*==========================*/ - const XID* xid) -{ - if (wsrep_is_wsrep_xid(xid)) { - return sint8korr(xid->data + WSREP_XID_SEQNO_OFFSET); - } else { - return(WSREP_SEQNO_UNDEFINED); - } -} - -/***********************************************************************//** -Write UUID to string. - -@return length of UUID string representation or -EMSGSIZE if string is too -short. -*/ -static -int -wsrep_uuid_print( -/*=============*/ - const wsrep_uuid_t* uuid, - char* str, - size_t str_len) -{ - if (str_len > 36) { - const unsigned char* u = uuid->data; - return snprintf(str, str_len, - "%02x%02x%02x%02x-%02x%02x-%02x%02x-" - "%02x%02x-%02x%02x%02x%02x%02x%02x", - u[ 0], u[ 1], u[ 2], u[ 3], u[ 4], u[ 5], u[ 6], - u[ 7], u[ 8], u[ 9], u[10], u[11], u[12], u[13], - u[14], u[15]); - } - else { - return -EMSGSIZE; - } -} - /*********************************************************************** Store Galera checkpoint info in the 'xtrabackup_galera_info' file, if that information is present in the trx system header. Otherwise, do nothing. */ @@ -182,7 +81,9 @@ xb_write_galera_info(bool incremental_prepare) return; } - if (wsrep_uuid_print(wsrep_xid_uuid(&xid), uuid_str, + wsrep_uuid_t uuid; + memcpy(uuid.data, wsrep_xid_uuid(&xid), sizeof(uuid.data)); + if (wsrep_uuid_print(&uuid, uuid_str, sizeof(uuid_str)) < 0) { return; } diff --git a/include/mysql/service_wsrep.h b/include/mysql/service_wsrep.h index a64ad610508..d63003762a5 100644 --- a/include/mysql/service_wsrep.h +++ b/include/mysql/service_wsrep.h @@ -22,6 +22,8 @@ For engines that want to support galera. */ +#include <wsrep_api.h> + #ifdef __cplusplus extern "C" { #endif @@ -67,11 +69,7 @@ enum wsrep_trx_status { }; struct xid_t; -struct wsrep; struct wsrep_ws_handle; -struct wsrep_buf; -/* must match to typedef in wsrep/wsrep_api.h */ -typedef int64_t wsrep_seqno_t; extern struct wsrep_service_st { struct wsrep * (*get_wsrep_func)(); diff --git a/sql/wsrep_xid.cc b/sql/wsrep_xid.cc index 6e3c1cf6386..04d48819397 100644 --- a/sql/wsrep_xid.cc +++ b/sql/wsrep_xid.cc @@ -25,8 +25,11 @@ * WSREPXid */ -#define WSREP_XID_PREFIX "WSREPXid" -#define WSREP_XID_PREFIX_LEN MYSQL_XID_PREFIX_LEN +#define WSREP_XID_PREFIX "WSREPXi" +#define WSREP_XID_PREFIX_LEN 7 +#define WSREP_XID_VERSION_OFFSET WSREP_XID_PREFIX_LEN +#define WSREP_XID_VERSION_1 'd' +#define WSREP_XID_VERSION_2 'e' #define WSREP_XID_UUID_OFFSET 8 #define WSREP_XID_SEQNO_OFFSET (WSREP_XID_UUID_OFFSET + sizeof(wsrep_uuid_t)) #define WSREP_XID_GTRID_LEN (WSREP_XID_SEQNO_OFFSET + sizeof(wsrep_seqno_t)) @@ -38,6 +41,7 @@ void wsrep_xid_init(XID* xid, const wsrep_uuid_t& uuid, wsrep_seqno_t seqno) xid->bqual_length= 0; memset(xid->data, 0, sizeof(xid->data)); memcpy(xid->data, WSREP_XID_PREFIX, WSREP_XID_PREFIX_LEN); + xid->data[WSREP_XID_VERSION_OFFSET] = WSREP_XID_VERSION_2; memcpy(xid->data + WSREP_XID_UUID_OFFSET, &uuid, sizeof(wsrep_uuid_t)); int8store(xid->data + WSREP_XID_SEQNO_OFFSET,seqno); } @@ -47,7 +51,9 @@ int wsrep_is_wsrep_xid(const XID* xid) return (xid->formatID == 1 && xid->gtrid_length == WSREP_XID_GTRID_LEN && xid->bqual_length == 0 && - !memcmp(xid->data, WSREP_XID_PREFIX, WSREP_XID_PREFIX_LEN)); + !memcmp(xid->data, WSREP_XID_PREFIX, WSREP_XID_PREFIX_LEN) && + (xid->data[WSREP_XID_VERSION_OFFSET] == WSREP_XID_VERSION_1 || + xid->data[WSREP_XID_VERSION_OFFSET] == WSREP_XID_VERSION_2)); } const wsrep_uuid_t* wsrep_xid_uuid(const XID& xid) @@ -67,14 +73,22 @@ const unsigned char* wsrep_xid_uuid(const xid_t* xid) wsrep_seqno_t wsrep_xid_seqno(const XID& xid) { + wsrep_seqno_t ret= WSREP_SEQNO_UNDEFINED; if (wsrep_is_wsrep_xid(&xid)) { - return sint8korr(xid.data + WSREP_XID_SEQNO_OFFSET); - } - else - { - return WSREP_SEQNO_UNDEFINED; + switch (xid.data[WSREP_XID_VERSION_OFFSET]) + { + case WSREP_XID_VERSION_1: + memcpy(&ret, xid.data + WSREP_XID_SEQNO_OFFSET, sizeof ret); + break; + case WSREP_XID_VERSION_2: + ret= sint8korr(xid.data + WSREP_XID_SEQNO_OFFSET); + break; + default: + break; + } } + return ret; } wsrep_seqno_t wsrep_xid_seqno(const xid_t* xid) diff --git a/storage/innobase/trx/trx0rseg.cc b/storage/innobase/trx/trx0rseg.cc index c2599a9b6bb..eb970167a42 100644 --- a/storage/innobase/trx/trx0rseg.cc +++ b/storage/innobase/trx/trx0rseg.cc @@ -186,17 +186,6 @@ static bool trx_rseg_init_wsrep_xid(const page_t* page, XID& xid) memcpy(xid.data, TRX_SYS + TRX_SYS_WSREP_XID_INFO + TRX_SYS_WSREP_XID_DATA + page, XIDDATASIZE); - - /* Wsrep XID seqno part in TRX_SYS page was written in host byte - order. However, in the XID which gets written to the rollback - segment header the byte order is little endian. On big endian - machines swap the seqno part byte order. */ -#ifdef WORDS_BIGENDIAN - wsrep_seqno_t seqno; - memcpy(&seqno, xid.data + 24, sizeof seqno); - mach_swap_byte_order(xid.data + 24, &seqno, sizeof seqno); -#endif /* WORDS_BIGENDIAN */ - return true; } @@ -216,6 +205,11 @@ bool trx_rseg_read_wsrep_checkpoint(XID& xid) if (rseg_id == 0) { found = trx_rseg_init_wsrep_xid(sys->frame, xid); ut_ad(!found || xid.formatID == 1); + if (found) { + max_xid_seqno = wsrep_xid_seqno(&xid); + memcpy(wsrep_uuid, wsrep_xid_uuid(&xid), + sizeof wsrep_uuid); + } } const uint32_t page_no = trx_sysf_rseg_get_page_no( |