From b9588a89ac8393e6c031caf1a95bf95021b092f5 Mon Sep 17 00:00:00 2001 From: MassimilianoPinto Date: Tue, 8 Aug 2017 10:02:48 +0200 Subject: [PATCH] MXS-770: Removed support for PURGE BINARY LOGS without TO option. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PURGE BINARY LOGS doesn’t exist in MySQL/ MariaDB without options. MaxScale binlog router supports only PURGE BINARY LOGS TO ‘file’ --- .../modules/routing/binlogrouter/blr_slave.c | 73 ++++--------------- 1 file changed, 15 insertions(+), 58 deletions(-) diff --git a/server/modules/routing/binlogrouter/blr_slave.c b/server/modules/routing/binlogrouter/blr_slave.c index 4d1daeb6b..b1e57b2b3 100644 --- a/server/modules/routing/binlogrouter/blr_slave.c +++ b/server/modules/routing/binlogrouter/blr_slave.c @@ -8629,16 +8629,13 @@ static int binary_logs_purge_cb(void *data, } /** - * Parse the PURGE BINARY LOGS [TO 'file'] SQL statement - * and return last_file or the one found in the command. + * Parse the PURGE BINARY LOGS TO 'file' SQL statement. * * @param purge_command The SQL command to parse - * @param last_file Current binlog file name - * @return A pointer to the file + * @return The file found in the command. * or NULL in case of parse errors. */ -static const char *blr_purge_getfile(char *purge_command, - const char *last_file) +static const char *blr_purge_getfile(char *purge_command) { char *word; char *brkb; @@ -8665,10 +8662,11 @@ static const char *blr_purge_getfile(char *purge_command, word = strtok_r(NULL, sep, &brkb); - // Nothing else, return last file + // Nothing else, return error if (!word) { - return last_file; + MXS_ERROR("Invalid PURGE command: PURGE BINARY LOGS"); + return NULL; } else // Check for TO 'file' @@ -8695,7 +8693,7 @@ static const char *blr_purge_getfile(char *purge_command, } else { - MXS_ERROR("Invalid PURGE command: PURGE BINARY LOGS TO %s", word); + MXS_ERROR("Invalid PURGE command: PURGE BINARY LOGS TO"); return NULL; } } @@ -8722,15 +8720,6 @@ blr_purge_binary_logs(ROUTER_INSTANCE *router, { char *errmsg = NULL; size_t n_delete = 0; - // Select first ROWID of current binlog file - static const char last_file_tpl[] = "SELECT MIN(id) AS min_id, " - "(rep_domain || '/' || " - "server_id || '/' || " - "binlog_file) AS file " - "FROM gtid_maps " - "WHERE file = '%s' " - "GROUP BY file " - "ORDER BY id ASC;"; // Select first ROWID of user specifed file static const char find_file_tpl[] = "SELECT MIN(id) AS min_id, " "(rep_domain || '/' || " @@ -8753,19 +8742,16 @@ blr_purge_binary_logs(ROUTER_INSTANCE *router, "WHERE id < %" PRIu64 ";"; static char sql_stmt[GTID_SQL_BUFFER_SIZE]; BINARY_LOG_DATA_RESULT result; - static const char *last_file; - static char current_file[BINLOG_FILE_EXTRA_INFO + BINLOG_FNAMELEN + 1]; + static const char *selected_file; /** - * Parse PURGE BINARY LOGS [TO 'file'] statement: - * If file is not set then router->binlog_name is returned. + * Parse PURGE BINARY LOGS TO 'file' statement */ - if ((last_file = blr_purge_getfile(purge_opts, - router->binlog_name)) == NULL) + if ((selected_file = blr_purge_getfile(purge_opts)) == NULL) { // Abort on parsing failure blr_slave_send_error_packet(slave, - "Malformed PURGE BINARY LOGS [TO 'file'] detected.", + "Malformed PURGE BINARY LOGS TO 'file' detected.", 1064, "42000"); return false; @@ -8777,39 +8763,10 @@ blr_purge_binary_logs(ROUTER_INSTANCE *router, result.binlogdir = router->binlogdir; result.use_tree = router->storage_type == BLR_BINLOG_STORAGE_TREE; - /* Acquire lock accessing router structure fields */ - spinlock_acquire(&router->binlog_lock); - - /* Compare last file with router current file */ - bool use_last = strcmp(last_file, router->binlog_name) == 0; - - /* Set current file */ - sprintf(current_file, - "%" PRIu32 "/%" PRIu32 "/%s", - router->mariadb10_gtid_domain, - router->orig_masterid, - router->binlog_name); - - /* Release lock */ - spinlock_release(&router->binlog_lock); - - /** - * Prepare SQL statement for last file ROWID or find_file ROWID - */ - if (use_last) - { - /* Use current file, with prefix */ - sprintf(sql_stmt, - last_file_tpl, - current_file); - } - else - { - /* Use the provided name, no prefix: find the first row */ - sprintf(sql_stmt, - find_file_tpl, - last_file); - } + /* Use the provided name, no prefix: find the first row */ + sprintf(sql_stmt, + find_file_tpl, + selected_file); /* Get file rowid */ if (sqlite3_exec(router->gtid_maps,