Logging related (mostly) sanity checks and fixes.

- Checked argument types and counts
- Removed trailing line feeds
- Removed thread ids from error logs (they are used in trace / debug log
- Added some state information to dcbs
- Added prefix 'Error' or 'Fatal' to error logs.
- Switches all error logs to use flushing log write.
This commit is contained in:
vraatikka
2013-09-30 11:14:36 +03:00
parent c48dd6028f
commit 701830f0ab
13 changed files with 761 additions and 470 deletions

View File

@ -153,17 +153,20 @@ char fname[1024], *home, *cpasswd;
sprintf(fname, "%s/etc/passwd", home); sprintf(fname, "%s/etc/passwd", home);
else else
sprintf(fname, "/usr/local/skysql/MaxScale/etc/passwd"); sprintf(fname, "/usr/local/skysql/MaxScale/etc/passwd");
if (users == NULL) if (users == NULL)
{ {
skygw_log_write( LOGFILE_MESSAGE, "Create initial password file.\n"); skygw_log_write(LOGFILE_MESSAGE,"Create initial password file.");
if ((users = users_alloc()) == NULL) if ((users = users_alloc()) == NULL)
return ADMIN_ERR_NOMEM; return ADMIN_ERR_NOMEM;
if ((fp = fopen(fname, "w")) == NULL) if ((fp = fopen(fname, "w")) == NULL)
{ {
skygw_log_write( LOGFILE_ERROR, skygw_log_write_flush(
"Unable to create password file %s.\n", LOGFILE_ERROR,
fname); "Error : Unable to create password file %s.",
return ADMIN_ERR_PWDFILEOPEN; fname);
return ADMIN_ERR_PWDFILEOPEN;
} }
fclose(fp); fclose(fp);
} }
@ -175,10 +178,10 @@ char fname[1024], *home, *cpasswd;
users_add(users, uname, cpasswd); users_add(users, uname, cpasswd);
if ((fp = fopen(fname, "a")) == NULL) if ((fp = fopen(fname, "a")) == NULL)
{ {
skygw_log_write( LOGFILE_ERROR, skygw_log_write_flush(LOGFILE_ERROR,
"Unable to append to password file %s.\n", "Error : Unable to append to password file %s.",
fname); fname);
return ADMIN_ERR_FILEAPPEND; return ADMIN_ERR_FILEAPPEND;
} }
fprintf(fp, "%s:%s\n", uname, cpasswd); fprintf(fp, "%s:%s\n", uname, cpasswd);
fclose(fp); fclose(fp);
@ -209,18 +212,19 @@ char* admin_remove_user(
int n_deleted; int n_deleted;
if (!admin_search_user(uname)) { if (!admin_search_user(uname)) {
skygw_log_write( skygw_log_write_flush(
LOGFILE_MESSAGE, LOGFILE_ERROR,
"Couldn't find user %s. Removing user failed", uname); "Error : Couldn't find user %s. Removing user failed",
uname);
return ADMIN_ERR_USERNOTFOUND; return ADMIN_ERR_USERNOTFOUND;
} }
if (admin_verify(uname, passwd) == 0) { if (admin_verify(uname, passwd) == 0) {
skygw_log_write( skygw_log_write_flush(
LOGFILE_MESSAGE, LOGFILE_ERROR,
"Authentication failed, wrong user/password combination.\n" "Error : Authentication failed, wrong user/password "
"Removing user failed"); "combination. Removing user failed.");
return ADMIN_ERR_AUTHENTICATION; return ADMIN_ERR_AUTHENTICATION;
} }
@ -228,49 +232,52 @@ char* admin_remove_user(
n_deleted = users_delete(users, uname); n_deleted = users_delete(users, uname);
if (n_deleted == 0) { if (n_deleted == 0) {
skygw_log_write( skygw_log_write_flush(
LOGFILE_MESSAGE, LOGFILE_ERROR,
"Deleting the only user is forbidden. add new user " "Error : Deleting the only user is forbidden. Add new "
"before deleting the old one.\n"); "user before deleting the one.");
return ADMIN_ERR_DELLASTUSER; return ADMIN_ERR_DELLASTUSER;
} }
/** /**
* Open passwd file and remove user from the file. * Open passwd file and remove user from the file.
*/ */
if ((home = getenv("MAXSCALE_HOME")) != NULL) { if ((home = getenv("MAXSCALE_HOME")) != NULL) {
sprintf(fname, "%s/etc/passwd", home); sprintf(fname, "%s/etc/passwd", home);
sprintf(fname_tmp, "%s/etc/passwd_tmp", home); sprintf(fname_tmp, "%s/etc/passwd_tmp", home);
} else { } else {
sprintf(fname, "/usr/local/skysql/MaxScale/etc/passwd"); sprintf(fname, "/usr/local/skysql/MaxScale/etc/passwd");
sprintf(fname_tmp, "/usr/local/skysql/MaxScale/etc/passwd_tmp"); sprintf(fname_tmp, "/usr/local/skysql/MaxScale/etc/passwd_tmp");
} }
/** /**
* Rewrite passwd file from memory. * Rewrite passwd file from memory.
*/ */
if ((fp = fopen(fname, "r")) == NULL) if ((fp = fopen(fname, "r")) == NULL)
{ {
int err = errno; int err = errno;
skygw_log_write( LOGFILE_ERROR, skygw_log_write_flush(
"Unable to open password file %s : errno %d.\n" LOGFILE_ERROR,
"Removing user from file failed; it must be done manually.", "Error : Unable to open password file %s : errno %d.\n"
fname, "Removing user from file failed; it must be done "
err); "manually.",
return ADMIN_ERR_PWDFILEOPEN; fname,
err);
return ADMIN_ERR_PWDFILEOPEN;
} }
/** /**
* Open temporary passwd file. * Open temporary passwd file.
*/ */
if ((fp_tmp = fopen(fname_tmp, "w")) == NULL) if ((fp_tmp = fopen(fname_tmp, "w")) == NULL)
{ {
int err = errno; int err = errno;
skygw_log_write( LOGFILE_ERROR, skygw_log_write_flush(
"Unable to open tmp file %s : errno %d.\n" LOGFILE_ERROR,
"Removing user from passwd file failed; " "Error : Unable to open tmp file %s : errno %d.\n"
"it must be done manually.", "Removing user from passwd file failed; it must be done "
fname_tmp, "manually.",
err); fname_tmp,
fclose(fp); err);
return ADMIN_ERR_TMPFILEOPEN; fclose(fp);
return ADMIN_ERR_TMPFILEOPEN;
} }
/** /**
@ -278,11 +285,13 @@ char* admin_remove_user(
*/ */
if (fgetpos(fp, &rpos) != 0) { if (fgetpos(fp, &rpos) != 0) {
int err = errno; int err = errno;
skygw_log_write( LOGFILE_ERROR, skygw_log_write_flush(
"Unable to process passwd file %s : errno %d.\n" LOGFILE_ERROR,
"Removing user from file failed, and must be done manually.", "Error : Unable to process passwd file %s : errno %d.\n"
fname, "Removing user from file failed, and must be done "
err); "manually.",
fname,
err);
fclose(fp); fclose(fp);
unlink(fname_tmp); unlink(fname_tmp);
return ADMIN_ERR_PWDFILEACCESS; return ADMIN_ERR_PWDFILEACCESS;
@ -290,28 +299,30 @@ char* admin_remove_user(
while (fscanf(fp, "%[^:]:%s\n", fusr, fpwd) == 2) while (fscanf(fp, "%[^:]:%s\n", fusr, fpwd) == 2)
{ {
/** /**
* Compare username what was found from passwd file. * Compare username what was found from passwd file.
* Unmatching lines are copied to tmp file. * Unmatching lines are copied to tmp file.
*/ */
if (strncmp(uname, fusr, strlen(uname)+1) != 0) { if (strncmp(uname, fusr, strlen(uname)+1) != 0) {
fsetpos(fp, &rpos); /** one step back */ fsetpos(fp, &rpos); /** one step back */
fgets(line, LINELEN, fp); fgets(line, LINELEN, fp);
fputs(line, fp_tmp); fputs(line, fp_tmp);
} }
if (fgetpos(fp, &rpos) != 0) { if (fgetpos(fp, &rpos) != 0) {
int err = errno; int err = errno;
skygw_log_write( LOGFILE_ERROR, skygw_log_write_flush(
"Unable to process passwd file %s : errno %d.\n" LOGFILE_ERROR,
"Error : Unable to process passwd file %s : "
"errno %d.\n"
"Removing user from file failed, and must be " "Removing user from file failed, and must be "
"done manually.", "done manually.",
fname, fname,
err); err);
fclose(fp); fclose(fp);
unlink(fname_tmp); unlink(fname_tmp);
return ADMIN_ERR_PWDFILEACCESS; return ADMIN_ERR_PWDFILEACCESS;
} }
} }
fclose(fp); fclose(fp);
/** /**
@ -319,17 +330,18 @@ char* admin_remove_user(
*/ */
if (rename(fname_tmp, fname)) { if (rename(fname_tmp, fname)) {
int err = errno; int err = errno;
skygw_log_write( LOGFILE_ERROR, skygw_log_write_flush(
"Unable to rename new passwd file %s : errno %d.\n" LOGFILE_ERROR,
"Rename it to %s manually.", "Error : Unable to rename new passwd file %s : errno "
fname_tmp, "%d.\n"
err, "Rename it to %s manually.",
fname); fname_tmp,
err,
fname);
unlink(fname_tmp); unlink(fname_tmp);
fclose(fp_tmp); fclose(fp_tmp);
return ADMIN_ERR_PWDFILEACCESS; return ADMIN_ERR_PWDFILEACCESS;
} }
fclose(fp_tmp); fclose(fp_tmp);
return ADMIN_SUCCESS; return ADMIN_SUCCESS;
} }

View File

@ -178,49 +178,78 @@ int error_count = 0;
char *type = config_get_value(obj->parameters, "type"); char *type = config_get_value(obj->parameters, "type");
if (type == NULL) if (type == NULL)
{ {
skygw_log_write( LOGFILE_ERROR, "Configuration object '%s' has no type\n", obj->object); skygw_log_write_flush(
LOGFILE_ERROR,
"Error : Configuration object '%s' has no type.",
obj->object);
error_count++; error_count++;
} }
else if (!strcmp(type, "service")) else if (!strcmp(type, "service"))
{ {
char *router = config_get_value(obj->parameters, "router"); char *router = config_get_value(obj->parameters,
if (router) "router");
{ if (router)
{
obj->element = service_alloc(obj->object, router); obj->element = service_alloc(obj->object, router);
char *user = config_get_value(obj->parameters, "user"); char *user =
char *auth = config_get_value(obj->parameters, "auth"); config_get_value(obj->parameters, "user");
char *auth =
config_get_value(obj->parameters, "auth");
if (obj->element && user && auth) if (obj->element && user && auth)
serviceSetUser(obj->element, user, auth); serviceSetUser(obj->element, user, auth);
} }
else else
{ {
obj->element = NULL; obj->element = NULL;
skygw_log_write( LOGFILE_ERROR, "No router defined for service '%s'\n", skygw_log_write_flush(
obj->object); LOGFILE_ERROR,
"Error : No router defined for service "
"'%s'\n",
obj->object);
error_count++; error_count++;
} }
} }
else if (!strcmp(type, "server")) else if (!strcmp(type, "server"))
{ {
char *address = config_get_value(obj->parameters, "address"); char *address;
char *port = config_get_value(obj->parameters, "port"); char *port;
char *protocol = config_get_value(obj->parameters, "protocol"); char *protocol;
char *monuser = config_get_value(obj->parameters, "monitoruser"); char *monuser;
char *monpw = config_get_value(obj->parameters, "monitorpw"); char *monpw;
address = config_get_value(obj->parameters, "address");
port = config_get_value(obj->parameters, "port");
protocol = config_get_value(obj->parameters, "protocol");
monuser = config_get_value(obj->parameters,"monitoruser");
monpw = config_get_value(obj->parameters, "monitorpw");
if (address && port && protocol) if (address && port && protocol)
obj->element = server_alloc(address, protocol, atoi(port)); obj->element = server_alloc(address,
protocol,
atoi(port));
else else
{ {
obj->element = NULL; obj->element = NULL;
skygw_log_write(LOGFILE_ERROR, "Server '%s' is missing a required configuration parameter. A server must have address, port and protocol defined.\n", obj->object); skygw_log_write_flush(
LOGFILE_ERROR,
"Error : Server '%s' is missing a "
"required configuration parameter. A "
"server must "
"have address, port and protocol "
"defined.",
obj->object);
error_count++; error_count++;
} }
if (obj->element && monuser && monpw) if (obj->element && monuser && monpw)
serverAddMonUser(obj->element, monuser, monpw); serverAddMonUser(obj->element, monuser, monpw);
else else
skygw_log_write(LOGFILE_ERROR, "Warning: server '%s' has no valid monitor user defined. The server may not be monitored.\n", obj->object); skygw_log_write_flush(
LOGFILE_ERROR,
"Warning : server '%s' has no valid "
"monitor user defined. The server may "
"not be monitored.\n",
obj->object);
} }
obj = obj->next; obj = obj->next;
} }
@ -236,8 +265,12 @@ int error_count = 0;
; ;
else if (!strcmp(type, "service")) else if (!strcmp(type, "service"))
{ {
char *servers = config_get_value(obj->parameters, "servers"); char *servers;
char *roptions = config_get_value(obj->parameters, "router_options"); char *roptions;
servers = config_get_value(obj->parameters, "servers");
roptions = config_get_value(obj->parameters,
"router_options");
if (servers && obj->element) if (servers && obj->element)
{ {
char *s = strtok(servers, ","); char *s = strtok(servers, ",");
@ -246,8 +279,13 @@ int error_count = 0;
CONFIG_CONTEXT *obj1 = context; CONFIG_CONTEXT *obj1 = context;
while (obj1) while (obj1)
{ {
if (strcmp(s, obj1->object) == 0 && obj->element && obj1->element) if (strcmp(s, obj1->object) == 0 &&
serviceAddBackend(obj->element, obj1->element); obj->element && obj1->element)
{
serviceAddBackend(
obj->element,
obj1->element);
}
obj1 = obj1->next; obj1 = obj1->next;
} }
s = strtok(NULL, ","); s = strtok(NULL, ",");
@ -255,7 +293,12 @@ int error_count = 0;
} }
else if (servers == NULL) else if (servers == NULL)
{ {
skygw_log_write(LOGFILE_ERROR, "The service '%s' is missing a definition of the servers that provide the service.\n", obj->object); skygw_log_write_flush(
LOGFILE_ERROR,
"Error : The service '%s' is missing a "
"definition of the servers that provide "
"the service.",
obj->object);
} }
if (roptions && obj->element) if (roptions && obj->element)
{ {
@ -269,30 +312,49 @@ int error_count = 0;
} }
else if (!strcmp(type, "listener")) else if (!strcmp(type, "listener"))
{ {
char *service = config_get_value(obj->parameters, "service"); char *service;
char *port = config_get_value(obj->parameters, "port"); char *port;
char *protocol = config_get_value(obj->parameters, "protocol"); char *protocol;
service = config_get_value(obj->parameters, "service");
port = config_get_value(obj->parameters, "port");
protocol = config_get_value(obj->parameters, "protocol");
if (service && port && protocol) if (service && port && protocol)
{ {
CONFIG_CONTEXT *ptr = context; CONFIG_CONTEXT *ptr = context;
while (ptr && strcmp(ptr->object, service) != 0) while (ptr && strcmp(ptr->object, service) != 0)
ptr = ptr->next; ptr = ptr->next;
if (ptr && ptr->element) if (ptr && ptr->element)
serviceAddProtocol(ptr->element, protocol, atoi(port)); serviceAddProtocol(ptr->element,
protocol,
atoi(port));
} }
else else
{ {
skygw_log_write(LOGFILE_ERROR, "Listener '%s' is misisng a required parameter. A Listener must have a service, port and protocol defined.\n", obj->object); skygw_log_write_flush(
LOGFILE_ERROR,
"Error : Listener '%s' is misisng a "
"required "
"parameter. A Listener must have a "
"service, port and protocol defined.",
obj->object);
error_count++; error_count++;
} }
} }
else if (!strcmp(type, "monitor")) else if (!strcmp(type, "monitor"))
{ {
char *module = config_get_value(obj->parameters, "module"); char *module;
char *servers = config_get_value(obj->parameters, "servers"); char *servers;
char *user = config_get_value(obj->parameters, "user"); char *user;
char *passwd = config_get_value(obj->parameters, "passwd"); char *passwd;
if (module)
module = config_get_value(obj->parameters, "module");
servers = config_get_value(obj->parameters, "servers");
user = config_get_value(obj->parameters, "user");
passwd = config_get_value(obj->parameters, "passwd");
if (module)
{ {
obj->element = monitor_alloc(obj->object, module); obj->element = monitor_alloc(obj->object, module);
if (servers && obj->element) if (servers && obj->element)
@ -303,8 +365,13 @@ int error_count = 0;
CONFIG_CONTEXT *obj1 = context; CONFIG_CONTEXT *obj1 = context;
while (obj1) while (obj1)
{ {
if (strcmp(s, obj1->object) == 0 && obj->element && obj1->element) if (strcmp(s, obj1->object) == 0 &&
monitorAddServer(obj->element, obj1->element); obj->element && obj1->element)
{
monitorAddServer(
obj->element,
obj1->element);
}
obj1 = obj1->next; obj1 = obj1->next;
} }
s = strtok(NULL, ","); s = strtok(NULL, ",");
@ -312,19 +379,29 @@ int error_count = 0;
} }
if (obj->element && user && passwd) if (obj->element && user && passwd)
{ {
monitorAddUser(obj->element, user, passwd); monitorAddUser(obj->element,
user,
passwd);
} }
} }
else else
{ {
obj->element = NULL; obj->element = NULL;
skygw_log_write(LOGFILE_ERROR, "Monitor '%s' is missing a require module parameter.\n", obj->object); skygw_log_write_flush(
LOGFILE_ERROR,
"Error : Monitor '%s' is missing a "
"require module parameter.",
obj->object);
error_count++; error_count++;
} }
} }
else if (strcmp(type, "server") != 0) else if (strcmp(type, "server") != 0)
{ {
skygw_log_write(LOGFILE_ERROR, "Configuration object '%s' has an invalid type specified", obj->object); skygw_log_write_flush(
LOGFILE_ERROR,
"Error : Configuration object '%s' has an "
"invalid type specified.",
obj->object);
error_count++; error_count++;
} }
@ -333,10 +410,14 @@ int error_count = 0;
if (error_count) if (error_count)
{ {
skygw_log_write(LOGFILE_ERROR, "%d errors where encountered processing the configuration file '%s'.\n", error_count, config_file); skygw_log_write_flush(
LOGFILE_ERROR,
"Error : %d errors where encountered processing the "
"configuration file '%s'.",
error_count,
config_file);
return 0; return 0;
} }
return 1; return 1;
} }
@ -448,61 +529,112 @@ SERVER *server;
{ {
char *type = config_get_value(obj->parameters, "type"); char *type = config_get_value(obj->parameters, "type");
if (type == NULL) if (type == NULL)
skygw_log_write( LOGFILE_ERROR, "Configuration object %s has no type\n", obj->object); skygw_log_write_flush(
LOGFILE_ERROR,
"Error : Configuration object %s has no type.",
obj->object);
else if (!strcmp(type, "service")) else if (!strcmp(type, "service"))
{ {
char *router = config_get_value(obj->parameters, "router"); char *router = config_get_value(obj->parameters,
"router");
if (router) if (router)
{ {
if ((service = service_find(obj->object)) != NULL) if ((service = service_find(obj->object)) != NULL)
{ {
char *user = config_get_value(obj->parameters, "user"); char *user;
char *auth = config_get_value(obj->parameters, "auth"); char *auth;
user = config_get_value(obj->parameters,
"user");
auth = config_get_value(obj->parameters,
"auth");
if (user && auth) if (user && auth)
service_update(service, router, user, auth); service_update(service, router,
user,
auth);
obj->element = service; obj->element = service;
} }
else else
{ {
obj->element = service_alloc(obj->object, router); char *user;
char *user = config_get_value(obj->parameters, "user"); char *auth;
char *auth = config_get_value(obj->parameters, "auth");
user = config_get_value(obj->parameters,
"user");
auth = config_get_value(obj->parameters,
"auth");
obj->element = service_alloc(obj->object,
router);
if (obj->element && user && auth) if (obj->element && user && auth)
serviceSetUser(obj->element, user, auth); {
serviceSetUser(obj->element,
user,
auth);
}
} }
} }
else else
{ {
obj->element = NULL; obj->element = NULL;
skygw_log_write( LOGFILE_ERROR, "No router defined for service '%s'\n", skygw_log_write_flush(
obj->object); LOGFILE_ERROR,
"Error : No router defined for service "
"'%s'.",
obj->object);
} }
} }
else if (!strcmp(type, "server")) else if (!strcmp(type, "server"))
{ {
char *address = config_get_value(obj->parameters, "address"); char *address;
char *port = config_get_value(obj->parameters, "port"); char *port;
char *protocol = config_get_value(obj->parameters, "protocol"); char *protocol;
char *monuser = config_get_value(obj->parameters, "monitoruser"); char *monuser;
char *monpw = config_get_value(obj->parameters, "monitorpw"); char *monpw;
if (address && port && protocol)
address = config_get_value(obj->parameters, "address");
port = config_get_value(obj->parameters, "port");
protocol = config_get_value(obj->parameters, "protocol");
monuser = config_get_value(obj->parameters,
"monitoruser");
monpw = config_get_value(obj->parameters, "monitorpw");
if (address && port && protocol)
{ {
if ((server = server_find(address, atoi(port))) != NULL) if ((server =
server_find(address, atoi(port))) != NULL)
{ {
server_update(server, protocol, monuser, monpw); server_update(server,
protocol,
monuser,
monpw);
obj->element = server; obj->element = server;
} }
else else
{ {
obj->element = server_alloc(address, protocol, atoi(port)); obj->element = server_alloc(address,
protocol,
atoi(port));
if (obj->element && monuser && monpw) if (obj->element && monuser && monpw)
serverAddMonUser(obj->element, monuser, monpw); {
serverAddMonUser(obj->element,
monuser,
monpw);
}
} }
} }
else else
skygw_log_write(LOGFILE_ERROR, "Server '%s' is missing a required configuration parameter. A server must have address, port and protocol defined.\n", obj->object); {
skygw_log_write_flush(
LOGFILE_ERROR,
"Error : Server '%s' is missing a "
"required "
"configuration parameter. A server must "
"have address, port and protocol "
"defined.",
obj->object);
}
} }
obj = obj->next; obj = obj->next;
} }
@ -518,8 +650,12 @@ SERVER *server;
; ;
else if (!strcmp(type, "service")) else if (!strcmp(type, "service"))
{ {
char *servers = config_get_value(obj->parameters, "servers"); char *servers;
char *roptions = config_get_value(obj->parameters, "router_options"); char *roptions;
servers = config_get_value(obj->parameters, "servers");
roptions = config_get_value(obj->parameters,
"router_options");
if (servers && obj->element) if (servers && obj->element)
{ {
char *s = strtok(servers, ","); char *s = strtok(servers, ",");
@ -528,9 +664,16 @@ SERVER *server;
CONFIG_CONTEXT *obj1 = context; CONFIG_CONTEXT *obj1 = context;
while (obj1) while (obj1)
{ {
if (strcmp(s, obj1->object) == 0 && obj->element && obj1->element) if (strcmp(s, obj1->object) == 0 &&
obj->element && obj1->element)
{
if (!serviceHasBackend(obj->element, obj1->element)) if (!serviceHasBackend(obj->element, obj1->element))
serviceAddBackend(obj->element, obj1->element); {
serviceAddBackend(
obj->element,
obj1->element);
}
}
obj1 = obj1->next; obj1 = obj1->next;
} }
s = strtok(NULL, ","); s = strtok(NULL, ",");
@ -549,40 +692,89 @@ SERVER *server;
} }
else if (!strcmp(type, "listener")) else if (!strcmp(type, "listener"))
{ {
char *service = config_get_value(obj->parameters, "service"); char *service;
char *port = config_get_value(obj->parameters, "port"); char *port;
char *protocol = config_get_value(obj->parameters, "protocol"); char *protocol;
if (service && port && protocol)
service = config_get_value(obj->parameters, "service");
port = config_get_value(obj->parameters, "port");
protocol = config_get_value(obj->parameters, "protocol");
if (service && port && protocol)
{ {
CONFIG_CONTEXT *ptr = context; CONFIG_CONTEXT *ptr = context;
while (ptr && strcmp(ptr->object, service) != 0) while (ptr && strcmp(ptr->object, service) != 0)
ptr = ptr->next; ptr = ptr->next;
if (ptr && ptr->element && serviceHasProtocol(ptr->element, protocol, atoi(port)) == 0)
if (ptr &&
ptr->element &&
serviceHasProtocol(ptr->element,
protocol,
atoi(port)) == 0)
{ {
serviceAddProtocol(ptr->element, protocol, atoi(port)); serviceAddProtocol(ptr->element,
serviceStartProtocol(ptr->element, protocol, atoi(port)); protocol,
atoi(port));
serviceStartProtocol(ptr->element,
protocol,
atoi(port));
} }
} }
} }
else if (strcmp(type, "server") != 0 && strcmp(type, "monitor") != 0) else if (strcmp(type, "server") != 0 &&
strcmp(type, "monitor") != 0)
{ {
skygw_log_write(LOGFILE_ERROR, "Configuration object %s has an invalid type specified", obj->object); skygw_log_write_flush(
LOGFILE_ERROR,
"Error : Configuration object %s has an invalid "
"type specified.",
obj->object);
} }
obj = obj->next; obj = obj->next;
} }
return 1; return 1;
} }
static char *service_params[] = static char *service_params[] =
{ "type", "router", "router_options", "servers", "user", "auth", NULL }; {
"type",
"router",
"router_options",
"servers",
"user",
"auth",
NULL
};
static char *server_params[] = static char *server_params[] =
{ "type", "address", "port", "protocol", "monitorpw", "monitoruser", NULL }; {
"type",
"address",
"port",
"protocol",
"monitorpw",
"monitoruser",
NULL
};
static char *listener_params[] = static char *listener_params[] =
{ "type", "service", "protocol", "port", NULL }; {
"type",
"service",
"protocol",
"port",
NULL
};
static char *monitor_params[] = static char *monitor_params[] =
{ "type", "module", "servers", "user", "passwd", NULL }; {
"type",
"module",
"servers",
"user",
"passwd",
NULL
};
/** /**
* Check the configuration objects have valid parameters * Check the configuration objects have valid parameters
*/ */
@ -622,9 +814,14 @@ int i;
if (!strcmp(params->name, param_set[i])) if (!strcmp(params->name, param_set[i]))
found = 1; found = 1;
if (found == 0) if (found == 0)
skygw_log_write(LOGFILE_ERROR, skygw_log_write_flush(
"Unexpected parameter '%s' for object '%s' of type '%s'.\n", LOGFILE_ERROR,
params->name, obj->object, type); "Error : Unexpected parameter "
"'%s' for xobject '%s' of type "
"'%s'.",
params->name,
obj->object,
type);
params = params->next; params = params->next;
} }
} }

View File

@ -103,20 +103,28 @@ getUsers(SERVICE *service, struct users *users)
serviceGetUser(service, &service_user, &service_passwd); serviceGetUser(service, &service_user, &service_passwd);
/** multi-thread environment requires that thread init succeeds. */ /** multi-thread environment requires that thread init succeeds. */
if (mysql_thread_init()) { if (mysql_thread_init()) {
skygw_log_write_flush(LOGFILE_ERROR, "ERROR : mysql_thread_init failed.\n"); skygw_log_write_flush(
LOGFILE_ERROR,
"Error : mysql_thread_init failed.");
return -1; return -1;
} }
con = mysql_init(NULL); con = mysql_init(NULL);
if (con == NULL) { if (con == NULL) {
skygw_log_write( LOGFILE_ERROR, "mysql_init: %s\n", mysql_error(con)); skygw_log_write_flush(
LOGFILE_ERROR,
"Error : mysql_init: %s",
mysql_error(con));
return -1; return -1;
} }
if (mysql_options(con, MYSQL_OPT_USE_REMOTE_CONNECTION, NULL)) { if (mysql_options(con, MYSQL_OPT_USE_REMOTE_CONNECTION, NULL)) {
skygw_log_write_flush(LOGFILE_ERROR, "Fatal : failed to set external connection. " skygw_log_write_flush(
"It is needed for backend server connections. Exiting.\n"); LOGFILE_ERROR,
"Error : failed to set external connection. "
"It is needed for backend server connections. "
"Exiting.");
return -1; return -1;
} }
/* /*
@ -126,59 +134,64 @@ getUsers(SERVICE *service, struct users *users)
*/ */
server = service->databases; server = service->databases;
dpwd = decryptPassword(service_passwd); dpwd = decryptPassword(service_passwd);
while (server && mysql_real_connect(con, while (server != NULL && mysql_real_connect(con,
server->name, server->name,
service_user, service_user,
dpwd, dpwd,
NULL, NULL,
server->port, server->port,
NULL, NULL,
0) == NULL) 0) == NULL)
{ {
server = server->nextdb; server = server->nextdb;
} }
free(dpwd); free(dpwd);
if (server == NULL) if (server == NULL)
{ {
skygw_log_write( skygw_log_write_flush(
LOGFILE_ERROR, LOGFILE_ERROR,
"Unable to get user data from backend database for service " "Error : Unable to get user data from backend database "
"%s. Missing server information.", "for service %s. Missing server information.",
service->name); service->name);
mysql_close(con); mysql_close(con);
return -1; return -1;
} }
if (mysql_query(con, "SELECT user, password FROM mysql.user")) { if (mysql_query(con, "SELECT user, password FROM mysql.user")) {
skygw_log_write( LOGFILE_ERROR, skygw_log_write_flush(
"Loading users for service %s encountered error: %s\n", LOGFILE_ERROR,
service->name, mysql_error(con)); "Error : Loading users for service %s encountered "
"error: %s.",
service->name,
mysql_error(con));
mysql_close(con); mysql_close(con);
return -1; return -1;
} }
result = mysql_store_result(con); result = mysql_store_result(con);
if (result == NULL) { if (result == NULL) {
skygw_log_write( LOGFILE_ERROR, skygw_log_write_flush(
"Loading users for service %s encountered error: %s\n", LOGFILE_ERROR,
service->name, mysql_error(con)); "Error : Loading users for service %s encountered "
"error: %s.",
service->name,
mysql_error(con));
mysql_close(con); mysql_close(con);
return -1; return -1;
} }
num_fields = mysql_num_fields(result); num_fields = mysql_num_fields(result);
while ((row = mysql_fetch_row(result))) { while ((row = mysql_fetch_row(result))) {
// we assume here two fields are returned !!! /**
// now adding to the hastable user and passwd+1 (escaping the first byte that is '*') * Two fields should be returned.
* user and passwd+1 (escaping the first byte that is '*') are
* added to hashtable.
*/
users_add(users, row[0], strlen(row[1]) ? row[1]+1 : row[1]); users_add(users, row[0], strlen(row[1]) ? row[1]+1 : row[1]);
total_users++; total_users++;
} }
mysql_free_result(result); mysql_free_result(result);
mysql_close(con); mysql_close(con);
mysql_thread_end(); mysql_thread_end();
return total_users; return total_users;
} }

View File

@ -35,14 +35,18 @@
* 28/06/13 Mark Riddoch Changed the free mechanism ti * 28/06/13 Mark Riddoch Changed the free mechanism ti
* introduce a zombie state for the * introduce a zombie state for the
* dcb * dcb
* 02/07/2013 Massimiliano Pinto Addition of delayqlock, delayq and authlock * 02/07/2013 Massimiliano Pinto Addition of delayqlock, delayq and
* for handling backend asynchronous protocol connection * authlock for handling backend
* and a generic lock for backend authentication * asynchronous protocol connection
* and a generic lock for backend
* authentication
* 16/07/2013 Massimiliano Pinto Added command type for dcb * 16/07/2013 Massimiliano Pinto Added command type for dcb
* 23/07/2013 Mark Riddoch Tidy up logging * 23/07/2013 Mark Riddoch Tidy up logging
* 02/09/2013 Massimiliano Pinto Added session refcount * 02/09/2013 Massimiliano Pinto Added session refcount
* 27/09/2013 Massimiliano Pinto dcb_read returns 0 if ioctl returns no error and 0 bytes to read * 27/09/2013 Massimiliano Pinto dcb_read returns 0 if ioctl returns no
* This fixes a bug with many reads from backend * error and 0 bytes to read.
* This fixes a bug with many reads from
* backend
* *
* @endverbatim * @endverbatim
*/ */
@ -183,10 +187,10 @@ dcb_add_to_zombieslist(DCB *dcb)
if (ptr == dcb) if (ptr == dcb)
{ {
skygw_log_write( skygw_log_write_flush(
LOGFILE_ERROR, LOGFILE_ERROR,
"Attempt to add DCB to zombies list " "Error : Attempt to add DCB to zombies "
"when it is already in the list"); "list when it is already in the list");
break; break;
} }
ptr = ptr->memdata.next; ptr = ptr->memdata.next;
@ -375,9 +379,8 @@ bool succp = false;
errno = 0; errno = 0;
skygw_log_write_flush( skygw_log_write_flush(
LOGFILE_ERROR, LOGFILE_ERROR,
"%lu [dcb_process_zombies] Failed to close socket " "Error : Failed to close "
"%d on dcb %p due error %d, %s.", "socket %d on dcb %p due error %d, %s.",
pthread_self(),
dcb->fd, dcb->fd,
dcb, dcb,
eno, eno,
@ -428,14 +431,17 @@ int fd;
{ {
return NULL; return NULL;
} }
if ((funcs = (GWPROTOCOL *)load_module(protocol, MODULE_PROTOCOL)) == NULL) if ((funcs = (GWPROTOCOL *)load_module(protocol,
MODULE_PROTOCOL)) == NULL)
{ {
dcb_set_state(dcb, DCB_STATE_DISCONNECTED, NULL); dcb_set_state(dcb, DCB_STATE_DISCONNECTED, NULL);
dcb_final_free(dcb); dcb_final_free(dcb);
skygw_log_write( skygw_log_write_flush(
LOGFILE_ERROR, LOGFILE_ERROR,
"Failed to load protocol module for %s, free dcb %p\n", "Error : Failed to load protocol module for %s, free "
protocol, dcb); "dcb %p\n",
protocol,
dcb);
return NULL; return NULL;
} }
memcpy(&(dcb->func), funcs, sizeof(GWPROTOCOL)); memcpy(&(dcb->func), funcs, sizeof(GWPROTOCOL));
@ -444,20 +450,19 @@ int fd;
{ {
skygw_log_write( skygw_log_write(
LOGFILE_TRACE, LOGFILE_TRACE,
"dcb_connect: failed to link to session, the session " "%lu [dcb_connect] Failed to link to session, the "
"has been removed."); "session has been removed.",
pthread_self());
dcb_final_free(dcb); dcb_final_free(dcb);
return NULL; return NULL;
} }
fd = dcb->func.connect(dcb, server, session); fd = dcb->func.connect(dcb, server, session);
if (fd == -1) { if (fd == -1) {
skygw_log_write_flush( skygw_log_write_flush(
LOGFILE_ERROR, LOGFILE_ERROR,
"%lu [dcb_connect] Failed to connect to server %s:%d, " "Error : Failed to connect to server %s:%d, "
"from backend dcb %p, client dcp %p fd %d\n", "from backend dcb %p, client dcp %p fd %d.",
pthread_self(),
server->name, server->name,
server->port, server->port,
dcb, dcb,
@ -470,7 +475,7 @@ int fd;
skygw_log_write_flush( skygw_log_write_flush(
LOGFILE_TRACE, LOGFILE_TRACE,
"%lu [dcb_connect] Connected to server %s:%d, " "%lu [dcb_connect] Connected to server %s:%d, "
"from backend dcb %p, client dcp %p fd %d\n", "from backend dcb %p, client dcp %p fd %d.",
pthread_self(), pthread_self(),
server->name, server->name,
server->port, server->port,
@ -535,17 +540,15 @@ int eno = 0;
if (rc == -1) { if (rc == -1) {
eno = errno; eno = errno;
errno = 0; errno = 0;
skygw_log_write( skygw_log_write_flush(
LOGFILE_ERROR, LOGFILE_ERROR,
"%lu [dcb_read] ioctl FIONREAD for dcb %p fd %d " "Error : ioctl FIONREAD for dcb %p in "
"failed. " "state %s fd %d failed due error %d, %s.",
"errno %d, %s. dcb->state = %d",
pthread_self(),
dcb, dcb,
STRDCBSTATE(dcb->state),
dcb->fd, dcb->fd,
eno, eno,
strerror(eno), strerror(eno));
dcb->state);
n = -1; n = -1;
goto return_n; goto return_n;
} }
@ -562,11 +565,10 @@ int eno = 0;
* This is a fatal error which should cause shutdown. * This is a fatal error which should cause shutdown.
* vraa : todo shutdown if memory allocation fails. * vraa : todo shutdown if memory allocation fails.
*/ */
skygw_log_write( skygw_log_write_flush(
LOGFILE_ERROR, LOGFILE_ERROR,
"%lu [dcb_read] Failed to allocate read buffer " "Error : Failed to allocate read buffer "
"for dcb %p fd %d, due %d, %d.", "for dcb %p fd %d, due %d, %s.",
pthread_self(),
dcb, dcb,
dcb->fd, dcb->fd,
eno, eno,
@ -584,12 +586,12 @@ int eno = 0;
int eno = errno; int eno = errno;
errno = 0; errno = 0;
skygw_log_write( skygw_log_write_flush(
LOGFILE_ERROR, LOGFILE_ERROR,
"%lu [dcb_read] Read failed, dcb %p fd %d, due " "Error : Read failed, dcb %p in state %s "
"%d, %d.", "fd %d, due %d, %s.",
pthread_self(),
dcb, dcb,
STRSCBSTATE(dcb->state),
dcb->fd, dcb->fd,
eno, eno,
strerror(eno)); strerror(eno));
@ -599,10 +601,12 @@ int eno = 0;
skygw_log_write( skygw_log_write(
LOGFILE_TRACE, LOGFILE_TRACE,
"%lu [dcb_read] Read %d bytes from dcb %p fd %d", "%lu [dcb_read] Read %d bytes from dcb %p in state %s "
"fd %d.",
pthread_self(), pthread_self(),
n, n,
dcb, dcb,
STRDCBSTATE(dcb->state),
dcb->fd); dcb->fd);
/** Append read data to the gwbuf */ /** Append read data to the gwbuf */
*head = gwbuf_append(*head, buffer); *head = gwbuf_append(*head, buffer);
@ -642,9 +646,11 @@ int w, saved_errno = 0;
skygw_log_write( skygw_log_write(
LOGFILE_TRACE, LOGFILE_TRACE,
"%lu [dcb_write] Append to writequeue. %d writes " "%lu [dcb_write] Append to writequeue. %d writes "
"buffered for %d", "buffered for dcb %p in state %s fd %d",
pthread_self(), pthread_self(),
dcb->stats.n_buffered, dcb->stats.n_buffered,
dcb,
STRDCBSTATE(dcb->state),
dcb->fd); dcb->fd);
} }
else else
@ -679,7 +685,9 @@ int w, saved_errno = 0;
} }
#endif /* SS_DEBUG */ #endif /* SS_DEBUG */
len = GWBUF_LENGTH(queue); len = GWBUF_LENGTH(queue);
GW_NOINTR_CALL(w = gw_write(dcb->fd, GWBUF_DATA(queue), len); GW_NOINTR_CALL(w = gw_write(dcb->fd,
GWBUF_DATA(queue),
len);
dcb->stats.n_writes++); dcb->stats.n_writes++);
saved_errno = errno; saved_errno = errno;
errno = 0; errno = 0;
@ -688,10 +696,10 @@ int w, saved_errno = 0;
{ {
skygw_log_write_flush( skygw_log_write_flush(
LOGFILE_ERROR, LOGFILE_ERROR,
"%lu [dcb_write] Write to dcb %p fd %d " "Error : Write to dcb %p in "
"failed due errno %d, %s", "state %s fd %d failed due errno %d, %s",
pthread_self(),
dcb, dcb,
STRDCBSTATE(dcb->state),
dcb->fd, dcb->fd,
saved_errno, saved_errno,
strerror(saved_errno)); strerror(saved_errno));
@ -705,10 +713,12 @@ int w, saved_errno = 0;
queue = gwbuf_consume(queue, w); queue = gwbuf_consume(queue, w);
skygw_log_write( skygw_log_write(
LOGFILE_TRACE, LOGFILE_TRACE,
"%lu [dcb_write] Wrote %d Bytes to dcb %p fd %d", "%lu [dcb_write] Wrote %d Bytes to dcb %p in "
"state %s fd %d",
pthread_self(), pthread_self(),
w, w,
dcb, dcb,
STRDCBSTATE(dcb->state),
dcb->fd); dcb->fd);
} }
/* Buffer the balance of any data */ /* Buffer the balance of any data */
@ -722,10 +732,16 @@ int w, saved_errno = 0;
if (queue && (saved_errno != EAGAIN || saved_errno != EWOULDBLOCK)) if (queue && (saved_errno != EAGAIN || saved_errno != EWOULDBLOCK))
{ {
skygw_log_write_flush(
LOGFILE_ERROR,
"Error : Writing to dcb %p in state %s fd %d "
"failed.",
dcb,
STRDCBSTATE(dcb->state),
dcb->fd);
/* We had a real write failure that we must deal with */ /* We had a real write failure that we must deal with */
return 0; return 0;
} }
return 1; return 1;
} }
@ -757,37 +773,38 @@ int saved_errno = 0;
while (dcb->writeq != NULL) while (dcb->writeq != NULL)
{ {
len = GWBUF_LENGTH(dcb->writeq); len = GWBUF_LENGTH(dcb->writeq);
GW_NOINTR_CALL(w = gw_write(dcb->fd, GWBUF_DATA(dcb->writeq), len);); GW_NOINTR_CALL(w = gw_write(dcb->fd,
GWBUF_DATA(dcb->writeq),
len););
saved_errno = errno; saved_errno = errno;
errno = 0; errno = 0;
if (w < 0) if (w < 0)
{ {
skygw_log_write( skygw_log_write_flush(
LOGFILE_ERROR, LOGFILE_ERROR,
"%lu [dcb_drain_writeq] Write to fd %d " "Error : Write to dcb %p "
"failed due errno %d, %s", "in state fd %d failed due errno %d, %s",
pthread_self(), dcb,
STRDCBSTATE(dcb->state),
dcb->fd, dcb->fd,
saved_errno, saved_errno,
strerror(saved_errno)); strerror(saved_errno));
break; break;
} }
/* /*
* Pull the number of bytes we have written from * Pull the number of bytes we have written from
* queue with have. * queue with have.
*/ */
dcb->writeq = gwbuf_consume(dcb->writeq, w); dcb->writeq = gwbuf_consume(dcb->writeq, w);
if (w < len)
{
/* We didn't write all the data */
}
skygw_log_write( skygw_log_write(
LOGFILE_TRACE, LOGFILE_TRACE,
"%lu [dcb_drain_writeq] Wrote %d Bytes to fd %d", "%lu [dcb_drain_writeq] Wrote %d Bytes to dcb %p "
"in state %s fd %d",
pthread_self(), pthread_self(),
w, w,
dcb,
STRDCBSTATE(dcb->state),
dcb->fd); dcb->fd);
n += w; n += w;
} }
@ -833,11 +850,10 @@ dcb_close(DCB *dcb)
dcb, dcb,
STRDCBSTATE(dcb->state)); STRDCBSTATE(dcb->state));
} else { } else {
skygw_log_write( skygw_log_write_flush(
LOGFILE_TRACE, LOGFILE_ERROR,
"%lu [poll_remove_dcb] Removing dcb %p in state %s from " "Error : Removing dcb %p in state %s from "
"poll set failed.", "poll set failed.",
pthread_self(),
dcb, dcb,
STRDCBSTATE(dcb->state)); STRDCBSTATE(dcb->state));
} }
@ -1160,11 +1176,12 @@ static bool dcb_set_state_nomutex(
break; break;
default: default:
skygw_log_write( skygw_log_write_flush(
LOGFILE_ERROR, LOGFILE_ERROR,
"%lu [dcb_set_state_nomutex] Unknown dcb state %d", "Error : Unknown dcb state %s for "
pthread_self(), "dcb %p",
dcb->state); STRDCBSTATE(dcb->state),
dcb);
ss_dassert(false); ss_dassert(false);
break; break;
} /* switch (dcb->state) */ } /* switch (dcb->state) */

View File

@ -104,14 +104,18 @@ static void libmysqld_done(void);
*/ */
static void sighup_handler (int i) static void sighup_handler (int i)
{ {
skygw_log_write( LOGFILE_MESSAGE, "Refreshing configuration following SIGHUP\n"); skygw_log_write(
LOGFILE_MESSAGE,
"Refreshing configuration following SIGHUP\n");
config_reload(); config_reload();
} }
static void sigterm_handler (int i) { static void sigterm_handler (int i) {
extern void shutdown_gateway(); extern void shutdown_gateway();
skygw_log_write( LOGFILE_ERROR, "Signal SIGTERM %i received ...Exiting!\n", i); skygw_log_write_flush(
LOGFILE_ERROR,
"Error : Signal SIGTERM %i received ...Exiting!", i);
shutdown_gateway(); shutdown_gateway();
} }
@ -120,7 +124,9 @@ sigint_handler (int i)
{ {
extern void shutdown_gateway(); extern void shutdown_gateway();
skygw_log_write( LOGFILE_ERROR, "Signal SIGINT %i received ...Exiting!\n", i); skygw_log_write_flush(
LOGFILE_ERROR,
"Error : Signal SIGINT %i received ...Exiting!", i);
shutdown_gateway(); shutdown_gateway();
fprintf(stderr, "Shuting down MaxScale\n"); fprintf(stderr, "Shuting down MaxScale\n");
} }
@ -134,7 +140,10 @@ static void signal_set (int sig, void (*handler)(int)) {
sigact.sa_handler = handler; sigact.sa_handler = handler;
GW_NOINTR_CALL(err = sigaction(sig, &sigact, NULL)); GW_NOINTR_CALL(err = sigaction(sig, &sigact, NULL));
if (err < 0) { if (err < 0) {
skygw_log_write( LOGFILE_ERROR,"sigaction() error %s\n", strerror(errno)); skygw_log_write_flush(
LOGFILE_ERROR,
"Error : sigaction() error %s.",
strerror(errno));
exit(1); exit(1);
} }
} }
@ -248,21 +257,20 @@ fail_accept_errno = 0;
*/ */
if (strncmp(argv[n], "-c", 2) == 0) if (strncmp(argv[n], "-c", 2) == 0)
{ {
int s=2; int s=2;
while (argv[n][s] == 0 && s<10) s++; while (argv[n][s] == 0 && s<10) s++;
if (s==10) { if (s==10) {
skygw_log_write( skygw_log_write_flush(
LOGFILE_ERROR, LOGFILE_ERROR,
"Fatal : missing file name. \n" "Fatal : Unable to find a MaxScale "
"Unable to find a MaxScale configuration file, " "configuration file, either install one in "
"either install one in /etc/MaxScale.cnf, " "/etc/MaxScale.cnf, "
"$MAXSCALE_HOME/etc/MaxScale.cnf " "$MAXSCALE_HOME/etc/MaxScale.cnf "
"or use the -c option with configuration file " "or use the -c option. Exiting.");
"name. Exiting.\n"); }
} cnf_file = &argv[n][s];
cnf_file = &argv[n][s];
} }
} }
@ -273,34 +281,33 @@ fail_accept_errno = 0;
if (daemon_mode == 1) if (daemon_mode == 1)
{ {
if (sigfillset(&sigset) != 0) { if (sigfillset(&sigset) != 0) {
skygw_log_write( skygw_log_write_flush(
LOGFILE_ERROR, LOGFILE_ERROR,
"sigfillset() error %s\n", "Error : sigfillset() error %s",
strerror(errno)); strerror(errno));
return 1; return 1;
} }
if (sigdelset(&sigset, SIGHUP) != 0) { if (sigdelset(&sigset, SIGHUP) != 0) {
skygw_log_write( skygw_log_write_flush(
LOGFILE_ERROR, LOGFILE_ERROR,
"sigdelset(SIGHUP) error %s\n", "Error : sigdelset(SIGHUP) error %s",
strerror(errno)); strerror(errno));
} }
if (sigdelset(&sigset, SIGTERM) != 0) { if (sigdelset(&sigset, SIGTERM) != 0) {
skygw_log_write( skygw_log_write_flush(
LOGFILE_ERROR, LOGFILE_ERROR,
"sigdelset(SIGTERM) error %s\n", "Error : sigdelset(SIGTERM) error %s",
strerror(errno)); strerror(errno));
} }
if (sigprocmask(SIG_SETMASK, &sigset, NULL) != 0) { if (sigprocmask(SIG_SETMASK, &sigset, NULL) != 0) {
skygw_log_write( skygw_log_write_flush(
LOGFILE_ERROR, LOGFILE_ERROR,
"sigprocmask() error %s\n", "Error : sigprocmask() error %s",
strerror(errno)); strerror(errno));
} }
gw_daemonize(); gw_daemonize();
} }
@ -308,18 +315,27 @@ fail_accept_errno = 0;
signal_set(SIGTERM, sigterm_handler); signal_set(SIGTERM, sigterm_handler);
signal_set(SIGINT, sigint_handler); signal_set(SIGINT, sigint_handler);
l = atexit(libmysqld_done); l = atexit(libmysqld_done);
if (l != 0) { if (l != 0) {
fprintf(stderr, "Couldn't register exit function.\n"); fprintf(stderr, "Couldn't register exit function.\n");
skygw_log_write_flush(
LOGFILE_ERROR,
"Error : Couldn't register exit function.");
} }
if ((home = getenv("MAXSCALE_HOME")) != NULL) if ((home = getenv("MAXSCALE_HOME")) != NULL)
{ {
if (access(home, R_OK) != 0) if (access(home, R_OK) != 0)
{ {
fprintf(stderr,"The configured value of MAXSCALE_HOME '%s' does not exist.\n", fprintf(stderr,
"The configured value of MAXSCALE_HOME '%s' does not "
"exist.\n",
home);
skygw_log_write_flush(
LOGFILE_ERROR,
"Fatal : The configured value of MAXSCALE_HOME '%s' does "
"not exist.",
home); home);
exit(1); exit(1);
} }
@ -386,8 +402,9 @@ fail_accept_errno = 0;
"Fatal : Unable to find a MaxScale configuration " "Fatal : Unable to find a MaxScale configuration "
"file, either install one in /etc/MaxScale.cnf, " "file, either install one in /etc/MaxScale.cnf, "
"$MAXSCALE_HOME/etc/MaxScale.cnf " "$MAXSCALE_HOME/etc/MaxScale.cnf "
"or use the -c option. Exiting.\n"); "or use the -c option. Exiting.");
fprintf(stderr, "Unable to find configuration file - MaxScale exiting.\n"); fprintf(stderr, "Unable to find MaxScale configuration file. "
"Exiting.\n");
exit(1); exit(1);
} }
@ -404,15 +421,15 @@ fail_accept_errno = 0;
if (mysql_library_init(num_elements, server_options, server_groups)) if (mysql_library_init(num_elements, server_options, server_groups))
{ {
skygw_log_write_flush( skygw_log_write_flush(
LOGFILE_ERROR, LOGFILE_ERROR,
"Fatal : mysql_library_init failed, %s. This is mandatory " "Fatal : mysql_library_init failed. It is a "
"component, required by router services and the MaxScale core, " "mandatory component, required by router services and "
"the MaxScale can't continue without it. Exiting.\n" "the MaxScale core. Error %s, %s : %d. Exiting.",
"%s : %d", mysql_error(NULL),
mysql_error(NULL), __FILE__,
__FILE__, __LINE__);
__LINE__); fprintf(stderr,
fprintf(stderr, "Failed to initialise the MySQL library - MaxScale exiting.\n"); "Failed to initialise the MySQL library. Exiting.\n");
exit(1); exit(1);
} }
libmysqld_started = TRUE; libmysqld_started = TRUE;
@ -420,17 +437,21 @@ fail_accept_errno = 0;
if (!config_load(cnf_file)) if (!config_load(cnf_file))
{ {
skygw_log_write_flush( skygw_log_write_flush(
LOGFILE_ERROR, LOGFILE_ERROR,
"Failed to load MaxScale configuration file %s", cnf_file); "Fatal : Failed to load MaxScale configuration file %s. "
fprintf(stderr, "Fatal error loading the configuration file - MaxScale exiting.\n"); "Exiting.",
cnf_file);
fprintf(stderr,
"Failed to load MaxScale configuration file. "
"Exiting.\n");
exit(1); exit(1);
} }
skygw_log_write( skygw_log_write(
LOGFILE_MESSAGE, LOGFILE_MESSAGE,
"SkySQL MaxScale (C) SkySQL Ab 2013"); "SkySQL MaxScale (C) SkySQL Ab 2013");
skygw_log_write( skygw_log_write(
LOGFILE_MESSAGE, LOGFILE_MESSAGE,
"MaxScale is starting, PID %i", "MaxScale is starting, PID %i",
getpid()); getpid());
@ -442,11 +463,18 @@ fail_accept_errno = 0;
n_services = serviceStartAll(); n_services = serviceStartAll();
if (n_services == 0) if (n_services == 0)
{ {
skygw_log_write(LOGFILE_ERROR, "Failed to start any services."); skygw_log_write_flush(
fprintf(stderr, "Failed to start any services - MaxScale exiting.\n"); LOGFILE_ERROR,
"Fatal : Failed to start any MaxScale services. "
"Exiting.");
fprintf(stderr,
"Failed to start any MaxScale services. Exiting.\n");
exit(1); exit(1);
} }
skygw_log_write(LOGFILE_MESSAGE, "Started %d services succesfully.", n_services); skygw_log_write(
LOGFILE_MESSAGE,
"Started %d services succesfully.",
n_services);
/** /**
* Start periodic log flusher thread. * Start periodic log flusher thread.

View File

@ -17,16 +17,16 @@
*/ */
/** /**
* @file load_utils.c Utility functions to aid the loading of dynamic modules * @file load_utils.c Utility functions to aid the loading of dynamic
* into the gateway * modules into the gateway
* *
* @verbatim * @verbatim
* Revision History * Revision History
* *
* Date Who Description * Date Who Description
* 13/06/13 Mark Riddoch Initial implementation * 13/06/13 Mark Riddoch Initial implementation
* 14/06/13 Mark Riddoch Updated to add call to ModuleInit if one is defined * 14/06/13 Mark Riddoch Updated to add call to ModuleInit if one is
* in the loaded module. * defined in the loaded module.
* Also updated to call fixed GetModuleObject * Also updated to call fixed GetModuleObject
* *
* @endverbatim * @endverbatim
@ -44,7 +44,11 @@
static MODULES *registered = NULL; static MODULES *registered = NULL;
static MODULES *find_module(const char *module); static MODULES *find_module(const char *module);
static void register_module(const char *module, const char *type, void *dlhandle, char *version, void *modobj); static void register_module(const char *module,
const char *type,
void *dlhandle,
char *version,
void *modobj);
static void unregister_module(const char *module); static void unregister_module(const char *module);
/** /**
@ -81,25 +85,33 @@ MODULES *mod;
sprintf(fname, "%s/modules/lib%s.so", home, module); sprintf(fname, "%s/modules/lib%s.so", home, module);
if (access(fname, F_OK) == -1) if (access(fname, F_OK) == -1)
{ {
skygw_log_write( LOGFILE_ERROR, skygw_log_write_flush(
"Unable to find library for module: %s\n", module); LOGFILE_ERROR,
"Error : Unable to find library for "
"module: %s.",
module);
return NULL; return NULL;
} }
} }
if ((dlhandle = dlopen(fname, RTLD_NOW|RTLD_LOCAL)) == NULL) if ((dlhandle = dlopen(fname, RTLD_NOW|RTLD_LOCAL)) == NULL)
{ {
skygw_log_write( LOGFILE_ERROR, skygw_log_write_flush(
"Unable to load library for module: %s, %s\n", module, dlerror()); LOGFILE_ERROR,
"Error : Unable to load library for module: "
"%s, %s.",
module,
dlerror());
return NULL; return NULL;
} }
if ((sym = dlsym(dlhandle, "version")) == NULL) if ((sym = dlsym(dlhandle, "version")) == NULL)
{ {
skygw_log_write_flush( skygw_log_write_flush(
LOGFILE_ERROR, LOGFILE_ERROR,
"Version interface not supported by module: %s, %s\n", "Error : Version interface not supported by "
module, "module: %s, %s.",
dlerror()); module,
dlerror());
dlclose(dlhandle); dlclose(dlhandle);
return NULL; return NULL;
} }
@ -118,21 +130,22 @@ MODULES *mod;
if ((sym = dlsym(dlhandle, "GetModuleObject")) == NULL) if ((sym = dlsym(dlhandle, "GetModuleObject")) == NULL)
{ {
skygw_log_write_flush( skygw_log_write_flush(
LOGFILE_ERROR, LOGFILE_ERROR,
"Expected entry point interface missing from module: " "Error : Expected entry point interface missing "
"%s, %s\n", "from module: %s, %s.",
module, module,
dlerror()); dlerror());
dlclose(dlhandle); dlclose(dlhandle);
return NULL; return NULL;
} }
ep = sym; ep = sym;
modobj = ep(); modobj = ep();
skygw_log_write_flush(LOGFILE_MESSAGE, skygw_log_write_flush(
"Loaded module %s: %s\n", LOGFILE_MESSAGE,
module, "Loaded module %s: %s.",
version); module,
version);
register_module(module, type, dlhandle, version, modobj); register_module(module, type, dlhandle, version, modobj);
} }
else else

View File

@ -61,13 +61,15 @@ MONITOR *mon;
mon->name = strdup(name); mon->name = strdup(name);
if ((mon->module = load_module(module, MODULE_MONITOR)) == NULL) if ((mon->module = load_module(module, MODULE_MONITOR)) == NULL)
{ {
skygw_log_write( LOGFILE_ERROR, "Unable to load monitor module '%s'\n", name); skygw_log_write_flush(
LOGFILE_ERROR,
"Error : Unable to load monitor module '%s'.",
name);
free(mon->name); free(mon->name);
free(mon); free(mon);
return NULL; return NULL;
} }
mon->handle = (*mon->module->startMonitor)(NULL); mon->handle = (*mon->module->startMonitor)(NULL);
spinlock_acquire(&monLock); spinlock_acquire(&monLock);
mon->next = allMonitors; mon->next = allMonitors;
allMonitors = mon; allMonitors = mon;

View File

@ -115,40 +115,38 @@ poll_add_dcb(DCB *dcb)
*/ */
if (dcb_set_state(dcb, new_state, &old_state)) { if (dcb_set_state(dcb, new_state, &old_state)) {
rc = epoll_ctl(epoll_fd, EPOLL_CTL_ADD, dcb->fd, &ev); rc = epoll_ctl(epoll_fd, EPOLL_CTL_ADD, dcb->fd, &ev);
ss_dassert(rc == 0);
if (rc != 0) {
int eno = errno;
errno = 0;
skygw_log_write_flush(
LOGFILE_ERROR,
"Error : Adding dcb %p in state %s "
"to poll set failed. epoll_ctl failed due "
"%d, %s.",
dcb,
STRDCBSTATE(dcb->state),
eno,
strerror(eno));
} else {
skygw_log_write(
LOGFILE_DEBUG,
"%lu [poll_add_dcb] Added dcb %p in state %s to "
"poll set.",
pthread_self(),
dcb,
STRDCBSTATE(dcb->state));
}
ss_dassert(rc == 0); /**< trap in debug */
} else { } else {
skygw_log_write( skygw_log_write_flush(
LOGFILE_ERROR, LOGFILE_ERROR,
"%lu [poll_add_dcb] Unable to set new state for dcb %p " "Error : Unable to set new state for dcb %p "
"in state %s. Adding to poll set failed.", "in state %s. Adding to poll set failed.",
pthread_self(),
dcb, dcb,
STRDCBSTATE(dcb->state)); STRDCBSTATE(dcb->state));
goto return_rc;
} }
if (rc != 0) {
int eno = errno;
errno = 0;
skygw_log_write(
LOGFILE_ERROR,
"%lu [poll_add_dcb] Adding dcb %p to poll set failed. "
"epoll_ctl failed due %d, %s.",
pthread_self(),
dcb,
STRDCBSTATE(dcb->state),
eno,
strerror(eno));
goto return_rc;
} else {
skygw_log_write(
LOGFILE_DEBUG,
"%lu [poll_add_dcb] Added dcb %p to "
"poll set.",
pthread_self(),
dcb);
}
return_rc:
return rc; return rc;
} }
@ -171,6 +169,7 @@ poll_remove_dcb(DCB *dcb)
CHK_DCB(dcb); CHK_DCB(dcb);
/** It is possible that dcb has already been removed from the set */
if (dcb->state != DCB_STATE_POLLING) { if (dcb->state != DCB_STATE_POLLING) {
goto return_rc; goto return_rc;
} }
@ -186,12 +185,11 @@ poll_remove_dcb(DCB *dcb)
errno = 0; errno = 0;
skygw_log_write_flush( skygw_log_write_flush(
LOGFILE_ERROR, LOGFILE_ERROR,
"%lu [poll_remove_dcb] epoll_ctl failed due %d, %s.", "Error : epoll_ctl failed due %d, %s.",
pthread_self(),
eno, eno,
strerror(eno)); strerror(eno));
} }
ss_dassert(rc == 0); ss_dassert(rc == 0); /**< trap in debug */
} }
/** /**
* This call was redundant, but the end result is correct. * This call was redundant, but the end result is correct.
@ -251,14 +249,12 @@ poll_waitevents(void *arg)
while (1) while (1)
{ {
#if BLOCKINGPOLL #if BLOCKINGPOLL
if ((nfds = epoll_wait(epoll_fd, events, MAX_EVENTS, -1)) == -1) nfds = epoll_wait(epoll_fd, events, MAX_EVENTS, -1);
{
}
#else #else
if (!no_op) { if (!no_op) {
skygw_log_write(LOGFILE_DEBUG, skygw_log_write(LOGFILE_DEBUG,
"%lu [poll_waitevents] MaxScale thread %d > " "%lu [poll_waitevents] MaxScale thread "
"epoll_wait <", "%d > epoll_wait <",
pthread_self(), pthread_self(),
thread_id); thread_id);
no_op = TRUE; no_op = TRUE;
@ -269,12 +265,13 @@ poll_waitevents(void *arg)
{ {
int eno = errno; int eno = errno;
errno = 0; errno = 0;
skygw_log_write(LOGFILE_DEBUG, skygw_log_write(
"%lu [poll_waitevents] epoll_wait returned " LOGFILE_DEBUG,
"%d, errno %d", "%lu [poll_waitevents] epoll_wait returned "
pthread_self(), "%d, errno %d",
nfds, pthread_self(),
eno); nfds,
eno);
no_op = FALSE; no_op = FALSE;
} }
else if (nfds == 0) else if (nfds == 0)
@ -370,17 +367,11 @@ poll_waitevents(void *arg)
} }
atomic_add(&pollStats.n_error, 1); atomic_add(&pollStats.n_error, 1);
dcb->func.error(dcb); dcb->func.error(dcb);
if (DCB_ISZOMBIE(dcb)) {
continue;
}
} }
if (ev & EPOLLHUP) if (ev & EPOLLHUP)
{ {
atomic_add(&pollStats.n_hup, 1); atomic_add(&pollStats.n_hup, 1);
dcb->func.hangup(dcb); dcb->func.hangup(dcb);
if (DCB_ISZOMBIE(dcb)) {
continue;
}
} }
if (ev & EPOLLOUT) if (ev & EPOLLOUT)
{ {
@ -413,7 +404,8 @@ poll_waitevents(void *arg)
"Accept in fd %d", "Accept in fd %d",
pthread_self(), pthread_self(),
dcb->fd); dcb->fd);
atomic_add(&pollStats.n_accept, 1); atomic_add(
&pollStats.n_accept, 1);
dcb->func.accept(dcb); dcb->func.accept(dcb);
} }
else else
@ -445,8 +437,8 @@ poll_waitevents(void *arg)
if (shutdown) if (shutdown)
{ {
/** /**
* Remove this thread from the bitmask of running * Remove the thread from the bitmask of running
* polling threads * polling threads.
*/ */
bitmask_clear(&poll_mask, thread_id); bitmask_clear(&poll_mask, thread_id);
return; return;

View File

@ -77,9 +77,8 @@ int len;
errno = 0; errno = 0;
skygw_log_write_flush( skygw_log_write_flush(
LOGFILE_ERROR, LOGFILE_ERROR,
"%lu [secrets_readKeys] access for secrets file [%s] " "Error : access for secrets file "
"failed. Error %i, %s\n", "[%s] failed. Error %d, %s.",
pthread_self(),
secret_file, secret_file,
eno, eno,
strerror(eno)); strerror(eno));
@ -93,9 +92,8 @@ int len;
errno = 0; errno = 0;
skygw_log_write_flush( skygw_log_write_flush(
LOGFILE_ERROR, LOGFILE_ERROR,
"%lu [secrets_readKeys] Failed opening secret file [%s]." "Error : Failed opening secret "
"Error %i, %s\n", "file [%s]. Error %d, %s.",
pthread_self(),
secret_file, secret_file,
eno, eno,
strerror(eno)); strerror(eno));
@ -109,9 +107,8 @@ int len;
errno = 0; errno = 0;
skygw_log_write_flush( skygw_log_write_flush(
LOGFILE_ERROR, LOGFILE_ERROR,
"%lu [secrets_readKeys] fstat for secret file %s failed." "Error : fstat for secret file %s "
"Error %i, %s\n", "failed. Error %d, %s.",
pthread_self(),
secret_file, secret_file,
eno, eno,
strerror(eno)); strerror(eno));
@ -124,9 +121,8 @@ int len;
errno = 0; errno = 0;
skygw_log_write_flush( skygw_log_write_flush(
LOGFILE_ERROR, LOGFILE_ERROR,
"%lu [secrets_readKeys] Secrets file %s has incorrect " "Error : Secrets file %s has "
"size. Error %i, %s\n", "incorrect size. Error %d, %s.",
pthread_self(),
secret_file, secret_file,
eno, eno,
strerror(eno)); strerror(eno));
@ -136,9 +132,8 @@ int len;
{ {
skygw_log_write_flush( skygw_log_write_flush(
LOGFILE_ERROR, LOGFILE_ERROR,
"%lu [secrets_readKeys] Ignoring secrets file %s, " "Error : Ignoring secrets file "
"invalid permissions.", "%s, invalid permissions.",
pthread_self(),
secret_file); secret_file);
return NULL; return NULL;
} }
@ -147,8 +142,8 @@ int len;
{ {
skygw_log_write_flush( skygw_log_write_flush(
LOGFILE_ERROR, LOGFILE_ERROR,
"%lu [secrets_readKeys] Memory allocation failed for " "Error : Memory allocation failed "
"keys structure."); "for key structure.");
return NULL; return NULL;
} }
@ -165,9 +160,8 @@ int len;
free(keys); free(keys);
skygw_log_write_flush( skygw_log_write_flush(
LOGFILE_ERROR, LOGFILE_ERROR,
"%lu [secrets_readKeys] Read from secrets file %s " "Error : Read from secrets file "
"failed. Read %d, expected %d bytes. Error %i, %s\n", "%s failed. Read %d, expected %d bytes. Error %d, %s.",
pthread_self(),
secret_file, secret_file,
len, len,
sizeof(MAXKEYS), sizeof(MAXKEYS),
@ -183,9 +177,8 @@ int len;
free(keys); free(keys);
skygw_log_write_flush( skygw_log_write_flush(
LOGFILE_ERROR, LOGFILE_ERROR,
"%lu [secrets_readKeys] Failed closing the secrets " "Error : Failed closing the "
"file %s. Error %i, %s\n", "secrets file %s. Error %d, %s.",
pthread_self(),
secret_file, secret_file,
eno, eno,
strerror(eno)); strerror(eno));
@ -212,12 +205,13 @@ MAXKEYS key;
/* Open for writing | Create | Truncate the file for writing */ /* Open for writing | Create | Truncate the file for writing */
if ((fd = open(secret_file, O_CREAT | O_WRONLY | O_TRUNC, S_IRUSR)) < 0) if ((fd = open(secret_file, O_CREAT | O_WRONLY | O_TRUNC, S_IRUSR)) < 0)
{ {
skygw_log_write(LOGFILE_ERROR, skygw_log_write_flush(
"secrets_createKeys, failed opening secret file " LOGFILE_ERROR,
"[%s]. Error %i, %s\n", "Error : failed opening secret "
secret_file, "file [%s]. Error %d, %s.",
errno, secret_file,
strerror(errno)); errno,
strerror(errno));
return 1; return 1;
} }
@ -228,24 +222,26 @@ MAXKEYS key;
/* Write data */ /* Write data */
if (write(fd, &key, sizeof(key)) < 0) if (write(fd, &key, sizeof(key)) < 0)
{ {
skygw_log_write(LOGFILE_ERROR, skygw_log_write_flush(
"secrets_createKeys, failed writing into secret " LOGFILE_ERROR,
"file [%s]. Error %i, %s\n", "Error : failed writing into "
secret_file, "secret file [%s]. Error %d, %s.",
errno, secret_file,
strerror(errno)); errno,
strerror(errno));
return 1; return 1;
} }
/* close file */ /* close file */
if (close(fd) < 0) if (close(fd) < 0)
{ {
skygw_log_write(LOGFILE_ERROR, skygw_log_write_flush(
"secrets_createKeys, failed closing the secret " LOGFILE_ERROR,
"file [%s]. Error %i, %s\n", "Error : failed closing the "
secret_file, "secret file [%s]. Error %d, %s.",
errno, secret_file,
strerror(errno)); errno,
strerror(errno));
} }
chmod(secret_file, S_IRUSR); chmod(secret_file, S_IRUSR);

View File

@ -309,27 +309,27 @@ server_update(SERVER *server, char *protocol, char *user, char *passwd)
{ {
if (!strcmp(server->protocol, protocol)) if (!strcmp(server->protocol, protocol))
{ {
skygw_log_write( skygw_log_write(
LOGFILE_MESSAGE, LOGFILE_MESSAGE,
"Update server protocol for server %s to protocol %s", "Update server protocol for server %s to protocol %s.",
server->name, server->name,
protocol); protocol);
free(server->protocol); free(server->protocol);
server->protocol = strdup(protocol); server->protocol = strdup(protocol);
} }
if (user != NULL && passwd != NULL) { if (user != NULL && passwd != NULL) {
if (strcmp(server->monuser, user) == 0 || if (strcmp(server->monuser, user) == 0 ||
strcmp(server->monpw, passwd) == 0) strcmp(server->monpw, passwd) == 0)
{ {
skygw_log_write( skygw_log_write(
LOGFILE_MESSAGE, LOGFILE_MESSAGE,
"Update server monitor credentials for server %s", "Update server monitor credentials for server %s",
server->name); server->name);
free(server->monuser); free(server->monuser);
free(server->monpw); free(server->monpw);
serverAddMonUser(server, user, passwd); serverAddMonUser(server, user, passwd);
} }
} }
} }

View File

@ -109,23 +109,24 @@ GWPROTOCOL *funcs;
return 0; return 0;
} }
if (strcmp(port->protocol, "MySQLClient") == 0) { if (strcmp(port->protocol, "MySQLClient") == 0) {
int loaded = -1; int loaded = load_mysql_users(service);
loaded = load_mysql_users(service);
skygw_log_write( skygw_log_write(
LOGFILE_MESSAGE, LOGFILE_MESSAGE,
"MySQL Users loaded: %i\n", "MySQL Users loaded: %i.",
loaded); loaded);
} }
if ((funcs = (GWPROTOCOL *)load_module(port->protocol, MODULE_PROTOCOL)) == NULL) if ((funcs =
(GWPROTOCOL *)load_module(port->protocol, MODULE_PROTOCOL)) == NULL)
{ {
free(port->listener); free(port->listener);
port->listener = NULL; port->listener = NULL;
skygw_log_write(LOGFILE_ERROR, skygw_log_write_flush(
"Unable to load protocol module %s. Listener for service %s not started.", LOGFILE_ERROR,
port->protocol, service->name); "Error : Unable to load protocol module %s. Listener for "
"service %s not started.",
port->protocol,
service->name);
return 0; return 0;
} }
memcpy(&(port->listener->func), funcs, sizeof(GWPROTOCOL)); memcpy(&(port->listener->func), funcs, sizeof(GWPROTOCOL));
@ -613,21 +614,33 @@ void *router_obj;
{ {
if ((router_obj = load_module(router, MODULE_ROUTER)) == NULL) if ((router_obj = load_module(router, MODULE_ROUTER)) == NULL)
{ {
skygw_log_write( LOGFILE_ERROR, "Failed to update router for service %s to %s", skygw_log_write_flush(
service->name, router); LOGFILE_ERROR,
"Error : Failed to update router "
"for service %s to %s.",
service->name,
router);
} }
else else
{ {
skygw_log_write( LOGFILE_MESSAGE, "Update router for service %s to %s", skygw_log_write(
service->name, router); LOGFILE_MESSAGE,
"Update router for service %s to %s.",
service->name,
router);
free(service->routerModule); free(service->routerModule);
service->routerModule = strdup(router); service->routerModule = strdup(router);
service->router = router_obj; service->router = router_obj;
} }
} }
if (user && (strcmp(service->credentials.name, user) != 0 || strcmp(service->credentials.authdata, auth) != 0)) if (user &&
(strcmp(service->credentials.name, user) != 0 ||
strcmp(service->credentials.authdata, auth) != 0))
{ {
skygw_log_write( LOGFILE_MESSAGE, "Update credentials for service %s", service->name); skygw_log_write(
LOGFILE_MESSAGE,
"Update credentials for service %s.",
service->name);
serviceSetUser(service, user, auth); serviceSetUser(service, user, auth);
} }
} }

View File

@ -71,9 +71,8 @@ session_alloc(SERVICE *service, DCB *client)
errno = 0; errno = 0;
skygw_log_write_flush( skygw_log_write_flush(
LOGFILE_ERROR, LOGFILE_ERROR,
"%lu [session_alloc] Failed to allocate memory for " "Error : Failed to allocate memory for "
"session object due error %d, %s.", "session object due error %d, %s.",
pthread_self(),
eno, eno,
strerror(eno)); strerror(eno));
goto return_session; goto return_session;
@ -119,21 +118,21 @@ session_alloc(SERVICE *service, DCB *client)
* and should be avoided for the listener session * and should be avoided for the listener session
* *
* Router session creation may create other DCBs that link to the * Router session creation may create other DCBs that link to the
* session, therefore it is important that the session lock is relinquished * session, therefore it is important that the session lock is
* beforethe router call. * relinquished beforethe router call.
*/ */
if (client->state != DCB_STATE_LISTENING) if (client->state != DCB_STATE_LISTENING)
{ {
session->router_session = session->router_session =
service->router->newSession(service->router_instance, session); service->router->newSession(service->router_instance,
session);
if (session->router_session == NULL) { if (session->router_session == NULL) {
client->session = NULL; client->session = NULL;
skygw_log_write_flush( skygw_log_write_flush(
LOGFILE_ERROR, LOGFILE_ERROR,
"%lu [session_alloc] Failed to create router " "Error : Failed to create router "
"client session. Freeing allocated resources.", "client session. Freeing allocated resources.");
pthread_self());
free(session); free(session);
session = NULL; session = NULL;
goto return_session; goto return_session;

View File

@ -61,15 +61,24 @@ int setnonblocking(int fd) {
int fl; int fl;
if ((fl = fcntl(fd, F_GETFL, 0)) == -1) { if ((fl = fcntl(fd, F_GETFL, 0)) == -1) {
skygw_log_write( LOGFILE_ERROR, "Can't GET fcntl for %i, errno = %d, %s", fd, errno, strerror(errno)); skygw_log_write_flush(
LOGFILE_ERROR,
"Error : Can't GET fcntl for %i, errno = %d, %s.",
fd,
errno,
strerror(errno));
return 1; return 1;
} }
if (fcntl(fd, F_SETFL, fl | O_NONBLOCK) == -1) { if (fcntl(fd, F_SETFL, fl | O_NONBLOCK) == -1) {
skygw_log_write( LOGFILE_ERROR, "Can't SET fcntl for %i, errno = %d, %s", fd, errno, strerror(errno)); skygw_log_write_flush(
LOGFILE_ERROR,
"Error : Can't SET fcntl for %i, errno = %d, %s",
fd,
errno,
strerror(errno));
return 1; return 1;
} }
return 0; return 0;
} }