Update GTID repository while receiving ROTATE events and check the current file exists.

Update GTID repository while receiving ROTATE events and check the
current file exists.
This commit is contained in:
MassimilianoPinto 2017-08-02 15:32:14 +02:00
parent 1ec7d9a712
commit d5de149e32
3 changed files with 125 additions and 24 deletions

View File

@ -238,6 +238,8 @@ bool blr_compare_binlogs(ROUTER_INSTANCE *router,
const char *r_file,
const char *s_file);
void blr_file_update_gtid(ROUTER_INSTANCE *router);
/**
* MariaDB 10.1.7 Start Encryption event content
*
@ -573,21 +575,7 @@ blr_file_create(ROUTER_INSTANCE *router, char *orig_file)
if (router->mariadb10_compat &&
router->mariadb10_gtid)
{
MARIADB_GTID_ELEMS gtid_elms = {};
// Add GTID domain
gtid_elms.domain_id = router->mariadb10_gtid_domain;
// router->orig_masterid keeps the original ID
gtid_elms.server_id = router->orig_masterid;
// Pos 4 for start/end_pos
router->pending_transaction.end_pos = 4;
router->pending_transaction.start_pos = 4;
// Update all the gtid_elms
memcpy(&router->pending_transaction.gtid_elms,
&gtid_elms,
sizeof(MARIADB_GTID_ELEMS));
/* Save GTID into repo */
blr_save_mariadb_gtid(router);
blr_file_update_gtid(router);
}
}
else
@ -4487,3 +4475,92 @@ bool blr_is_current_binlog(ROUTER_INSTANCE *router,
router->binlog_name,
slave->binlogfile);
}
/**
* Check whether the current binlog file exists.
*
* The file could have been manually removed by mistake.
* The check is done when ROTATE event (real or fake) is seen by
* blr_rotate_event().
*
* @param router The router instance
* @return True if file exists, false otherwise.
*
*/
bool blr_file_exists(ROUTER_INSTANCE *router)
{
bool ret = true;
char path[PATH_MAX + 1] = "";
strcpy(path, router->binlogdir);
strcat(path, "/");
/**
* Create file prefix using domain and server_id prefix
*/
if (router->storage_type == BLR_BINLOG_STORAGE_TREE)
{
char prefix[BINLOG_FILE_EXTRA_INFO];
// Add prefix
sprintf(prefix,
"%" PRIu32 "/%" PRIu32 "/",
router->mariadb10_gtid_domain,
router->orig_masterid);
strcat(path, prefix);
}
// Set final file name full path
strcat(path, router->binlog_name);
// Check file
if (access(path, F_OK) == -1 && errno == ENOENT)
{
// No file found
MXS_WARNING("%s: ROTATE_EVENT, missing binlog file %s ",
router->service->name,
path);
ret = false;
}
return ret;
}
/**
* Add/Update binlog file details into GTID mapd db:
*
* binlog file name
* pos = 4
* server_id = router->orig_masterid
* sequence = 0
*
* @param router The router instance
*/
void blr_file_update_gtid(ROUTER_INSTANCE *router)
{
MARIADB_GTID_ELEMS gtid_elms;
// Add GTID domain
gtid_elms.domain_id = router->mariadb10_gtid_domain;
//router->orig_masterid keeps the original ID
gtid_elms.server_id = router->orig_masterid;
// Set GTID sequence to 0
gtid_elms.seq_no = 0;
// Pos 4 for start/end_pos
router->pending_transaction.end_pos = 4;
router->pending_transaction.start_pos = 4;
// Update all the gtid_elms
memcpy(&router->pending_transaction.gtid_elms,
&gtid_elms,
sizeof(MARIADB_GTID_ELEMS));
/**
* Save GTID into repo
*
* If router->orig_masterid is not set yet
* don't update the db
* This happens when mariadb10_master_gtid id Off
* and a new file has been created by blr_file_init()
*/
if (gtid_elms.server_id > 0)
{
blr_save_mariadb_gtid(router);
}
}

View File

@ -147,6 +147,8 @@ static bool blr_handle_missing_files(ROUTER_INSTANCE *router,
static void worker_cb_start_master(int worker_id, void* data);
static void blr_start_master_in_main(void* data);
extern bool blr_file_exists(ROUTER_INSTANCE *router);
extern void blr_file_update_gtid(ROUTER_INSTANCE *router);
static int keepalive = 1;
@ -1492,7 +1494,9 @@ blr_rotate_event(ROUTER_INSTANCE *router, uint8_t *ptr, REP_HEADER *hdr)
int rotated = 1;
int remove_encrytion_ctx = 0;
if (strncmp(router->binlog_name, file, slen) != 0)
/* Different file name in rotate event or missing binlog file */
if ((strncmp(router->binlog_name, file, slen) != 0) ||
!blr_file_exists(router))
{
remove_encrytion_ctx = 1;
router->stats.n_rotates++;
@ -1501,6 +1505,23 @@ blr_rotate_event(ROUTER_INSTANCE *router, uint8_t *ptr, REP_HEADER *hdr)
rotated = 0;
}
}
else
{
/**
* ROTATE_EVENT reports a binlog file which is the same
* as router->binlog_name.
*
* If mariadb10_gtid is On, let's Add/Update into GTID repo:
* this allows SHOW BINARY LOGS to list all files
* including the ones without GTID events.
*/
if (router->mariadb10_compat &&
router->mariadb10_gtid)
{
blr_file_update_gtid(router);
}
}
spinlock_acquire(&router->binlog_lock);
router->rotating = 0;
@ -3145,8 +3166,8 @@ static void blr_register_mariadb_gtid_request(ROUTER_INSTANCE *router,
* False otherwise.
*/
static bool blr_handle_fake_rotate(ROUTER_INSTANCE *router,
REP_HEADER *hdr,
uint8_t *ptr)
REP_HEADER *hdr,
uint8_t *ptr)
{
ss_dassert(hdr->event_type == ROTATE_EVENT);

View File

@ -342,6 +342,7 @@ extern bool blr_compare_binlogs(ROUTER_INSTANCE *router,
MARIADB_GTID_INFO *slave,
const char *r_file,
const char *s_file);
/**
* Process a request packet from the slave server.
*
@ -679,7 +680,7 @@ blr_slave_query(ROUTER_INSTANCE *router, ROUTER_SLAVE *slave, GWBUF *queue)
{
if (brkb && strlen(brkb) &&
blr_handle_complex_select(router,
slave,
slave,
word,
brkb))
{
@ -688,8 +689,8 @@ blr_slave_query(ROUTER_INSTANCE *router, ROUTER_SLAVE *slave, GWBUF *queue)
}
if (blr_handle_simple_select_stmt(router,
slave,
word))
slave,
word))
{
MXS_FREE(query_text);
return 1;
@ -8221,10 +8222,12 @@ blr_show_binary_logs(ROUTER_INSTANCE *router,
seqno = result.seq_no;
/**
* Check whether the last file is the current binlog file.
* If not then add the new row.
* Check whether the last file is the current binlog file,
* GTID repo might also contain no data at all.
*
* Add the new row if needed.
*/
if (strcmp(current_file, result.last_file) != 0)
if (!result.last_file || strcmp(current_file, result.last_file) != 0)
{
char pos[40]; // Buffer for a 64-bit integer.
GWBUF *pkt;