MXS-1383: abort slave connection if requested filename doesn't exist
MXS-1383: abort slave connection if requested filename doesn't exist
This commit is contained in:
@ -1038,6 +1038,8 @@ extern bool blr_fetch_mariadb_gtid(ROUTER_SLAVE *,
|
|||||||
const char *,
|
const char *,
|
||||||
MARIADB_GTID_INFO *);
|
MARIADB_GTID_INFO *);
|
||||||
extern void blr_start_master_in_main(void* data);
|
extern void blr_start_master_in_main(void* data);
|
||||||
|
extern bool blr_binlog_file_exists(ROUTER_INSTANCE *router,
|
||||||
|
const char *log_name);
|
||||||
|
|
||||||
MXS_END_DECLS
|
MXS_END_DECLS
|
||||||
|
|
||||||
|
@ -4486,17 +4486,25 @@ bool blr_is_current_binlog(ROUTER_INSTANCE *router,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check whether the current binlog file exists.
|
* Check whether a binlog file exists.
|
||||||
*
|
*
|
||||||
* The file could have been manually removed by mistake.
|
* The file could have been manually removed by mistake.
|
||||||
* The check is done when ROTATE event (real or fake) is seen by
|
* The check is done when:
|
||||||
* blr_rotate_event().
|
* ROTATE event (real or fake) is seen by blr_rotate_event()
|
||||||
|
* or
|
||||||
|
* when a slave connects with a binlog_file name.
|
||||||
*
|
*
|
||||||
* @param router The router instance
|
* If param log_file is NULL, the current router->binlog_name
|
||||||
* @return True if file exists, false otherwise.
|
* is checked.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @param router The router instance
|
||||||
|
* @param log_file The file name to check
|
||||||
|
* @return True if file exists, false otherwise.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
bool blr_file_exists(ROUTER_INSTANCE *router)
|
bool blr_binlog_file_exists(ROUTER_INSTANCE *router,
|
||||||
|
const char *log_file)
|
||||||
{
|
{
|
||||||
bool ret = true;
|
bool ret = true;
|
||||||
char path[PATH_MAX + 1] = "";
|
char path[PATH_MAX + 1] = "";
|
||||||
@ -4518,15 +4526,22 @@ bool blr_file_exists(ROUTER_INSTANCE *router)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Set final file name full path
|
// Set final file name full path
|
||||||
strcat(path, router->binlog_name);
|
strcat(path,
|
||||||
|
log_file == NULL ?
|
||||||
|
router->binlog_name :
|
||||||
|
log_file);
|
||||||
|
|
||||||
// Check file
|
// Check file
|
||||||
if (access(path, F_OK) == -1 && errno == ENOENT)
|
if (access(path, F_OK) == -1 && errno == ENOENT)
|
||||||
{
|
{
|
||||||
// No file found
|
// No file found
|
||||||
MXS_WARNING("%s: ROTATE_EVENT, missing binlog file %s ",
|
MXS_WARNING("%s: %s, missing binlog file '%s'",
|
||||||
router->service->name,
|
router->service->name,
|
||||||
|
log_file == NULL ?
|
||||||
|
"ROTATE_EVENT" :
|
||||||
|
"Slave request",
|
||||||
path);
|
path);
|
||||||
|
|
||||||
ret = false;
|
ret = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -145,7 +145,6 @@ extern int blr_file_new_binlog(ROUTER_INSTANCE *router, char *file);
|
|||||||
static bool blr_handle_missing_files(ROUTER_INSTANCE *router,
|
static bool blr_handle_missing_files(ROUTER_INSTANCE *router,
|
||||||
char *new_file);
|
char *new_file);
|
||||||
static void worker_cb_start_master(int worker_id, void* data);
|
static void worker_cb_start_master(int worker_id, void* data);
|
||||||
extern bool blr_file_exists(ROUTER_INSTANCE *router);
|
|
||||||
extern void blr_file_update_gtid(ROUTER_INSTANCE *router);
|
extern void blr_file_update_gtid(ROUTER_INSTANCE *router);
|
||||||
static int blr_check_connect_retry(ROUTER_INSTANCE *router);
|
static int blr_check_connect_retry(ROUTER_INSTANCE *router);
|
||||||
|
|
||||||
@ -1633,9 +1632,9 @@ blr_rotate_event(ROUTER_INSTANCE *router, uint8_t *ptr, REP_HEADER *hdr)
|
|||||||
int rotated = 1;
|
int rotated = 1;
|
||||||
int remove_encrytion_ctx = 0;
|
int remove_encrytion_ctx = 0;
|
||||||
|
|
||||||
/* Different file name in rotate event or missing binlog file */
|
/* Different file name in rotate event or missing current binlog file */
|
||||||
if ((strncmp(router->binlog_name, file, slen) != 0) ||
|
if ((strncmp(router->binlog_name, file, slen) != 0) ||
|
||||||
!blr_file_exists(router))
|
!blr_binlog_file_exists(router, NULL))
|
||||||
{
|
{
|
||||||
remove_encrytion_ctx = 1;
|
remove_encrytion_ctx = 1;
|
||||||
router->stats.n_rotates++;
|
router->stats.n_rotates++;
|
||||||
|
@ -363,6 +363,8 @@ static void blr_abort_change_master(ROUTER_INSTANCE *router,
|
|||||||
MASTER_SERVER_CFG *current_master,
|
MASTER_SERVER_CFG *current_master,
|
||||||
CHANGE_MASTER_OPTIONS *change_master,
|
CHANGE_MASTER_OPTIONS *change_master,
|
||||||
const char *error);
|
const char *error);
|
||||||
|
static void blr_slave_abort_dump_request(ROUTER_SLAVE *slave,
|
||||||
|
const char *errmsg);
|
||||||
/**
|
/**
|
||||||
* Process a request packet from the slave server.
|
* Process a request packet from the slave server.
|
||||||
*
|
*
|
||||||
@ -1847,30 +1849,22 @@ blr_slave_binlog_dump(ROUTER_INSTANCE *router, ROUTER_SLAVE *slave, GWBUF *queue
|
|||||||
{
|
{
|
||||||
if (binlognamelen > BINLOG_FNAMELEN)
|
if (binlognamelen > BINLOG_FNAMELEN)
|
||||||
{
|
{
|
||||||
|
/* Abort the request */
|
||||||
char req_file[binlognamelen + 1];
|
char req_file[binlognamelen + 1];
|
||||||
char errmsg[BINLOG_ERROR_MSG_LEN + 1];
|
char errmsg[BINLOG_ERROR_MSG_LEN + 1];
|
||||||
memcpy(req_file, (char *)ptr, binlognamelen);
|
memcpy(req_file, (char *)ptr, binlognamelen);
|
||||||
req_file[binlognamelen] = 0;
|
req_file[binlognamelen] = 0;
|
||||||
|
|
||||||
MXS_ERROR("Slave %lu requests COM_BINLOG_DUMP with a filename %s"
|
snprintf(errmsg,
|
||||||
" longer than max %d chars. Aborting.",
|
BINLOG_ERROR_MSG_LEN,
|
||||||
(unsigned long)slave->serverid,
|
"Requested filename %s is longer than max %d chars.",
|
||||||
req_file,
|
req_file,
|
||||||
BINLOG_FNAMELEN);
|
BINLOG_FNAMELEN);
|
||||||
snprintf(errmsg, BINLOG_ERROR_MSG_LEN,
|
|
||||||
"Connecting slave requested binlog"
|
|
||||||
" file name %s longer than max %d chars.",
|
|
||||||
req_file,
|
|
||||||
BINLOG_FNAMELEN);
|
|
||||||
|
|
||||||
errmsg[BINLOG_ERROR_MSG_LEN] = '\0';
|
errmsg[BINLOG_ERROR_MSG_LEN] = '\0';
|
||||||
|
|
||||||
blr_send_custom_error(slave->dcb,
|
// ERROR
|
||||||
slave->seqno + 1,
|
blr_slave_abort_dump_request(slave, errmsg);
|
||||||
0,
|
|
||||||
errmsg,
|
|
||||||
"HY000",
|
|
||||||
BINLOG_FATAL_ERROR_READING);
|
|
||||||
slave->state = BLRS_ERRORED;
|
slave->state = BLRS_ERRORED;
|
||||||
dcb_close(slave->dcb);
|
dcb_close(slave->dcb);
|
||||||
return 1;
|
return 1;
|
||||||
@ -1893,6 +1887,7 @@ blr_slave_binlog_dump(ROUTER_INSTANCE *router, ROUTER_SLAVE *slave, GWBUF *queue
|
|||||||
binlognamelen > 0,
|
binlognamelen > 0,
|
||||||
requested_pos))
|
requested_pos))
|
||||||
{
|
{
|
||||||
|
// ERROR
|
||||||
slave->state = BLRS_ERRORED;
|
slave->state = BLRS_ERRORED;
|
||||||
dcb_close(slave->dcb);
|
dcb_close(slave->dcb);
|
||||||
return 1;
|
return 1;
|
||||||
@ -1959,6 +1954,24 @@ blr_slave_binlog_dump(ROUTER_INSTANCE *router, ROUTER_SLAVE *slave, GWBUF *queue
|
|||||||
strlen(slave->binlogfile),
|
strlen(slave->binlogfile),
|
||||||
(unsigned long)slave->binlog_pos);
|
(unsigned long)slave->binlog_pos);
|
||||||
|
|
||||||
|
/* Check first the requested file exists */
|
||||||
|
if (!blr_binlog_file_exists(router, slave->binlogfile))
|
||||||
|
{
|
||||||
|
char errmsg[BINLOG_ERROR_MSG_LEN + 1];
|
||||||
|
|
||||||
|
snprintf(errmsg, BINLOG_ERROR_MSG_LEN,
|
||||||
|
"Requested file name '%s' doesn't exist",
|
||||||
|
slave->binlogfile);
|
||||||
|
errmsg[BINLOG_ERROR_MSG_LEN] = '\0';
|
||||||
|
|
||||||
|
// ERROR
|
||||||
|
blr_slave_abort_dump_request(slave, errmsg);
|
||||||
|
|
||||||
|
slave->state = BLRS_ERRORED;
|
||||||
|
dcb_close(slave->dcb);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
/* First reply starts from seq = 1 */
|
/* First reply starts from seq = 1 */
|
||||||
slave->seqno = 1;
|
slave->seqno = 1;
|
||||||
|
|
||||||
@ -6888,14 +6901,19 @@ static bool blr_slave_gtid_request(ROUTER_INSTANCE *router,
|
|||||||
/* Requested GTID Not Found */
|
/* Requested GTID Not Found */
|
||||||
if (!f_gtid.gtid)
|
if (!f_gtid.gtid)
|
||||||
{
|
{
|
||||||
MXS_WARNING("Requested MariaDB GTID '%s' by server %lu"
|
char errmsg[BINLOG_ERROR_MSG_LEN + 1];
|
||||||
" has not been found",
|
snprintf(errmsg,
|
||||||
slave->mariadb_gtid,
|
BINLOG_ERROR_MSG_LEN,
|
||||||
(unsigned long)slave->serverid);
|
"Requested MariaDB GTID '%s' by server %lu"
|
||||||
|
" has not been found",
|
||||||
|
slave->mariadb_gtid,
|
||||||
|
(unsigned long)slave->serverid);
|
||||||
|
errmsg[BINLOG_ERROR_MSG_LEN] = '\0';
|
||||||
|
|
||||||
/* Check strict mode */
|
/* Check strict mode */
|
||||||
if (slave->gtid_strict_mode)
|
if (slave->gtid_strict_mode)
|
||||||
{
|
{
|
||||||
|
MXS_ERROR("%s", errmsg);
|
||||||
strcpy(slave->binlogfile, "");
|
strcpy(slave->binlogfile, "");
|
||||||
slave->binlog_pos = 0;
|
slave->binlog_pos = 0;
|
||||||
blr_send_custom_error(slave->dcb,
|
blr_send_custom_error(slave->dcb,
|
||||||
@ -6910,6 +6928,7 @@ static bool blr_slave_gtid_request(ROUTER_INSTANCE *router,
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* No strict mode: */
|
/* No strict mode: */
|
||||||
|
MXS_WARNING("%s", errmsg);
|
||||||
|
|
||||||
// - 1 -Set request GTID as current master one
|
// - 1 -Set request GTID as current master one
|
||||||
MXS_FREE(slave->mariadb_gtid);
|
MXS_FREE(slave->mariadb_gtid);
|
||||||
@ -6962,8 +6981,8 @@ static bool blr_slave_gtid_request(ROUTER_INSTANCE *router,
|
|||||||
* The binlog file could be different due to:
|
* The binlog file could be different due to:
|
||||||
* a rotate event or other non GTID events written
|
* a rotate event or other non GTID events written
|
||||||
* after that GTID.
|
* after that GTID.
|
||||||
* If file exists events will be sent from requested file@pos
|
* If file exists and pos >=4, events will be sent
|
||||||
* otherwise file & pos = GTID info file.
|
* from requested file@pos, otherwise from GTID file & pos.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// Add tree prefix
|
// Add tree prefix
|
||||||
@ -6982,7 +7001,8 @@ static bool blr_slave_gtid_request(ROUTER_INSTANCE *router,
|
|||||||
router->binlogdir,
|
router->binlogdir,
|
||||||
file_path,
|
file_path,
|
||||||
t_prefix[0] ? t_prefix: NULL);
|
t_prefix[0] ? t_prefix: NULL);
|
||||||
if (blr_slave_get_file_size(file_path) != 0)
|
// File size is >=4 read: set pos.
|
||||||
|
if (blr_slave_get_file_size(file_path) >= 4)
|
||||||
{
|
{
|
||||||
slave->binlog_pos = req_pos;
|
slave->binlog_pos = req_pos;
|
||||||
}
|
}
|
||||||
@ -9131,3 +9151,24 @@ static void blr_abort_change_master(ROUTER_INSTANCE *router,
|
|||||||
/* Free parsed options */
|
/* Free parsed options */
|
||||||
blr_master_free_parsed_options(change_master);
|
blr_master_free_parsed_options(change_master);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Abort the COM_BINLOG_DUMP slave request
|
||||||
|
*
|
||||||
|
* @param slave The connecting slave
|
||||||
|
* @param errmsg Error message to send and log
|
||||||
|
*/
|
||||||
|
static void blr_slave_abort_dump_request(ROUTER_SLAVE *slave,
|
||||||
|
const char *errmsg)
|
||||||
|
{
|
||||||
|
MXS_ERROR("Slave %lu requests COM_BINLOG_DUMP: %s. Aborting.",
|
||||||
|
(unsigned long)slave->serverid,
|
||||||
|
errmsg);
|
||||||
|
|
||||||
|
blr_send_custom_error(slave->dcb,
|
||||||
|
slave->seqno + 1,
|
||||||
|
0,
|
||||||
|
errmsg,
|
||||||
|
"HY000",
|
||||||
|
BINLOG_FATAL_ERROR_READING);
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user