@ -1,6 +1,7 @@
/*****************************************************************************
Copyright ( c ) 1996 , 2017 , Oracle and / or its affiliates . All Rights Reserved .
Copyright ( c ) 2017 , MariaDB Corporation .
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
@ -325,112 +326,120 @@ trx_sys_print_mysql_binlog_offset(void)
static long long trx_sys_cur_xid_seqno = - 1 ;
static unsigned char trx_sys_cur_xid_uuid [ 16 ] ;
long long read_wsrep_xid_seqno ( const XID * xid )
/** Read WSREP XID seqno */
static inline long long read_wsrep_xid_seqno ( const XID * xid )
{
long long seqno ;
memcpy ( & seqno , xid - > data + 24 , sizeof ( long long ) ) ;
return seqno ;
long long seqno ;
memcpy ( & seqno , xid - > data + 24 , sizeof ( long long ) ) ;
return seqno ;
}
void read_wsrep_xid_uuid ( const XID * xid , unsigned char * buf )
/** Read WSREP XID UUID */
static inline void read_wsrep_xid_uuid ( const XID * xid , unsigned char * buf )
{
memcpy ( buf , xid - > data + 8 , 16 ) ;
memcpy ( buf , xid - > data + 8 , 16 ) ;
}
# endif /* UNIV_DEBUG */
/** Update WSREP XID info in sys_header of TRX_SYS_PAGE_NO = 5.
@ param [ in ] xid Transaction XID
@ param [ in , out ] sys_header sys_header
@ param [ in ] mtr minitransaction */
void
trx_sys_update_wsrep_checkpoint (
const XID * xid , /*!< in: transaction XID */
trx_sysf_t * sys_header , /*!< in: sys_header */
mtr_t * mtr ) /*!< in: mtr */
const XID * xid ,
trx_sysf_t * sys_header ,
mtr_t * mtr )
{
# ifdef UNIV_DEBUG
{
/* Check that seqno is monotonically increasing */
unsigned char xid_uuid [ 16 ] ;
long long xid_seqno = read_wsrep_xid_seqno ( xid ) ;
read_wsrep_xid_uuid ( xid , xid_uuid ) ;
if ( ! memcmp ( xid_uuid , trx_sys_cur_xid_uuid , 8 ) )
{
ut_ad ( xid_seqno > trx_sys_cur_xid_seqno ) ;
trx_sys_cur_xid_seqno = xid_seqno ;
}
else
{
memcpy ( trx_sys_cur_xid_uuid , xid_uuid , 16 ) ;
}
trx_sys_cur_xid_seqno = xid_seqno ;
}
if ( xid - > formatID ! = - 1
& & mach_read_from_4 ( sys_header + TRX_SYS_WSREP_XID_INFO
+ TRX_SYS_WSREP_XID_MAGIC_N_FLD )
= = TRX_SYS_WSREP_XID_MAGIC_N ) {
/* Check that seqno is monotonically increasing */
unsigned char xid_uuid [ 16 ] ;
long long xid_seqno = read_wsrep_xid_seqno ( xid ) ;
read_wsrep_xid_uuid ( xid , xid_uuid ) ;
if ( ! memcmp ( xid_uuid , trx_sys_cur_xid_uuid , 8 ) ) {
ut_ad ( xid_seqno > trx_sys_cur_xid_seqno ) ;
trx_sys_cur_xid_seqno = xid_seqno ;
} else {
memcpy ( trx_sys_cur_xid_uuid , xid_uuid , 16 ) ;
}
trx_sys_cur_xid_seqno = xid_seqno ;
}
# endif /* UNIV_DEBUG */
ut_ad ( xid & & mtr ) ;
ut_a ( xid - > formatID = = - 1 | | wsrep_is_wsrep_xid ( ( const void * ) xid ) ) ;
ut_ad ( xid & & mtr ) ;
ut_a ( xid - > formatID = = - 1 | | wsrep_is_wsrep_xid ( ( const void * ) xid ) ) ;
if ( mach_read_from_4 ( sys_header + TRX_SYS_WSREP_XID_INFO
+ TRX_SYS_WSREP_XID_MAGIC_N_FLD )
! = TRX_SYS_WSREP_XID_MAGIC_N ) {
mlog_write_ulint ( sys_header + TRX_SYS_WSREP_XID_INFO
+ TRX_SYS_WSREP_XID_MAGIC_N_FLD ,
TRX_SYS_WSREP_XID_MAGIC_N ,
MLOG_4BYTES , mtr ) ;
}
mlog_write_ulint ( sys_header + TRX_SYS_WSREP_XID_INFO
+ TRX_SYS_WSREP_XID_FORMAT ,
( int ) xid - > formatID ,
MLOG_4BYTES , mtr ) ;
mlog_write_ulint ( sys_header + TRX_SYS_WSREP_XID_INFO
+ TRX_SYS_WSREP_XID_GTRID_LEN ,
( int ) xid - > gtrid_length ,
MLOG_4BYTES , mtr ) ;
mlog_write_ulint ( sys_header + TRX_SYS_WSREP_XID_INFO
+ TRX_SYS_WSREP_XID_BQUAL_LEN ,
( int ) xid - > bqual_length ,
MLOG_4BYTES , mtr ) ;
mlog_write_string ( sys_header + TRX_SYS_WSREP_XID_INFO
+ TRX_SYS_WSREP_XID_DATA ,
( const unsigned char * ) xid - > data ,
XIDDATASIZE , mtr ) ;
if ( mach_read_from_4 ( sys_header + TRX_SYS_WSREP_XID_INFO
+ TRX_SYS_WSREP_XID_MAGIC_N_FLD )
! = TRX_SYS_WSREP_XID_MAGIC_N ) {
mlog_write_ulint ( sys_header + TRX_SYS_WSREP_XID_INFO
+ TRX_SYS_WSREP_XID_MAGIC_N_FLD ,
TRX_SYS_WSREP_XID_MAGIC_N ,
MLOG_4BYTES , mtr ) ;
}
mlog_write_ulint ( sys_header + TRX_SYS_WSREP_XID_INFO
+ TRX_SYS_WSREP_XID_FORMAT ,
( int ) xid - > formatID ,
MLOG_4BYTES , mtr ) ;
mlog_write_ulint ( sys_header + TRX_SYS_WSREP_XID_INFO
+ TRX_SYS_WSREP_XID_GTRID_LEN ,
( int ) xid - > gtrid_length ,
MLOG_4BYTES , mtr ) ;
mlog_write_ulint ( sys_header + TRX_SYS_WSREP_XID_INFO
+ TRX_SYS_WSREP_XID_BQUAL_LEN ,
( int ) xid - > bqual_length ,
MLOG_4BYTES , mtr ) ;
mlog_write_string ( sys_header + TRX_SYS_WSREP_XID_INFO
+ TRX_SYS_WSREP_XID_DATA ,
( const unsigned char * ) xid - > data ,
XIDDATASIZE , mtr ) ;
}
/** Read WSREP XID from sys_header of TRX_SYS_PAGE_NO = 5.
@ param [ out ] xid Transaction XID */
void
trx_sys_read_wsrep_checkpoint ( XID * xid )
/*===================================*/
{
trx_sysf_t * sys_header ;
trx_sysf_t * sys_header ;
mtr_t mtr ;
ulint magic ;
ulint magic ;
ut_ad ( xid ) ;
ut_ad ( xid ) ;
mtr_start ( & mtr ) ;
sys_header = trx_sysf_get ( & mtr ) ;
if ( ( magic = mach_read_from_4 ( sys_header + TRX_SYS_WSREP_XID_INFO
+ TRX_SYS_WSREP_XID_MAGIC_N_FLD ) )
! = TRX_SYS_WSREP_XID_MAGIC_N ) {
memset ( xid , 0 , sizeof ( * xid ) ) ;
xid - > formatID = - 1 ;
trx_sys_update_wsrep_checkpoint ( xid , sys_header , & mtr ) ;
mtr_commit ( & mtr ) ;
return ;
if ( ( magic = mach_read_from_4 ( sys_header + TRX_SYS_WSREP_XID_INFO
+ TRX_SYS_WSREP_XID_MAGIC_N_FLD ) )
! = TRX_SYS_WSREP_XID_MAGIC_N ) {
memset ( xid , 0 , sizeof ( * xid ) ) ;
xid - > formatID = - 1 ;
trx_sys_update_wsrep_checkpoint ( xid , sys_header , & mtr ) ;
mtr_commit ( & mtr ) ;
return ;
}
xid - > formatID = ( int ) mach_read_from_4 (
sys_header
+ TRX_SYS_WSREP_XID_INFO + TRX_SYS_WSREP_XID_FORMAT ) ;
xid - > gtrid_length = ( int ) mach_read_from_4 (
sys_header
+ TRX_SYS_WSREP_XID_INFO + TRX_SYS_WSREP_XID_GTRID_LEN ) ;
xid - > bqual_length = ( int ) mach_read_from_4 (
sys_header
+ TRX_SYS_WSREP_XID_INFO + TRX_SYS_WSREP_XID_BQUAL_LEN ) ;
ut_memcpy ( xid - > data ,
sys_header + TRX_SYS_WSREP_XID_INFO + TRX_SYS_WSREP_XID_DATA ,
XIDDATASIZE ) ;
xid - > formatID = ( int ) mach_read_from_4 (
sys_header
+ TRX_SYS_WSREP_XID_INFO + TRX_SYS_WSREP_XID_FORMAT ) ;
xid - > gtrid_length = ( int ) mach_read_from_4 (
sys_header
+ TRX_SYS_WSREP_XID_INFO + TRX_SYS_WSREP_XID_GTRID_LEN ) ;
xid - > bqual_length = ( int ) mach_read_from_4 (
sys_header
+ TRX_SYS_WSREP_XID_INFO + TRX_SYS_WSREP_XID_BQUAL_LEN ) ;
ut_memcpy ( xid - > data ,
sys_header + TRX_SYS_WSREP_XID_INFO + TRX_SYS_WSREP_XID_DATA ,
XIDDATASIZE ) ;
mtr_commit ( & mtr ) ;
}