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:
@ -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,61 +232,66 @@ 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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Scan passwd and copy all but matching lines to temp file.
|
* Scan passwd and copy all but matching lines to temp file.
|
||||||
*/
|
*/
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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,38 +773,39 @@ 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->fd);
|
dcb,
|
||||||
|
STRDCBSTATE(dcb->state),
|
||||||
|
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) */
|
||||||
|
|||||||
@ -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,53 +281,61 @@ 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();
|
||||||
}
|
}
|
||||||
|
|
||||||
signal_set(SIGHUP, sighup_handler);
|
signal_set(SIGHUP, sighup_handler);
|
||||||
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.
|
||||||
@ -479,7 +507,7 @@ fail_accept_errno = 0;
|
|||||||
LOGFILE_MESSAGE,
|
LOGFILE_MESSAGE,
|
||||||
"MaxScale shutdown, PID %i\n",
|
"MaxScale shutdown, PID %i\n",
|
||||||
getpid());
|
getpid());
|
||||||
|
|
||||||
datadir_cleanup();
|
datadir_cleanup();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -512,5 +540,5 @@ static void log_flush_cb(
|
|||||||
skygw_log_flush(LOGFILE_TRACE);
|
skygw_log_flush(LOGFILE_TRACE);
|
||||||
usleep(timeout_ms*1000);
|
usleep(timeout_ms*1000);
|
||||||
}
|
}
|
||||||
skygw_log_write(LOGFILE_MESSAGE, "Finished MaxScale log flusher.");
|
skygw_log_write(LOGFILE_MESSAGE, "Finished MaxScale log flusher.");
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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)
|
||||||
@ -342,7 +339,7 @@ poll_waitevents(void *arg)
|
|||||||
pthread_self(),
|
pthread_self(),
|
||||||
ev,
|
ev,
|
||||||
dcb);
|
dcb);
|
||||||
|
|
||||||
if (ev & EPOLLERR)
|
if (ev & EPOLLERR)
|
||||||
{
|
{
|
||||||
int eno = gw_getsockerrno(dcb->fd);
|
int eno = gw_getsockerrno(dcb->fd);
|
||||||
@ -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;
|
||||||
|
|||||||
@ -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);
|
||||||
|
|
||||||
|
|||||||
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user