1028 lines
42 KiB
C
1028 lines
42 KiB
C
#pragma once
|
|
#ifndef _BLR_H
|
|
#define _BLR_H
|
|
/*
|
|
* Copyright (c) 2016 MariaDB Corporation Ab
|
|
*
|
|
* Use of this software is governed by the Business Source License included
|
|
* in the LICENSE.TXT file and at www.mariadb.com/bsl11.
|
|
*
|
|
* Change Date: 2020-01-01
|
|
*
|
|
* On the date above, in accordance with the Business Source License, use
|
|
* of this software will be governed by version 2 or later of the General
|
|
* Public License.
|
|
*/
|
|
|
|
/**
|
|
* @file blr.h - The binlog router header file
|
|
*/
|
|
|
|
#define MXS_MODULE_NAME "binlogrouter"
|
|
|
|
#include <maxscale/cdefs.h>
|
|
|
|
#include <openssl/aes.h>
|
|
#include <pthread.h>
|
|
#include <stdint.h>
|
|
#include <zlib.h>
|
|
|
|
#include <maxscale/buffer.h>
|
|
#include <maxscale/dcb.h>
|
|
#include <maxscale/protocol/mysql.h>
|
|
#include <maxscale/secrets.h>
|
|
#include <maxscale/service.h>
|
|
#include <maxscale/sqlite3.h>
|
|
#include <maxscale/thread.h>
|
|
|
|
MXS_BEGIN_DECLS
|
|
|
|
#define BINLOG_FNAMELEN 255
|
|
#define BLR_PROTOCOL "MySQLBackend"
|
|
#define BINLOG_MAGIC { 0xfe, 0x62, 0x69, 0x6e }
|
|
#define BINLOG_MAGIC_SIZE 4
|
|
#define BINLOG_NAMEFMT "%s.%06d"
|
|
#define BINLOG_NAME_ROOT "mysql-bin"
|
|
|
|
#define BINLOG_EVENT_HDR_LEN 19
|
|
#define BINLOG_EVENT_CRC_ALGO_TYPE 1
|
|
#define BINLOG_EVENT_CRC_SIZE 4
|
|
/* BINLOG_EVENT_LEN_OFFSET points to event_size in event_header */
|
|
#define BINLOG_EVENT_LEN_OFFSET 9
|
|
#define BINLOG_FATAL_ERROR_READING 1236
|
|
#define BINLOG_DATA_TRUNCATED 2032
|
|
|
|
/* Binlog Encryption */
|
|
#define BINLOG_ENC_ALGO_NAME_LEN 13
|
|
#define BINLOG_FLAG_ENCRYPT 1
|
|
#define BINLOG_FLAG_DECRYPT 0
|
|
#define BINLOG_AES_MAX_KEY_LEN 32
|
|
#define BINLOG_MAX_CRYPTO_SCHEME 2
|
|
#define BINLOG_SYSTEM_DATA_CRYPTO_SCHEME 1
|
|
#define BINLOG_MAX_KEYFILE_LINE_LEN 130
|
|
|
|
/* Event detail routine */
|
|
#define BLR_REPORT_CHECKSUM_FORMAT "CRC32 0x"
|
|
#define BLR_REPORT_REP_HEADER 0x02
|
|
#define BLR_CHECK_ONLY 0x04
|
|
|
|
/* MariaDB GTID string len */
|
|
#define GTID_MAX_LEN 42
|
|
|
|
/* GTID slite3 query buffer size */
|
|
#define GTID_SQL_BUFFER_SIZE 1024
|
|
|
|
/* GTID slite3 database name */
|
|
#define GTID_MAPS_DB "gtid_maps.db"
|
|
|
|
/* Number of reties for a missing binlog file */
|
|
#define MISSING_FILE_READ_RETRIES 20
|
|
/**
|
|
* Add GTID components domain and serverid as name prefix
|
|
* in SHOW FULL BINARY LOGS
|
|
*/
|
|
#define BINLOG_FILE_EXTRA_INFO GTID_MAX_LEN
|
|
|
|
/* Default MariaDB GTID Domain Id */
|
|
#define BLR_DEFAULT_GTID_DOMAIN_ID 0
|
|
|
|
enum binlog_storage_type
|
|
{
|
|
BLR_BINLOG_STORAGE_FLAT,
|
|
BLR_BINLOG_STORAGE_TREE
|
|
};
|
|
|
|
/** Conecting slave checks */
|
|
enum blr_slave_check
|
|
{
|
|
BLR_SLAVE_CONNECTING, /*< The slave starts the registration */
|
|
BLR_SLAVE_IS_MARIADB10, /*< The slave is a MariaDB10 one */
|
|
BLR_SLAVE_HAS_MARIADB10_GTID, /*< The MariaDB10 Slave has GTID request */
|
|
};
|
|
|
|
/**
|
|
* Supported Encryption algorithms
|
|
*
|
|
* Note: AES_ECB is only internally used
|
|
* Available algorithms for binlog files
|
|
* Encryption/Decryption are AES_CBC and AES_CTR
|
|
*/
|
|
enum blr_aes_mode
|
|
{
|
|
BLR_AES_CBC,
|
|
BLR_AES_CTR,
|
|
BLR_AES_ECB
|
|
};
|
|
|
|
/* Default encryption alogorithm is AES_CBC */
|
|
#define BINLOG_DEFAULT_ENC_ALGO BLR_AES_CBC
|
|
|
|
/**
|
|
* Binlog event types
|
|
*/
|
|
#define START_EVENT_V3 0x01
|
|
#define QUERY_EVENT 0x02
|
|
#define STOP_EVENT 0x03
|
|
#define ROTATE_EVENT 0x04
|
|
#define INTVAR_EVENT 0x05
|
|
#define LOAD_EVENT 0x06
|
|
#define SLAVE_EVENT 0x07
|
|
#define CREATE_FILE_EVENT 0x08
|
|
#define APPEND_BLOCK_EVENT 0x09
|
|
#define EXEC_LOAD_EVENT 0x0A
|
|
#define DELETE_FILE_EVENT 0x0B
|
|
#define NEW_LOAD_EVENT 0x0C
|
|
#define RAND_EVENT 0x0D
|
|
#define USER_VAR_EVENT 0x0E
|
|
#define FORMAT_DESCRIPTION_EVENT 0x0F
|
|
#define XID_EVENT 0x10
|
|
#define BEGIN_LOAD_QUERY_EVENT 0x11
|
|
#define EXECUTE_LOAD_QUERY_EVENT 0x12
|
|
#define TABLE_MAP_EVENT 0x13
|
|
#define WRITE_ROWS_EVENTv0 0x14
|
|
#define UPDATE_ROWS_EVENTv0 0x15
|
|
#define DELETE_ROWS_EVENTv0 0x16
|
|
#define WRITE_ROWS_EVENTv1 0x17
|
|
#define UPDATE_ROWS_EVENTv1 0x18
|
|
#define DELETE_ROWS_EVENTv1 0x19
|
|
#define INCIDENT_EVENT 0x1A
|
|
#define HEARTBEAT_EVENT 0x1B
|
|
#define IGNORABLE_EVENT 0x1C
|
|
#define ROWS_QUERY_EVENT 0x1D
|
|
#define WRITE_ROWS_EVENTv2 0x1E
|
|
#define UPDATE_ROWS_EVENTv2 0x1F
|
|
#define DELETE_ROWS_EVENTv2 0x20
|
|
#define GTID_EVENT 0x21
|
|
#define ANONYMOUS_GTID_EVENT 0x22
|
|
#define PREVIOUS_GTIDS_EVENT 0x23
|
|
|
|
#define MAX_EVENT_TYPE 0x23
|
|
|
|
/* New MariaDB event numbers start from 0xa0 */
|
|
#define MARIADB_NEW_EVENTS_BEGIN 0xa0
|
|
#define MARIADB_ANNOTATE_ROWS_EVENT 0xa0
|
|
/* New MariaDB 10 event numbers start from here */
|
|
#define MARIADB10_BINLOG_CHECKPOINT_EVENT 0xa1
|
|
#define MARIADB10_GTID_EVENT 0xa2
|
|
#define MARIADB10_GTID_GTID_LIST_EVENT 0xa3
|
|
#define MARIADB10_START_ENCRYPTION_EVENT 0xa4
|
|
|
|
#define MAX_EVENT_TYPE_MARIADB10 0xa4
|
|
|
|
/* Maximum event type so far */
|
|
#define MAX_EVENT_TYPE_END MAX_EVENT_TYPE_MARIADB10
|
|
|
|
/**
|
|
* Binlog event flags
|
|
*/
|
|
#define LOG_EVENT_BINLOG_IN_USE_F 0x0001
|
|
#define LOG_EVENT_FORCED_ROTATE_F 0x0002
|
|
#define LOG_EVENT_THREAD_SPECIFIC_F 0x0004
|
|
#define LOG_EVENT_SUPPRESS_USE_F 0x0008
|
|
#define LOG_EVENT_UPDATE_TABLE_MAP_VERSION_F 0x0010
|
|
#define LOG_EVENT_ARTIFICIAL_F 0x0020
|
|
#define LOG_EVENT_RELAY_LOG_F 0x0040
|
|
#define LOG_EVENT_IGNORABLE_F 0x0080
|
|
#define LOG_EVENT_NO_FILTER_F 0x0100
|
|
#define LOG_EVENT_MTS_ISOLATE_F 0x0200
|
|
|
|
/**
|
|
* Binlog COM_BINLOG_DUMP flags
|
|
*/
|
|
#define BLR_REQUEST_ANNOTATE_ROWS_EVENT 2
|
|
|
|
/** MaxScale generated events */
|
|
typedef enum
|
|
{
|
|
BLRM_IGNORABLE, /*< Ignorable event */
|
|
BLRM_START_ENCRYPTION /*< Start Encryption event */
|
|
} generated_event_t;
|
|
|
|
/**
|
|
* How often to call the binlog status function (seconds)
|
|
*/
|
|
#define BLR_STATS_FREQ 60
|
|
#define BLR_NSTATS_MINUTES 30
|
|
|
|
/**
|
|
* High and Low water marks for the slave dcb.
|
|
* These values can be overriden
|
|
* by the router options highwater and lowwater.
|
|
*/
|
|
#define DEF_LOW_WATER "1000"
|
|
#define DEF_HIGH_WATER "10000"
|
|
|
|
/**
|
|
* Default burst sizes for slave catchup
|
|
*/
|
|
#define DEF_SHORT_BURST "15"
|
|
#define DEF_LONG_BURST "500"
|
|
#define DEF_BURST_SIZE "1024000" /* 1 Mb */
|
|
|
|
/**
|
|
* master reconnect backoff constants
|
|
* BLR_MASTER_BACKOFF_TIME The increments of the back off time (seconds)
|
|
* BLR_MASTER_CONNECT_RETRY The connect retry interval
|
|
* BLR_BLR_MASTER_RETRY_COUNT Maximum value of retries
|
|
*/
|
|
#define BLR_MASTER_BACKOFF_TIME 10
|
|
#define BLR_MASTER_CONNECT_RETRY "60"
|
|
#define BLR_MASTER_RETRY_COUNT "1000"
|
|
|
|
/* Default value for @@max_connections SQL var */
|
|
#define BLR_DEFAULT_MAX_CONNS 151
|
|
|
|
/* max size for error message returned to client */
|
|
#define BINLOG_ERROR_MSG_LEN 700
|
|
|
|
/* network latency extra wait tme for heartbeat check */
|
|
#define BLR_NET_LATENCY_WAIT_TIME 1
|
|
|
|
/* default heartbeat interval in seconds */
|
|
#define BLR_HEARTBEAT_DEFAULT_INTERVAL "300"
|
|
|
|
/* Max heartbeat interval in seconds */
|
|
#define BLR_HEARTBEAT_MAX_INTERVAL 4294967
|
|
|
|
/* strings and numbers in SQL replies */
|
|
#define BLR_TYPE_STRING 0xf
|
|
#define BLR_TYPE_INT 0x03
|
|
|
|
/* string len for COM_STATISTICS output */
|
|
#define BLRM_COM_STATISTICS_SIZE 1000
|
|
|
|
/* string len for strerror_r message */
|
|
#define BLRM_STRERROR_R_MSG_SIZE 128
|
|
|
|
/* string len for task message name */
|
|
#define BLRM_TASK_NAME_LEN 80
|
|
|
|
/* string len for temp binlog filename */
|
|
#define BLRM_BINLOG_NAME_STR_LEN 80
|
|
|
|
/* string len for temp binlog filename */
|
|
#define BLRM_SET_HEARTBEAT_QUERY_LEN 80
|
|
|
|
/* string len for master registration query */
|
|
#define BLRM_MASTER_REGITRATION_QUERY_LEN 255
|
|
|
|
/* Read Binlog position states */
|
|
#define SLAVE_POS_READ_OK 0x00
|
|
#define SLAVE_POS_READ_ERR 0xff
|
|
#define SLAVE_POS_READ_UNSAFE 0xfe
|
|
#define SLAVE_POS_BAD_FD 0xfd
|
|
#define SLAVE_POS_BEYOND_EOF 0xfc
|
|
|
|
/* MariadDB 10 GTID event flags */
|
|
#define MARIADB_FL_DDL 32
|
|
#define MARIADB_FL_STANDALONE 1
|
|
|
|
/* Maxwell-related SQL queries */
|
|
#define MYSQL_CONNECTOR_SERVER_VARS_QUERY "SELECT " \
|
|
"@@session.auto_increment_increment AS auto_increment_increment, " \
|
|
"@@character_set_client AS character_set_client, " \
|
|
"@@character_set_connection AS character_set_connection, " \
|
|
"@@character_set_results AS character_set_results, " \
|
|
"@@character_set_server AS character_set_server, " \
|
|
"@@init_connect AS init_connect, " \
|
|
"@@interactive_timeout AS interactive_timeout, " \
|
|
"@@license AS license, " \
|
|
"@@lower_case_table_names AS lower_case_table_names, " \
|
|
"@@max_allowed_packet AS max_allowed_packet, " \
|
|
"@@net_buffer_length AS net_buffer_length, " \
|
|
"@@net_write_timeout AS net_write_timeout, " \
|
|
"@@query_cache_size AS query_cache_size, " \
|
|
"@@query_cache_type AS query_cache_type, " \
|
|
"@@sql_mode AS sql_mode, " \
|
|
"@@system_time_zone AS system_time_zone, " \
|
|
"@@time_zone AS time_zone, " \
|
|
"@@tx_isolation AS tx_isolation, " \
|
|
"@@wait_timeout AS wait_timeout"
|
|
|
|
#define MYSQL_CONNECTOR_SQL_MODE_QUERY "SET sql_mode=" \
|
|
"'NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES'"
|
|
|
|
/* Saved credential file name's tail */
|
|
static const char BLR_DBUSERS_DIR[] = "cache/users";
|
|
static const char BLR_DBUSERS_FILE[] = "dbusers";
|
|
|
|
/**
|
|
* Some useful macros for examining the MySQL Response packets
|
|
*/
|
|
#define MYSQL_RESPONSE_OK(buf) (*((uint8_t *)GWBUF_DATA(buf) + 4) == 0x00)
|
|
#define MYSQL_RESPONSE_EOF(buf) (*((uint8_t *)GWBUF_DATA(buf) + 4) == 0xfe)
|
|
#define MYSQL_RESPONSE_ERR(buf) (*((uint8_t *)GWBUF_DATA(buf) + 4) == 0xff)
|
|
#define MYSQL_ERROR_CODE(buf) ((uint8_t *)GWBUF_DATA(buf) + 5)
|
|
#define MYSQL_ERROR_MSG(buf) ((uint8_t *)GWBUF_DATA(buf) + 7)
|
|
#define MYSQL_COMMAND(buf) (*((uint8_t *)GWBUF_DATA(buf) + 4))
|
|
|
|
/** Possible states of an event sent by the master */
|
|
enum blr_event_state
|
|
{
|
|
BLR_EVENT_STARTED, /*< The first packet of an event has been received */
|
|
BLR_EVENT_ONGOING, /*< Other packets of a multi-packet event are being processed */
|
|
BLR_EVENT_DONE, /*< The complete event was received */
|
|
};
|
|
|
|
/** MariaDB GTID elements */
|
|
typedef struct mariadb_gtid_elems
|
|
{
|
|
uint32_t domain_id; /*< The replication domain */
|
|
uint32_t server_id; /*< The serverid */
|
|
uint64_t seq_no; /*< The sequence number */
|
|
} MARIADB_GTID_ELEMS;
|
|
|
|
/** MariaDB GTID info */
|
|
typedef struct mariadb_gtid_info
|
|
{
|
|
char gtid[GTID_MAX_LEN + 1]; /** MariaDB 10.x GTID, string value */
|
|
char file[BINLOG_FNAMELEN + 1]; /** The binlog file */
|
|
uint64_t start; /** The BEGIN pos: i.e the GTID event */
|
|
uint64_t end; /** The next_pos in COMMIT event */
|
|
MARIADB_GTID_ELEMS gtid_elms; /** MariaDB 10.x GTID components */
|
|
} MARIADB_GTID_INFO;
|
|
|
|
/* Master Server configuration struct */
|
|
typedef struct master_server_config
|
|
{
|
|
char *host;
|
|
unsigned short port;
|
|
char logfile[BINLOG_FNAMELEN + 1];
|
|
uint64_t pos;
|
|
uint64_t safe_pos;
|
|
char *user;
|
|
char *password;
|
|
char *filestem;
|
|
/* SSL options */
|
|
char *ssl_key;
|
|
char *ssl_cert;
|
|
char *ssl_ca;
|
|
int ssl_enabled;
|
|
char *ssl_version;
|
|
/* Connect options */
|
|
int heartbeat;
|
|
} MASTER_SERVER_CFG;
|
|
|
|
/* Config struct for CHANGE MASTER TO options */
|
|
typedef struct change_master_options
|
|
{
|
|
char *host;
|
|
char *port;
|
|
char *binlog_file;
|
|
char *binlog_pos;
|
|
char *user;
|
|
char *password;
|
|
/* SSL options */
|
|
char *ssl_key;
|
|
char *ssl_cert;
|
|
char *ssl_ca;
|
|
char *ssl_enabled;
|
|
char *ssl_version;
|
|
/* MariaDB 10 GTID */
|
|
char *use_mariadb10_gtid;
|
|
/* Connection options */
|
|
char *heartbeat_period;
|
|
char *connect_retry;
|
|
} CHANGE_MASTER_OPTIONS;
|
|
|
|
/**
|
|
* Packet header for replication messages
|
|
*/
|
|
typedef struct rep_header
|
|
{
|
|
int payload_len; /*< Payload length (24 bits) */
|
|
uint8_t seqno; /*< Response sequence number */
|
|
uint8_t ok; /*< OK Byte from packet */
|
|
uint32_t timestamp; /*< Timestamp - start of binlog record */
|
|
uint8_t event_type; /*< Binlog event type */
|
|
uint32_t serverid; /*< Server id of master */
|
|
uint32_t event_size; /*< Size of header, post-header and body */
|
|
uint32_t next_pos; /*< Position of next event */
|
|
uint16_t flags; /*< Event flags */
|
|
} REP_HEADER;
|
|
|
|
/**
|
|
* The binlog record structure. This contains the actual packet read from the binlog
|
|
* file.
|
|
*/
|
|
typedef struct
|
|
{
|
|
unsigned long position; /*< binlog record position for this cache entry */
|
|
GWBUF *pkt; /*< The packet received from the master */
|
|
REP_HEADER hdr; /*< The packet header */
|
|
} BLCACHE_RECORD;
|
|
|
|
/**
|
|
* The binlog cache. A cache exists for each file that hold cached bin log records.
|
|
* Caches will be used for all files being read by more than 1 slave.
|
|
*/
|
|
typedef struct
|
|
{
|
|
BLCACHE_RECORD **records; /*< The actual binlog records */
|
|
int current; /*< The next record that will be inserted */
|
|
int cnt; /*< The number of records in the cache */
|
|
SPINLOCK lock; /*< The spinlock for the cache */
|
|
} BLCACHE;
|
|
|
|
typedef struct blfile
|
|
{
|
|
char binlogname[BINLOG_FNAMELEN + 1];
|
|
/*< Name of the binlog file */
|
|
int fd; /*< Actual file descriptor */
|
|
int refcnt; /*< Reference count for file */
|
|
BLCACHE *cache; /*< Record cache for this file */
|
|
SPINLOCK lock; /*< The file lock */
|
|
MARIADB_GTID_ELEMS info; /*< Elements for file prefix */
|
|
struct blfile *next; /*< Next file in list */
|
|
} BLFILE;
|
|
|
|
/**
|
|
* Slave statistics
|
|
*/
|
|
typedef struct
|
|
{
|
|
int n_events; /*< Number of events sent */
|
|
unsigned long n_bytes; /*< Number of bytes sent */
|
|
int n_bursts; /*< Number of bursts sent */
|
|
int n_requests; /*< Number of requests received */
|
|
int n_flows; /*< Number of flow control restarts */
|
|
int n_queries; /*< Number of SQL queries */
|
|
int n_upd;
|
|
int n_cb;
|
|
int n_cbna;
|
|
int n_dcb;
|
|
int n_above;
|
|
int n_failed_read;
|
|
int n_overrun;
|
|
int n_caughtup;
|
|
int n_actions[3];
|
|
uint64_t lastsample;
|
|
int minno;
|
|
int minavgs[BLR_NSTATS_MINUTES];
|
|
} SLAVE_STATS;
|
|
|
|
typedef enum blr_thread_role
|
|
{
|
|
BLR_THREAD_ROLE_MASTER_LARGE_NOTRX,
|
|
BLR_THREAD_ROLE_MASTER_NOTRX,
|
|
BLR_THREAD_ROLE_MASTER_TRX,
|
|
BLR_THREAD_ROLE_SLAVE
|
|
} blr_thread_role_t;
|
|
|
|
#define ROLETOSTR(r) r == BLR_THREAD_ROLE_MASTER_LARGE_NOTRX ? "master (large event, no trx)" : \
|
|
r == BLR_THREAD_ROLE_MASTER_NOTRX ? "master (no trx)" : \
|
|
r == BLR_THREAD_ROLE_MASTER_TRX ? "master (trx)" : "slave"
|
|
|
|
/**
|
|
* The client session structure used within this router. This represents
|
|
* the slaves that are replicating binlogs from MaxScale.
|
|
*/
|
|
typedef struct router_slave
|
|
{
|
|
#if defined(SS_DEBUG)
|
|
skygw_chk_t rses_chk_top;
|
|
#endif
|
|
DCB *dcb; /*< The slave server DCB */
|
|
int state; /*< The state of this slave */
|
|
uint32_t binlog_pos; /*< Binlog position for this slave */
|
|
char binlogfile[BINLOG_FNAMELEN + 1];
|
|
/*< Current binlog file for this slave */
|
|
char *uuid; /*< Slave UUID */
|
|
#ifdef BLFILE_IN_SLAVE
|
|
BLFILE *file; /*< Currently open binlog file */
|
|
#endif
|
|
int serverid; /*< Server-id of the slave */
|
|
char *hostname; /*< Hostname of the slave, if known */
|
|
char *user; /*< Username if given */
|
|
char *passwd; /*< Password if given */
|
|
short port; /*< MySQL port */
|
|
int nocrc; /*< Disable CRC */
|
|
int overrun;
|
|
uint32_t rank; /*< Replication rank */
|
|
uint8_t seqno; /*< Replication dump sequence no */
|
|
uint32_t lastEventTimestamp;
|
|
/*< Last event timestamp sent */
|
|
SPINLOCK catch_lock; /*< Event catchup lock */
|
|
unsigned int cstate; /*< Catch up state */
|
|
bool mariadb10_compat;/*< MariaDB 10.0 compatibility */
|
|
SPINLOCK rses_lock; /*< Protects rses_deleted */
|
|
pthread_t pthread;
|
|
struct router_instance *router; /*< Pointer to the owning router */
|
|
struct router_slave *next;
|
|
SLAVE_STATS stats; /*< Slave statistics */
|
|
time_t connect_time; /*< Connect time of slave */
|
|
char *warning_msg; /*< Warning message */
|
|
int heartbeat; /*< Heartbeat in seconds */
|
|
uint8_t lastEventReceived;
|
|
/*< Last event received */
|
|
time_t lastReply; /*< Last event sent */
|
|
/*< lsi: Last Sent Information */
|
|
blr_thread_role_t lsi_sender_role;
|
|
/*< Master or slave code sent */
|
|
THREAD lsi_sender_tid;
|
|
/*< Who sent */
|
|
char lsi_binlog_name[BINLOG_FNAMELEN + 1];
|
|
/*< Which binlog file */
|
|
uint32_t lsi_binlog_pos;
|
|
/*< What position */
|
|
void *encryption_ctx;
|
|
/*< Encryption context */
|
|
bool gtid_strict_mode;
|
|
/*< MariaDB 10 Slave sets gtid_strict_mode */
|
|
char *mariadb_gtid; /*< MariaDB 10 Slave connects with GTID */
|
|
sqlite3 *gtid_maps; /*< GTID storage client handle, read only*/
|
|
MARIADB_GTID_INFO f_info; /*< GTID info for file name prefix */
|
|
bool annotate_rows; /*< MariaDB 10 Slave requests ANNOTATE_ROWS */
|
|
#if defined(SS_DEBUG)
|
|
skygw_chk_t rses_chk_tail;
|
|
#endif
|
|
} ROUTER_SLAVE;
|
|
|
|
|
|
/**
|
|
* The statistics for this router instance
|
|
*/
|
|
typedef struct
|
|
{
|
|
int n_slaves; /*< Number slave sessions created */
|
|
int n_reads; /*< Number of record reads */
|
|
uint64_t n_binlogs; /*< Number of binlog records from master */
|
|
uint64_t n_binlogs_ses; /*< Number of binlog records from master */
|
|
uint64_t n_binlog_errors;/*< Number of binlog records from master */
|
|
uint64_t n_rotates; /*< Number of binlog rotate events */
|
|
uint64_t n_cachehits; /*< Number of hits on the binlog cache */
|
|
uint64_t n_cachemisses; /*< Number of misses on the binlog cache */
|
|
int n_registered; /*< Number of registered slaves */
|
|
int n_masterstarts; /*< Number of times connection restarted */
|
|
int n_delayedreconnects;
|
|
int n_residuals; /*< Number of times residual data was buffered */
|
|
int n_heartbeats; /*< Number of heartbeat messages */
|
|
time_t lastReply;
|
|
uint64_t n_fakeevents; /*< Fake events not written to disk */
|
|
uint64_t n_artificial; /*< Artificial events not written to disk */
|
|
int n_badcrc; /*< No. of bad CRC's from master */
|
|
uint64_t events[MAX_EVENT_TYPE_END + 1]; /*< Per event counters */
|
|
uint64_t lastsample;
|
|
int minno;
|
|
int minavgs[BLR_NSTATS_MINUTES];
|
|
} ROUTER_STATS;
|
|
|
|
/**
|
|
* Saved responses from the master that will be forwarded to slaves
|
|
*/
|
|
typedef struct
|
|
{
|
|
GWBUF *server_id; /*< Master server id */
|
|
GWBUF *heartbeat; /*< Heartbeat period */
|
|
GWBUF *chksum1; /*< Binlog checksum 1st response */
|
|
GWBUF *chksum2; /*< Binlog checksum 2nd response */
|
|
GWBUF *gtid_mode; /*< GTID Mode response */
|
|
GWBUF *uuid; /*< Master UUID */
|
|
GWBUF *setslaveuuid; /*< Set Slave UUID */
|
|
GWBUF *setnames; /*< Set NAMES latin1 */
|
|
GWBUF *utf8; /*< Set NAMES utf8 */
|
|
GWBUF *select1; /*< select 1 */
|
|
GWBUF *selectver; /*< select version() */
|
|
GWBUF *selectvercom; /*< select @@version_comment */
|
|
GWBUF *selecthostname; /*< select @@hostname */
|
|
GWBUF *map; /*< select @@max_allowed_packet */
|
|
GWBUF *mariadb10; /*< set @mariadb_slave_capability */
|
|
GWBUF *server_vars; /*< MySQL Connector master server variables */
|
|
GWBUF *binlog_vars; /*< SELECT @@global.log_bin,
|
|
* @@global.binlog_format,
|
|
* @@global.binlog_row_image;
|
|
*/
|
|
GWBUF *lower_case_tables; /*< select @@lower_case_table_names */
|
|
} MASTER_RESPONSES;
|
|
|
|
/**
|
|
* The binlog encryption setup
|
|
*/
|
|
typedef struct binlog_encryption_setup
|
|
{
|
|
bool enabled;
|
|
int encryption_algorithm;
|
|
char *key_management_filename;
|
|
uint8_t key_value[BINLOG_AES_MAX_KEY_LEN];
|
|
unsigned long key_len;
|
|
uint8_t key_id;
|
|
} BINLOG_ENCRYPTION_SETUP;
|
|
|
|
/** Transaction States */
|
|
typedef enum
|
|
{
|
|
BLRM_NO_TRANSACTION, /*< No transaction */
|
|
BLRM_TRANSACTION_START, /*< A transaction is open*/
|
|
BLRM_COMMIT_SEEN, /*< Received COMMIT event in the current trx */
|
|
BLRM_XID_EVENT_SEEN, /*< Received XID event of current transaction */
|
|
BLRM_STANDALONE_SEEN /*< Received a standalone event, ie: a DDL */
|
|
} master_transaction_t;
|
|
|
|
/** Transaction Details */
|
|
typedef struct pending_transaction
|
|
{
|
|
char gtid[GTID_MAX_LEN + 1]; /*< MariaDB 10.x GTID */
|
|
master_transaction_t state; /*< Transaction state */
|
|
uint64_t start_pos; /*< The BEGIN pos */
|
|
uint64_t end_pos; /*< The next_pos in COMMIT event */
|
|
MARIADB_GTID_ELEMS gtid_elms; /*< MariaDB 10.x GTID components */
|
|
bool standalone; /*< Standalone event, such as DDL
|
|
* no terminating COMMIT
|
|
*/
|
|
} PENDING_TRANSACTION;
|
|
|
|
/**
|
|
* The per instance data for the router.
|
|
*/
|
|
typedef struct router_instance
|
|
{
|
|
SERVICE *service; /*< Pointer to the service using this router */
|
|
ROUTER_SLAVE *slaves; /*< Link list of all the slave connections */
|
|
SPINLOCK lock; /*< Spinlock for the instance data */
|
|
char *uuid; /*< UUID for the router to use w/master */
|
|
int orig_masterid; /*< Server ID of the master, internally used */
|
|
int masterid; /*< Set ID of the master, sent to slaves */
|
|
int serverid; /*< ID for the router to use w/master */
|
|
int initbinlog; /*< Initial binlog file number */
|
|
char *user; /*< User name to use with master */
|
|
char *password; /*< Password to use with master */
|
|
char *fileroot; /*< Root of binlog filename */
|
|
bool master_chksum; /*< Does the master provide checksums */
|
|
bool mariadb10_compat;
|
|
/*< MariaDB 10.0 compatibility */
|
|
bool maxwell_compat; /*< Zendesk's Maxwell compatibility */
|
|
char *master_uuid; /*< Set UUID of the master, sent to slaves */
|
|
DCB *master; /*< DCB for master connection */
|
|
DCB *client; /*< DCB for dummy client */
|
|
MXS_SESSION *session; /*< Fake session for master connection */
|
|
unsigned int master_state; /*< State of the master FSM */
|
|
uint8_t lastEventReceived;
|
|
/*< Last event received */
|
|
uint32_t lastEventTimestamp;
|
|
/*< Timestamp from last event */
|
|
MASTER_RESPONSES saved_master; /*< Saved master responses */
|
|
char *binlogdir; /*< The directory with the binlog files */
|
|
SPINLOCK binlog_lock; /*< Lock to control update of the binlog position */
|
|
int trx_safe; /*< Detect and handle partial transactions */
|
|
PENDING_TRANSACTION pending_transaction;
|
|
/*< Pending transaction */
|
|
enum blr_event_state master_event_state;
|
|
/*< Packet read state */
|
|
REP_HEADER stored_header;
|
|
/*< Replication header of the event the master is sending */
|
|
GWBUF *stored_event; /*< Buffer where partial events are stored */
|
|
uint64_t last_safe_pos; /* last committed transaction */
|
|
char binlog_name[BINLOG_FNAMELEN + 1];
|
|
/*< Name of the current binlog file */
|
|
uint64_t binlog_position;/*< last committed transaction position */
|
|
uint64_t current_pos; /*< Current binlog position */
|
|
int binlog_fd; /*< File descriptor of the binlog
|
|
* file being written
|
|
*/
|
|
uint64_t last_written; /*< Position of the last write operation */
|
|
uint64_t last_event_pos; /*< Position of last event written */
|
|
uint64_t current_safe_event;
|
|
/*< Position of the latest safe event being sent to slaves */
|
|
char prevbinlog[BINLOG_FNAMELEN + 1];
|
|
int rotating; /*< Rotation in progress flag */
|
|
BLFILE *files; /*< Files used by the slaves */
|
|
SPINLOCK fileslock; /*< Lock for the files queue above */
|
|
unsigned int short_burst; /*< Short burst for slave catchup */
|
|
unsigned int long_burst; /*< Long burst for slave catchup */
|
|
unsigned long burst_size; /*< Maximum size of burst to send */
|
|
unsigned long heartbeat; /*< Configured heartbeat value */
|
|
ROUTER_STATS stats; /*< Statistics for this router */
|
|
int active_logs;
|
|
int reconnect_pending;
|
|
int retry_interval; /*< Connect retry interval */
|
|
int retry_count; /*< Connect retry counter */
|
|
int retry_limit; /*< Retry limit */
|
|
time_t connect_time;
|
|
int handling_threads;
|
|
unsigned long m_errno; /*< master response mysql errno */
|
|
char *m_errmsg; /*< master response mysql error message */
|
|
char *set_master_version; /*< Send custom Version to slaves */
|
|
char *set_master_hostname; /*< Send custom Hostname to slaves */
|
|
bool set_master_uuid; /*< Send custom Master UUID to slaves */
|
|
bool set_master_server_id; /*< Send custom Master server_id to slaves */
|
|
int send_slave_heartbeat; /*< Enable sending heartbeat to slaves */
|
|
bool ssl_enabled; /*< Use SSL connection to master */
|
|
int ssl_cert_verification_depth;
|
|
/*< The maximum length of the certificate
|
|
* authority chain that will be accepted.
|
|
*/
|
|
char *ssl_key; /*< config Certificate Key for Master SSL connection */
|
|
char *ssl_ca; /*< config CA Certificate for Master SSL connection */
|
|
char *ssl_cert; /*< config Certificate for Master SSL connection */
|
|
char *ssl_version; /*< config TLS Version for Master SSL connection */
|
|
bool request_semi_sync; /*< Request Semi-Sync replication to master */
|
|
int master_semi_sync; /*< Semi-Sync replication status of master server */
|
|
BINLOG_ENCRYPTION_SETUP encryption; /*< Binlog encryption setup */
|
|
void *encryption_ctx; /*< Encryption context */
|
|
char last_mariadb_gtid[GTID_MAX_LEN + 1];
|
|
/*< Last seen MariaDB 10 GTID */
|
|
bool mariadb10_gtid; /*< Save received MariaDB GTIDs into repo.
|
|
* This allows MariaDB 10 slave servers
|
|
* connecting with GTID
|
|
*/
|
|
bool mariadb10_master_gtid;/*< Enables MariaDB 10 GTID registration
|
|
* to MariaDB 10.0/10.1 Master
|
|
*/
|
|
uint32_t mariadb10_gtid_domain;/*< MariaDB 10 GTID Domain ID */
|
|
sqlite3 *gtid_maps; /*< MariaDB 10 GTID storage */
|
|
enum binlog_storage_type storage_type;/*< Enables hierachical binlog file storage */
|
|
char *set_slave_hostname; /*< Send custom Hostname to Master */
|
|
struct router_instance *next;
|
|
} ROUTER_INSTANCE;
|
|
|
|
/**
|
|
* Binlog encryption context of slave binlog file
|
|
*/
|
|
|
|
typedef struct slave_encryption_ctx
|
|
{
|
|
uint8_t binlog_crypto_scheme; /**< Encryption scheme */
|
|
uint32_t binlog_key_version; /**< Encryption key version */
|
|
uint8_t nonce[AES_BLOCK_SIZE]; /**< nonce (random bytes) of current binlog.
|
|
* These bytes + the binlog event current pos
|
|
* form the encrryption IV for the event */
|
|
char *log_file; /**< The log file the client has requested */
|
|
uint32_t first_enc_event_pos; /**< The position of first encrypted event
|
|
* It's the first event afte Start_encryption_event
|
|
* which is after FDE */
|
|
} SLAVE_ENCRYPTION_CTX;
|
|
|
|
/**
|
|
* Binlog encryption context of binlog file
|
|
*/
|
|
|
|
typedef struct binlog_encryption_ctx
|
|
{
|
|
uint8_t binlog_crypto_scheme; /**< Encryption scheme */
|
|
uint32_t binlog_key_version; /**< Encryption key version */
|
|
uint8_t nonce[AES_BLOCK_SIZE]; /**< nonce (random bytes) of current binlog.
|
|
* These bytes + the binlog event current pos
|
|
* form the encrryption IV for the event */
|
|
char *binlog_file; /**< Current binlog file being encrypted */
|
|
} BINLOG_ENCRYPTION_CTX;
|
|
|
|
/**
|
|
* Holds information about:
|
|
* truncating a corrupted file
|
|
* or replace an event at specified pos
|
|
* or replace a transaction that start
|
|
* at specified pos
|
|
*/
|
|
|
|
typedef struct binlog_pos_fix
|
|
{
|
|
bool fix; /**< Truncate file to last safe pos */
|
|
uint64_t pos; /**< Position of the event to be replaced
|
|
* by an Ignorable Event
|
|
*/
|
|
bool replace_trx; /**< Replace all events belonging to
|
|
* a transaction starting at pos
|
|
*/
|
|
} BINLOG_FILE_FIX;
|
|
|
|
/**
|
|
* Defines and offsets for binlog encryption
|
|
*
|
|
* BLRM_FDE_EVENT_TYPES_OFFSET is the offset
|
|
* in FDE event content that points to
|
|
* the number of events the master server supports.
|
|
*/
|
|
#define BLR_FDE_EVENT_BINLOG_VERSION 2
|
|
#define BLR_FDE_EVENT_SERVER_VERSION 50
|
|
#define BLR_FDE_EVENT_BINLOG_TIME 4
|
|
#define BLR_FDE_EVENT_BINLOG_EVENT_HDR_LEN 1
|
|
#define BLRM_FDE_EVENT_TYPES_OFFSET (BLR_FDE_EVENT_BINLOG_VERSION + \
|
|
BLR_FDE_EVENT_SERVER_VERSION + \
|
|
BLR_FDE_EVENT_BINLOG_TIME + \
|
|
BLR_FDE_EVENT_BINLOG_EVENT_HDR_LEN)
|
|
#define BLRM_CRYPTO_SCHEME_LENGTH 1
|
|
#define BLRM_KEY_VERSION_LENGTH 4
|
|
#define BLRM_IV_LENGTH AES_BLOCK_SIZE
|
|
#define BLRM_IV_OFFS_LENGTH 4
|
|
#define BLRM_NONCE_LENGTH (BLRM_IV_LENGTH - BLRM_IV_OFFS_LENGTH)
|
|
|
|
/**
|
|
* State machine for the master to MaxScale replication
|
|
*/
|
|
#define BLRM_UNCONFIGURED 0x0000
|
|
#define BLRM_UNCONNECTED 0x0001
|
|
#define BLRM_CONNECTING 0x0002
|
|
#define BLRM_AUTHENTICATED 0x0003
|
|
#define BLRM_TIMESTAMP 0x0004
|
|
#define BLRM_SERVERID 0x0005
|
|
#define BLRM_HBPERIOD 0x0006
|
|
#define BLRM_CHKSUM1 0x0007
|
|
#define BLRM_CHKSUM2 0x0008
|
|
#define BLRM_MARIADB10 0x0009
|
|
#define BLRM_MARIADB10_GTID_DOMAIN 0x000A
|
|
#define BLRM_MARIADB10_REQUEST_GTID 0x000B
|
|
#define BLRM_MARIADB10_GTID_STRICT 0x000C
|
|
#define BLRM_MARIADB10_GTID_NO_DUP 0x000D
|
|
#define BLRM_GTIDMODE 0x000E
|
|
#define BLRM_MUUID 0x000F
|
|
#define BLRM_SUUID 0x0010
|
|
#define BLRM_LATIN1 0x0011
|
|
#define BLRM_UTF8 0x0012
|
|
#define BLRM_RESULTS_CHARSET 0x0013
|
|
#define BLRM_SQL_MODE 0x0014
|
|
#define BLRM_SELECT1 0x0015
|
|
#define BLRM_SELECTVER 0x0016
|
|
#define BLRM_SELECTVERCOM 0x0017
|
|
#define BLRM_SELECTHOSTNAME 0x0018
|
|
#define BLRM_MAP 0x0019
|
|
#define BLRM_SERVER_VARS 0x001A
|
|
#define BLRM_BINLOG_VARS 0x001B
|
|
#define BLRM_LOWER_CASE_TABLES 0x001C
|
|
#define BLRM_REGISTER_READY 0x001D
|
|
#define BLRM_REGISTER 0x001E
|
|
#define BLRM_CHECK_SEMISYNC 0x001F
|
|
#define BLRM_REQUEST_SEMISYNC 0x0020
|
|
#define BLRM_REQUEST_BINLOGDUMP 0x0021
|
|
#define BLRM_BINLOGDUMP 0x0022
|
|
#define BLRM_SLAVE_STOPPED 0x0023
|
|
|
|
#define BLRM_MAXSTATE 0x0023
|
|
|
|
static char *blrm_states[] =
|
|
{
|
|
"Unconfigured",
|
|
"Unconnected",
|
|
"Connecting",
|
|
"Authenticated",
|
|
"Timestamp retrieval",
|
|
"Server ID retrieval",
|
|
"HeartBeat Period setup",
|
|
"binlog checksum config",
|
|
"binlog checksum rerieval",
|
|
"Set MariaDB10 slave capability",
|
|
"MariaDB10 GTID Domain retrieval",
|
|
"Set MariaDB10 GTID Request",
|
|
"Set MariaDB10 GTID strict mode",
|
|
"Set MariaDB10 GTID ignore duplicates",
|
|
"GTID Mode retrieval",
|
|
"Master UUID retrieval",
|
|
"Set Slave UUID",
|
|
"Set Names latin1",
|
|
"Set Names utf8",
|
|
"Set results charset null",
|
|
"Set sql_mode",
|
|
"select 1",
|
|
"select version()",
|
|
"select @@version_comment",
|
|
"select @@hostname",
|
|
"select @@max_allowed_packet",
|
|
"Query server variables",
|
|
"Query binlog variables",
|
|
"Query @@lower_case_table_names",
|
|
"Ready to Register",
|
|
"Register slave",
|
|
"Semi-Sync Support retrivial",
|
|
"Request Semi-Sync Replication",
|
|
"Request Binlog Dump",
|
|
"Binlog Dump",
|
|
"Slave stopped"
|
|
};
|
|
|
|
#define BLRS_CREATED 0x0000
|
|
#define BLRS_UNREGISTERED 0x0001
|
|
#define BLRS_REGISTERED 0x0002
|
|
#define BLRS_DUMPING 0x0003
|
|
#define BLRS_ERRORED 0x0004
|
|
|
|
#define BLRS_MAXSTATE 0x0004
|
|
|
|
static char *blrs_states[] =
|
|
{
|
|
"Created",
|
|
"Unregistered",
|
|
"Registered",
|
|
"Sending binlogs",
|
|
"Errored"
|
|
};
|
|
|
|
/**
|
|
* Slave catch-up status
|
|
*/
|
|
#define CS_UNDEFINED 0x0000
|
|
#define CS_EXPECTCB 0x0004
|
|
#define CS_WAIT_DATA 0x0020
|
|
#define CS_BUSY 0x0040
|
|
|
|
/**
|
|
* MySQL protocol OpCodes needed for replication
|
|
*/
|
|
#define COM_QUIT 0x01
|
|
#define COM_QUERY 0x03
|
|
#define COM_STATISTICS 0x09
|
|
#define COM_PING 0x0e
|
|
#define COM_REGISTER_SLAVE 0x15
|
|
#define COM_BINLOG_DUMP 0x12
|
|
|
|
/**
|
|
* Macros to extract common fields
|
|
*/
|
|
#define INLINE_EXTRACT 1 /* Set to 0 for debug purposes */
|
|
|
|
#if INLINE_EXTRACT
|
|
#define EXTRACT16(x) (*(uint8_t *)(x) | (*((uint8_t *)(x) + 1) << 8))
|
|
#define EXTRACT24(x) (*(uint8_t *)(x) | \
|
|
(*((uint8_t *)(x) + 1) << 8) | \
|
|
(*((uint8_t *)(x) + 2) << 16))
|
|
#define EXTRACT32(x) (*(uint8_t *)(x) | \
|
|
(*((uint8_t *)(x) + 1) << 8) | \
|
|
(*((uint8_t *)(x) + 2) << 16) | \
|
|
(*((uint8_t *)(x) + 3) << 24))
|
|
#else
|
|
#define EXTRACT16(x) extract_field((x), 16)
|
|
#define EXTRACT24(x) extract_field((x), 24)
|
|
#define EXTRACT32(x) extract_field((x), 32)
|
|
#endif
|
|
|
|
/*
|
|
* Externals within the router
|
|
*/
|
|
extern void blr_master_response(ROUTER_INSTANCE *, GWBUF *);
|
|
extern void blr_master_reconnect(ROUTER_INSTANCE *);
|
|
extern int blr_master_connected(ROUTER_INSTANCE *);
|
|
|
|
extern int blr_slave_request(ROUTER_INSTANCE *,
|
|
ROUTER_SLAVE *,
|
|
GWBUF *);
|
|
extern void blr_slave_rotate(ROUTER_INSTANCE *,
|
|
ROUTER_SLAVE *,
|
|
uint8_t *);
|
|
extern int blr_slave_catchup(ROUTER_INSTANCE *router,
|
|
ROUTER_SLAVE *slave,
|
|
bool large);
|
|
extern void blr_init_cache(ROUTER_INSTANCE *);
|
|
|
|
extern int blr_file_init(ROUTER_INSTANCE *);
|
|
extern int blr_write_binlog_record(ROUTER_INSTANCE *,
|
|
REP_HEADER *,
|
|
uint32_t pos,
|
|
uint8_t *);
|
|
extern int blr_file_rotate(ROUTER_INSTANCE *,
|
|
char *,
|
|
uint64_t);
|
|
extern void blr_file_flush(ROUTER_INSTANCE *);
|
|
extern BLFILE *blr_open_binlog(ROUTER_INSTANCE *,
|
|
const char *,
|
|
const MARIADB_GTID_INFO *);
|
|
extern GWBUF *blr_read_binlog(ROUTER_INSTANCE *,
|
|
BLFILE *,
|
|
unsigned long,
|
|
REP_HEADER *,
|
|
char *,
|
|
const SLAVE_ENCRYPTION_CTX *);
|
|
extern void blr_close_binlog(ROUTER_INSTANCE *, BLFILE *);
|
|
extern unsigned long blr_file_size(BLFILE *);
|
|
extern int blr_statistics(ROUTER_INSTANCE *, ROUTER_SLAVE *, GWBUF *);
|
|
extern int blr_ping(ROUTER_INSTANCE *, ROUTER_SLAVE *, GWBUF *);
|
|
extern int blr_send_custom_error(DCB *,
|
|
int,
|
|
int,
|
|
const char *,
|
|
char *,
|
|
unsigned int);
|
|
extern int blr_file_next_exists(ROUTER_INSTANCE *,
|
|
ROUTER_SLAVE *,
|
|
char *next_file);
|
|
uint32_t extract_field(uint8_t *src, int bits);
|
|
void blr_cache_read_master_data(ROUTER_INSTANCE *router);
|
|
int blr_read_events_all_events(ROUTER_INSTANCE *, BINLOG_FILE_FIX *, int);
|
|
int blr_save_dbusers(const ROUTER_INSTANCE *router);
|
|
char *blr_get_event_description(ROUTER_INSTANCE *router, uint8_t event);
|
|
void blr_file_append(ROUTER_INSTANCE *router, char *file);
|
|
void blr_cache_response(ROUTER_INSTANCE *router, char *response, GWBUF *buf);
|
|
char * blr_last_event_description(ROUTER_INSTANCE *router);
|
|
void blr_free_ssl_data(ROUTER_INSTANCE *inst);
|
|
|
|
extern bool blr_send_event(blr_thread_role_t role,
|
|
const char* binlog_name,
|
|
uint32_t binlog_pos,
|
|
ROUTER_SLAVE *slave,
|
|
REP_HEADER *hdr,
|
|
uint8_t *buf);
|
|
|
|
extern const char *blr_get_encryption_algorithm(int);
|
|
extern int blr_check_encryption_algorithm(char *);
|
|
extern const char *blr_encryption_algorithm_list(void);
|
|
extern bool blr_get_encryption_key(ROUTER_INSTANCE *);
|
|
extern void blr_set_checksum(ROUTER_INSTANCE *instance, GWBUF *buf);
|
|
extern const char *blr_skip_leading_sql_comments(const char *);
|
|
extern bool blr_fetch_mariadb_gtid(ROUTER_SLAVE *,
|
|
const char *,
|
|
MARIADB_GTID_INFO *);
|
|
extern void blr_start_master_in_main(void* data);
|
|
extern bool blr_binlog_file_exists(ROUTER_INSTANCE *router,
|
|
const MARIADB_GTID_INFO *info_file);
|
|
|
|
MXS_END_DECLS
|
|
|
|
#endif
|