Improved error handlign for binlog directory and files
This commit is contained in:
@ -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
|
||||||
|
@ -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
|
||||||
*/
|
*/
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user