Fix to allow rotate of files without explicit rotate events when the master is offline

This commit is contained in:
Mark Riddoch
2015-02-06 11:45:20 +00:00
parent bc0d303b27
commit 25e39f35c5
2 changed files with 27 additions and 3 deletions

View File

@ -62,7 +62,7 @@ static void blr_log_header(logfile_id_t file, char *msg, uint8_t *ptr);
/** /**
* Initialise the binlog file for this instance. MaxScale will look * Initialise the binlog file for this instance. MaxScale will look
* for all the binlogs that it has on local disk, determien the next * for all the binlogs that it has on local disk, determine the next
* binlog to use and initialise it for writing, determining the * binlog to use and initialise it for writing, determining the
* next record to be fetched from the real master. * next record to be fetched from the real master.
* *
@ -695,3 +695,26 @@ GWBUF *buf;
close(fd); close(fd);
return buf; return buf;
} }
/**
* Does the next binlog file in the sequence for the slave exist.
*
* @param router The router instance
* @param slave The slave in question
* @retuen 0 if the next file does not exist
*/
int
blr_file_next_exists(ROUTER_INSTANCE *router, ROUTER_SLAVE *slave)
{
char *sptr, buf[80], bigbuf[4096];
int filenum;
if ((sptr = strrchr(slave->binlogfile, '.')) == NULL)
return 0;
filenum = atoi(sptr + 1);
sprintf(buf, BINLOG_NAMEFMT, router->fileroot, filenum + 1);
sprintf(bigbuf, "%s/%s", router->binlogdir, buf);
if (access(bigbuf, R_OK) == -1)
return 0;
return 1;
}

View File

@ -1440,7 +1440,8 @@ if (hkheartbeat - beat1 > 1) LOGIF(LE, (skygw_log_write(
if (slave->binlog_pos >= blr_file_size(slave->file) if (slave->binlog_pos >= blr_file_size(slave->file)
&& router->rotating == 0 && router->rotating == 0
&& strcmp(router->binlog_name, slave->binlogfile) != 0 && strcmp(router->binlog_name, slave->binlogfile) != 0
&& blr_master_connected(router)) && (blr_master_connected(router)
|| blr_file_next_exists(router, slave)))
{ {
/* We may have reached the end of file of a non-current /* We may have reached the end of file of a non-current
* binlog file. * binlog file.
@ -1470,7 +1471,7 @@ if (hkheartbeat - beat1 > 1) LOGIF(LE, (skygw_log_write(
dcb_close(slave->dcb); dcb_close(slave->dcb);
} }
} }
else else if (blr_master_connected(router))
{ {
spinlock_acquire(&slave->catch_lock); spinlock_acquire(&slave->catch_lock);
slave->cstate |= CS_EXPECTCB; slave->cstate |= CS_EXPECTCB;