Improved error handlign for binlog directory and files

This commit is contained in:
Mark Riddoch
2014-12-09 09:55:05 +00:00
parent 26e3486966
commit 0fb1918887
3 changed files with 53 additions and 21 deletions

View File

@ -47,7 +47,7 @@ CLIOBJ=$(CLISRCS:.c=.o)
SRCS=$(TESTSRCS) $(READCONSRCS) $(DEBUGCLISRCS) cli.c SRCS=$(TESTSRCS) $(READCONSRCS) $(DEBUGCLISRCS) cli.c
OBJ=$(SRCS:.c=.o) OBJ=$(SRCS:.c=.o)
LIBS=$(UTILSPATH)/skygw_utils.o -lssl -llog_manager LIBS=$(UTILSPATH)/skygw_utils.o -lssl -llog_manager
MODULES= libdebugcli.so libreadconnroute.so libtestroute.so libcli.so MODULES= libdebugcli.so libreadconnroute.so libtestroute.so libcli.so libbinlogrouter.so
all: $(MODULES) all: $(MODULES)
@ -68,12 +68,16 @@ libcli.so: $(CLIOBJ)
libreadwritesplit.so: libreadwritesplit.so:
(cd readwritesplit; touch depend.mk ; make; cp $@ ..) (cd readwritesplit; touch depend.mk ; make; cp $@ ..)
libbinlogrouter.so:
(cd binlog; touch depend.mk ; make; cp $@ ..)
.c.o: .c.o:
$(CC) $(CFLAGS) $< -o $@ $(CC) $(CFLAGS) $< -o $@
clean: clean:
$(DEL) $(OBJ) $(MODULES) $(DEL) $(OBJ) $(MODULES)
(cd readwritesplit; touch depend.mk; make clean) (cd readwritesplit; touch depend.mk; make clean)
(cd binlog; touch depend.mk; make clean)
tags: tags:
ctags $(SRCS) $(HDRS) ctags $(SRCS) $(HDRS)
@ -83,10 +87,12 @@ depend:
@$(DEL) depend.mk @$(DEL) depend.mk
cc -M $(CFLAGS) $(SRCS) > depend.mk cc -M $(CFLAGS) $(SRCS) > depend.mk
(cd readwritesplit; touch depend.mk ; make depend) (cd readwritesplit; touch depend.mk ; make depend)
(cd binlog; touch depend.mk ; make depend)
install: $(MODULES) install: $(MODULES)
install -D $(MODULES) $(DEST)/modules install -D $(MODULES) $(DEST)/modules
(cd readwritesplit; make DEST=$(DEST) install) (cd readwritesplit; make DEST=$(DEST) install)
(cd binlog; make DEST=$(DEST) install)
cleantests: cleantests:
$(MAKE) -C test cleantests $(MAKE) -C test cleantests

View File

@ -332,16 +332,6 @@ int i;
inst->fileroot = strdup(BINLOG_NAME_ROOT); inst->fileroot = strdup(BINLOG_NAME_ROOT);
} }
/*
* We have completed the creation of the instance data, so now
* insert this router instance into the linked list of routers
* that have been created with this module.
*/
spinlock_acquire(&instlock);
inst->next = instances;
instances = inst;
spinlock_release(&instlock);
inst->active_logs = 0; inst->active_logs = 0;
inst->reconnect_pending = 0; inst->reconnect_pending = 0;
inst->handling_threads = 0; inst->handling_threads = 0;
@ -353,12 +343,31 @@ int i;
/* /*
* Initialise the binlog file and position * Initialise the binlog file and position
*/ */
blr_file_init(inst); if (blr_file_init(inst) == 0)
{
LOGIF(LE, (skygw_log_write(
LOGFILE_ERROR,
"%s: Service not started due to lack of binlog directory.",
service->name)));
free(inst);
return NULL;
}
LOGIF(LT, (skygw_log_write( LOGIF(LT, (skygw_log_write(
LOGFILE_TRACE, LOGFILE_TRACE,
"Binlog router: current binlog file is: %s, current position %u\n", "Binlog router: current binlog file is: %s, current position %u\n",
inst->binlog_name, inst->binlog_position))); inst->binlog_name, inst->binlog_position)));
/*
* We have completed the creation of the instance data, so now
* insert this router instance into the linked list of routers
* that have been created with this module.
*/
spinlock_acquire(&instlock);
inst->next = instances;
instances = inst;
spinlock_release(&instlock);
/* /*
* Initialise the binlog cache for this router instance * Initialise the binlog cache for this router instance
*/ */

View File

@ -55,7 +55,7 @@ extern size_t log_ses_count[];
extern __thread log_info_t tls_log_info; extern __thread log_info_t tls_log_info;
static void blr_file_create(ROUTER_INSTANCE *router, char *file); static int blr_file_create(ROUTER_INSTANCE *router, char *file);
static void blr_file_append(ROUTER_INSTANCE *router, char *file); static void blr_file_append(ROUTER_INSTANCE *router, char *file);
static uint32_t extract_field(uint8_t *src, int bits); static uint32_t extract_field(uint8_t *src, int bits);
static void blr_log_header(logfile_id_t file, char *msg, uint8_t *ptr); static void blr_log_header(logfile_id_t file, char *msg, uint8_t *ptr);
@ -68,7 +68,7 @@ static void blr_log_header(logfile_id_t file, char *msg, uint8_t *ptr);
* *
* @param router The router instance this defines the master for this replication chain * @param router The router instance this defines the master for this replication chain
*/ */
void int
blr_file_init(ROUTER_INSTANCE *router) blr_file_init(ROUTER_INSTANCE *router)
{ {
char *ptr, path[1024], filename[1050]; char *ptr, path[1024], filename[1050];
@ -92,16 +92,28 @@ struct dirent *dp;
router->binlogdir = strdup(path); router->binlogdir = strdup(path);
} }
else
{
strncpy(path, router->binlogdir, 1024);
}
if (access(router->binlogdir, R_OK) == -1) if (access(router->binlogdir, R_OK) == -1)
{ {
LOGIF(LE, (skygw_log_write(LOGFILE_ERROR, LOGIF(LE, (skygw_log_write(LOGFILE_ERROR,
"%s: Unable to read the binlog directory %s.", "%s: Unable to read the binlog directory %s.",
router->service->name, router->binlogdir))); router->service->name, router->binlogdir)));
return 0;
} }
/* First try to find a binlog file number by reading the directory */ /* First try to find a binlog file number by reading the directory */
root_len = strlen(router->fileroot); root_len = strlen(router->fileroot);
dirp = opendir(path); if ((dirp = opendir(path)) == NULL)
{
LOGIF(LE, (skygw_log_write(LOGFILE_ERROR,
"%s: Unable to read the binlog directory %s, %s.",
router->service->name, router->binlogdir,
strerror(errno))));
return 0;
}
while ((dp = readdir(dirp)) != NULL) while ((dp = readdir(dirp)) != NULL)
{ {
if (strncmp(dp->d_name, router->fileroot, root_len) == 0) if (strncmp(dp->d_name, router->fileroot, root_len) == 0)
@ -134,20 +146,21 @@ struct dirent *dp;
router->initbinlog); router->initbinlog);
else else
sprintf(filename, BINLOG_NAMEFMT, router->fileroot, 1); sprintf(filename, BINLOG_NAMEFMT, router->fileroot, 1);
blr_file_create(router, filename); if (! blr_file_create(router, filename))
return 0;
} }
else else
{ {
sprintf(filename, BINLOG_NAMEFMT, router->fileroot, n); sprintf(filename, BINLOG_NAMEFMT, router->fileroot, n);
blr_file_append(router, filename); blr_file_append(router, filename);
} }
return 1;
} }
void int
blr_file_rotate(ROUTER_INSTANCE *router, char *file, uint64_t pos) blr_file_rotate(ROUTER_INSTANCE *router, char *file, uint64_t pos)
{ {
blr_file_create(router, file); return blr_file_create(router, file);
} }
@ -156,8 +169,9 @@ blr_file_rotate(ROUTER_INSTANCE *router, char *file, uint64_t pos)
* *
* @param router The router instance * @param router The router instance
* @param file The binlog file name * @param file The binlog file name
* @return Non-zero if the fie creation succeeded
*/ */
static void static int
blr_file_create(ROUTER_INSTANCE *router, char *file) blr_file_create(ROUTER_INSTANCE *router, char *file)
{ {
char path[1024]; char path[1024];
@ -175,7 +189,9 @@ unsigned char magic[] = BINLOG_MAGIC;
else else
{ {
LOGIF(LE, (skygw_log_write(LOGFILE_ERROR, LOGIF(LE, (skygw_log_write(LOGFILE_ERROR,
"Failed to create binlog file %s", path))); "%s: Failed to create binlog file %s, %s.",
router->service->name, path, strerror(errno))));
return 0;
} }
fsync(fd); fsync(fd);
close(router->binlog_fd); close(router->binlog_fd);
@ -184,6 +200,7 @@ unsigned char magic[] = BINLOG_MAGIC;
router->binlog_position = 4; /* Initial position after the magic number */ router->binlog_position = 4; /* Initial position after the magic number */
spinlock_release(&router->binlog_lock); spinlock_release(&router->binlog_lock);
router->binlog_fd = fd; router->binlog_fd = fd;
return 1;
} }