Merge pull request #78 from sjmudd/develop

Make MaxScale handle zero-length files to aid bootstrapping.
This commit is contained in:
markus456
2015-04-24 07:08:43 +03:00

View File

@ -164,6 +164,24 @@ blr_file_rotate(ROUTER_INSTANCE *router, char *file, uint64_t pos)
} }
/**
* binlog files need an initial 4 magic bytes at the start. blr_file_add_magic()
* adds them.
*
* @param router The router instance
* @param fd file descriptor to the open binlog file
* @return Nothing
*/
static void
blr_file_add_magic(ROUTER_INSTANCE *router, int fd)
{
unsigned char magic[] = BINLOG_MAGIC;
write(fd, magic, 4);
router->binlog_position = 4; /* Initial position after the magic number */
}
/** /**
* Create a new binlog file for the router to use. * Create a new binlog file for the router to use.
* *
@ -176,7 +194,6 @@ blr_file_create(ROUTER_INSTANCE *router, char *file)
{ {
char path[1024]; char path[1024];
int fd; int fd;
unsigned char magic[] = BINLOG_MAGIC;
strcpy(path, router->binlogdir); strcpy(path, router->binlogdir);
strcat(path, "/"); strcat(path, "/");
@ -184,7 +201,7 @@ unsigned char magic[] = BINLOG_MAGIC;
if ((fd = open(path, O_RDWR|O_CREAT, 0666)) != -1) if ((fd = open(path, O_RDWR|O_CREAT, 0666)) != -1)
{ {
write(fd, magic, 4); blr_file_add_magic(router,fd);
} }
else else
{ {
@ -197,7 +214,7 @@ unsigned char magic[] = BINLOG_MAGIC;
close(router->binlog_fd); close(router->binlog_fd);
spinlock_acquire(&router->binlog_lock); spinlock_acquire(&router->binlog_lock);
strncpy(router->binlog_name, file,BINLOG_FNAMELEN); strncpy(router->binlog_name, file,BINLOG_FNAMELEN);
router->binlog_position = 4; /* Initial position after the magic number */ blr_file_add_magic(router, fd);
spinlock_release(&router->binlog_lock); spinlock_release(&router->binlog_lock);
router->binlog_fd = fd; router->binlog_fd = fd;
return 1; return 1;
@ -232,6 +249,18 @@ int fd;
spinlock_acquire(&router->binlog_lock); spinlock_acquire(&router->binlog_lock);
strncpy(router->binlog_name, file,BINLOG_FNAMELEN); strncpy(router->binlog_name, file,BINLOG_FNAMELEN);
router->binlog_position = lseek(fd, 0L, SEEK_END); router->binlog_position = lseek(fd, 0L, SEEK_END);
if (router->binlog_position < 4) {
if (router->binlog_position == 0) {
blr_file_add_magic(router, fd);
} else {
/* If for any reason the file's length is between 1 and 3 bytes
* then report an error. */
LOGIF(LE, (skygw_log_write(LOGFILE_ERROR,
"%s: binlog file %s has an invalid length %d.",
router->service->name, path, router->binlog_position)));
return;
}
}
spinlock_release(&router->binlog_lock); spinlock_release(&router->binlog_lock);
router->binlog_fd = fd; router->binlog_fd = fd;
} }