Fix to bug 679: http://bugs.mariadb.com/show_bug.cgi?id=679
Added server references to services instead of using a raw pointers to server instances. Changed all references to service->database to service->dbref.
This commit is contained in:
@ -451,7 +451,7 @@ getUsers(SERVICE *service, USERS *users)
|
|||||||
char *service_passwd = NULL;
|
char *service_passwd = NULL;
|
||||||
char *dpwd;
|
char *dpwd;
|
||||||
int total_users = 0;
|
int total_users = 0;
|
||||||
SERVER *server;
|
SERVER_REF *server;
|
||||||
char *users_query;
|
char *users_query;
|
||||||
unsigned char hash[SHA_DIGEST_LENGTH]="";
|
unsigned char hash[SHA_DIGEST_LENGTH]="";
|
||||||
char *users_data = NULL;
|
char *users_data = NULL;
|
||||||
@ -505,12 +505,12 @@ getUsers(SERVICE *service, USERS *users)
|
|||||||
* out of databases
|
* out of databases
|
||||||
* to try
|
* to try
|
||||||
*/
|
*/
|
||||||
server = service->databases;
|
server = service->dbref;
|
||||||
dpwd = decryptPassword(service_passwd);
|
dpwd = decryptPassword(service_passwd);
|
||||||
|
|
||||||
/* Select a server with Master bit, if available */
|
/* Select a server with Master bit, if available */
|
||||||
while (server != NULL && !(server->status & SERVER_MASTER)) {
|
while (server != NULL && !(server->server->status & SERVER_MASTER)) {
|
||||||
server = server->nextdb;
|
server = server->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (service->svc_do_shutdown)
|
if (service->svc_do_shutdown)
|
||||||
@ -523,35 +523,35 @@ getUsers(SERVICE *service, USERS *users)
|
|||||||
/* Try loading data from master server */
|
/* Try loading data from master server */
|
||||||
if (server != NULL &&
|
if (server != NULL &&
|
||||||
(mysql_real_connect(con,
|
(mysql_real_connect(con,
|
||||||
server->name, service_user,
|
server->server->name, service_user,
|
||||||
dpwd,
|
dpwd,
|
||||||
NULL,
|
NULL,
|
||||||
server->port,
|
server->server->port,
|
||||||
NULL, 0) != NULL))
|
NULL, 0) != NULL))
|
||||||
{
|
{
|
||||||
LOGIF(LD, (skygw_log_write_flush(
|
LOGIF(LD, (skygw_log_write_flush(
|
||||||
LOGFILE_DEBUG,
|
LOGFILE_DEBUG,
|
||||||
"Dbusers : Loading data from backend database with "
|
"Dbusers : Loading data from backend database with "
|
||||||
"Master role [%s:%i] for service [%s]",
|
"Master role [%s:%i] for service [%s]",
|
||||||
server->name,
|
server->server->name,
|
||||||
server->port,
|
server->server->port,
|
||||||
service->name)));
|
service->name)));
|
||||||
} else {
|
} else {
|
||||||
/* load data from other servers via loop */
|
/* load data from other servers via loop */
|
||||||
server = service->databases;
|
server = service->dbref;
|
||||||
|
|
||||||
while (!service->svc_do_shutdown &&
|
while (!service->svc_do_shutdown &&
|
||||||
server != NULL &&
|
server != NULL &&
|
||||||
(mysql_real_connect(con,
|
(mysql_real_connect(con,
|
||||||
server->name,
|
server->server->name,
|
||||||
service_user,
|
service_user,
|
||||||
dpwd,
|
dpwd,
|
||||||
NULL,
|
NULL,
|
||||||
server->port,
|
server->server->port,
|
||||||
NULL,
|
NULL,
|
||||||
0) == NULL))
|
0) == NULL))
|
||||||
{
|
{
|
||||||
server = server->nextdb;
|
server = server->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (service->svc_do_shutdown)
|
if (service->svc_do_shutdown)
|
||||||
@ -566,8 +566,8 @@ getUsers(SERVICE *service, USERS *users)
|
|||||||
LOGFILE_DEBUG,
|
LOGFILE_DEBUG,
|
||||||
"Dbusers : Loading data from backend database "
|
"Dbusers : Loading data from backend database "
|
||||||
"[%s:%i] for service [%s]",
|
"[%s:%i] for service [%s]",
|
||||||
server->name,
|
server->server->name,
|
||||||
server->port,
|
server->server->port,
|
||||||
service->name)));
|
service->name)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -474,7 +474,7 @@ int
|
|||||||
service_free(SERVICE *service)
|
service_free(SERVICE *service)
|
||||||
{
|
{
|
||||||
SERVICE *ptr;
|
SERVICE *ptr;
|
||||||
|
SERVER_REF *srv;
|
||||||
if (service->stats.n_current)
|
if (service->stats.n_current)
|
||||||
return 0;
|
return 0;
|
||||||
/* First of all remove from the linked list */
|
/* First of all remove from the linked list */
|
||||||
@ -496,6 +496,13 @@ SERVICE *ptr;
|
|||||||
spinlock_release(&service_spin);
|
spinlock_release(&service_spin);
|
||||||
|
|
||||||
/* Clean up session and free the memory */
|
/* Clean up session and free the memory */
|
||||||
|
|
||||||
|
while(service->dbref){
|
||||||
|
srv = service->dbref;
|
||||||
|
service->dbref = service->dbref->next;
|
||||||
|
free(srv);
|
||||||
|
}
|
||||||
|
|
||||||
free(service->name);
|
free(service->name);
|
||||||
free(service->routerModule);
|
free(service->routerModule);
|
||||||
if (service->credentials.name)
|
if (service->credentials.name)
|
||||||
@ -574,8 +581,13 @@ void
|
|||||||
serviceAddBackend(SERVICE *service, SERVER *server)
|
serviceAddBackend(SERVICE *service, SERVER *server)
|
||||||
{
|
{
|
||||||
spinlock_acquire(&service->spin);
|
spinlock_acquire(&service->spin);
|
||||||
server->nextdb = service->databases;
|
SERVER_REF *sref;
|
||||||
service->databases = server;
|
if((sref = calloc(1,sizeof(SERVER_REF))) != NULL)
|
||||||
|
{
|
||||||
|
sref->next = service->dbref;
|
||||||
|
sref->server = server;
|
||||||
|
service->dbref = sref;
|
||||||
|
}
|
||||||
spinlock_release(&service->spin);
|
spinlock_release(&service->spin);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -589,12 +601,12 @@ serviceAddBackend(SERVICE *service, SERVER *server)
|
|||||||
int
|
int
|
||||||
serviceHasBackend(SERVICE *service, SERVER *server)
|
serviceHasBackend(SERVICE *service, SERVER *server)
|
||||||
{
|
{
|
||||||
SERVER *ptr;
|
SERVER_REF *ptr;
|
||||||
|
|
||||||
spinlock_acquire(&service->spin);
|
spinlock_acquire(&service->spin);
|
||||||
ptr = service->databases;
|
ptr = service->dbref;
|
||||||
while (ptr && ptr != server)
|
while (ptr && ptr->server != server)
|
||||||
ptr = ptr->nextdb;
|
ptr = ptr->next;
|
||||||
spinlock_release(&service->spin);
|
spinlock_release(&service->spin);
|
||||||
|
|
||||||
return ptr != NULL;
|
return ptr != NULL;
|
||||||
@ -812,7 +824,7 @@ SERVICE *service;
|
|||||||
void
|
void
|
||||||
printService(SERVICE *service)
|
printService(SERVICE *service)
|
||||||
{
|
{
|
||||||
SERVER *ptr = service->databases;
|
SERVER_REF *ptr = service->dbref;
|
||||||
struct tm result;
|
struct tm result;
|
||||||
char time_buf[30];
|
char time_buf[30];
|
||||||
int i;
|
int i;
|
||||||
@ -825,8 +837,8 @@ int i;
|
|||||||
printf("\tBackend databases\n");
|
printf("\tBackend databases\n");
|
||||||
while (ptr)
|
while (ptr)
|
||||||
{
|
{
|
||||||
printf("\t\t%s:%d Protocol: %s\n", ptr->name, ptr->port, ptr->protocol);
|
printf("\t\t%s:%d Protocol: %s\n", ptr->server->name, ptr->server->port, ptr->server->protocol);
|
||||||
ptr = ptr->nextdb;
|
ptr = ptr->next;
|
||||||
}
|
}
|
||||||
if (service->n_filters)
|
if (service->n_filters)
|
||||||
{
|
{
|
||||||
@ -893,7 +905,7 @@ SERVICE *ptr;
|
|||||||
*/
|
*/
|
||||||
void dprintService(DCB *dcb, SERVICE *service)
|
void dprintService(DCB *dcb, SERVICE *service)
|
||||||
{
|
{
|
||||||
SERVER *server = service->databases;
|
SERVER_REF *server = service->dbref;
|
||||||
struct tm result;
|
struct tm result;
|
||||||
char timebuf[30];
|
char timebuf[30];
|
||||||
int i;
|
int i;
|
||||||
@ -937,9 +949,9 @@ int i;
|
|||||||
dcb_printf(dcb, "\tBackend databases\n");
|
dcb_printf(dcb, "\tBackend databases\n");
|
||||||
while (server)
|
while (server)
|
||||||
{
|
{
|
||||||
dcb_printf(dcb, "\t\t%s:%d Protocol: %s\n", server->name, server->port,
|
dcb_printf(dcb, "\t\t%s:%d Protocol: %s\n", server->server->name, server->server->port,
|
||||||
server->protocol);
|
server->server->protocol);
|
||||||
server = server->nextdb;
|
server = server->next;
|
||||||
}
|
}
|
||||||
if (service->weightby)
|
if (service->weightby)
|
||||||
dcb_printf(dcb, "\tRouting weight parameter: %s\n",
|
dcb_printf(dcb, "\tRouting weight parameter: %s\n",
|
||||||
|
@ -99,6 +99,11 @@ typedef struct {
|
|||||||
time_t last;
|
time_t last;
|
||||||
} SERVICE_REFRESH_RATE;
|
} SERVICE_REFRESH_RATE;
|
||||||
|
|
||||||
|
typedef struct server_ref_t{
|
||||||
|
struct server_ref_t *next;
|
||||||
|
SERVER* server;
|
||||||
|
}SERVER_REF;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Defines a service within the gateway.
|
* Defines a service within the gateway.
|
||||||
*
|
*
|
||||||
@ -119,7 +124,7 @@ typedef struct service {
|
|||||||
void *router_instance;
|
void *router_instance;
|
||||||
/**< The router instance for this service */
|
/**< The router instance for this service */
|
||||||
char *version_string;/** version string for this service listeners */
|
char *version_string;/** version string for this service listeners */
|
||||||
struct server *databases; /**< The set of servers in the backend */
|
SERVER_REF *dbref; /** server references */
|
||||||
SERVICE_USER credentials; /**< The cedentials of the service user */
|
SERVICE_USER credentials; /**< The cedentials of the service user */
|
||||||
SPINLOCK spin; /**< The service spinlock */
|
SPINLOCK spin; /**< The service spinlock */
|
||||||
SERVICE_STATS stats; /**< The service statistics */
|
SERVICE_STATS stats; /**< The service statistics */
|
||||||
|
@ -144,7 +144,7 @@ static ROUTER *
|
|||||||
GHACreateInstance(SERVICE *service, char **options)
|
GHACreateInstance(SERVICE *service, char **options)
|
||||||
{
|
{
|
||||||
ROUTER_INSTANCE *inst;
|
ROUTER_INSTANCE *inst;
|
||||||
SERVER *server;
|
SERVER_REF *server;
|
||||||
int i, n;
|
int i, n;
|
||||||
|
|
||||||
if ((inst = calloc(1, sizeof(ROUTER_INSTANCE))) == NULL) {
|
if ((inst = calloc(1, sizeof(ROUTER_INSTANCE))) == NULL) {
|
||||||
@ -159,7 +159,7 @@ int i, n;
|
|||||||
* that we can maintain a count of the number of connections to each
|
* that we can maintain a count of the number of connections to each
|
||||||
* backend server.
|
* backend server.
|
||||||
*/
|
*/
|
||||||
for (server = service->databases, n = 0; server; server = server->nextdb)
|
for (server = service->dbref, n = 0; server; server = server->next)
|
||||||
n++;
|
n++;
|
||||||
|
|
||||||
inst->servers = (BACKEND **)calloc(n + 1, sizeof(BACKEND *));
|
inst->servers = (BACKEND **)calloc(n + 1, sizeof(BACKEND *));
|
||||||
@ -169,7 +169,7 @@ int i, n;
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (server = service->databases, n = 0; server; server = server->nextdb)
|
for (server = service->dbref, n = 0; server; server = server->next)
|
||||||
{
|
{
|
||||||
if ((inst->servers[n] = malloc(sizeof(BACKEND))) == NULL)
|
if ((inst->servers[n] = malloc(sizeof(BACKEND))) == NULL)
|
||||||
{
|
{
|
||||||
@ -179,7 +179,7 @@ int i, n;
|
|||||||
free(inst);
|
free(inst);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
inst->servers[n]->server = server;
|
inst->servers[n]->server = server->server;
|
||||||
inst->servers[n]->current_connection_count = 0;
|
inst->servers[n]->current_connection_count = 0;
|
||||||
n++;
|
n++;
|
||||||
}
|
}
|
||||||
|
@ -201,7 +201,7 @@ int i;
|
|||||||
* which of these servers is currently the master and replicate from
|
* which of these servers is currently the master and replicate from
|
||||||
* that server.
|
* that server.
|
||||||
*/
|
*/
|
||||||
if (service->databases == NULL || service->databases->nextdb != NULL)
|
if (service->dbref == NULL || service->dbref->next != NULL)
|
||||||
{
|
{
|
||||||
LOGIF(LE, (skygw_log_write(
|
LOGIF(LE, (skygw_log_write(
|
||||||
LOGFILE_ERROR,
|
LOGFILE_ERROR,
|
||||||
@ -543,7 +543,7 @@ ROUTER_SLAVE *slave = (ROUTER_SLAVE *)router_session;
|
|||||||
LOGIF(LE, (skygw_log_write_flush(
|
LOGIF(LE, (skygw_log_write_flush(
|
||||||
LOGFILE_ERROR,
|
LOGFILE_ERROR,
|
||||||
"Binlog router close session with master server %s",
|
"Binlog router close session with master server %s",
|
||||||
router->service->databases->unique_name)));
|
router->service->dbref->server->unique_name)));
|
||||||
blr_master_reconnect(router);
|
blr_master_reconnect(router);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -121,7 +121,7 @@ GWBUF *buf;
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
client->session = router->session;
|
client->session = router->session;
|
||||||
if ((router->master = dcb_connect(router->service->databases, router->session, BLR_PROTOCOL)) == NULL)
|
if ((router->master = dcb_connect(router->service->dbref->server, router->session, BLR_PROTOCOL)) == NULL)
|
||||||
{
|
{
|
||||||
char *name;
|
char *name;
|
||||||
if ((name = malloc(strlen(router->service->name)
|
if ((name = malloc(strlen(router->service->name)
|
||||||
@ -135,10 +135,10 @@ GWBUF *buf;
|
|||||||
router->retry_backoff = BLR_MAX_BACKOFF;
|
router->retry_backoff = BLR_MAX_BACKOFF;
|
||||||
LOGIF(LE, (skygw_log_write_flush(LOGFILE_ERROR,
|
LOGIF(LE, (skygw_log_write_flush(LOGFILE_ERROR,
|
||||||
"Binlog router: failed to connect to master server '%s'",
|
"Binlog router: failed to connect to master server '%s'",
|
||||||
router->service->databases->unique_name)));
|
router->service->dbref->server->unique_name)));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
router->master->remote = strdup(router->service->databases->name);
|
router->master->remote = strdup(router->service->dbref->server->name);
|
||||||
LOGIF(LM,(skygw_log_write(
|
LOGIF(LM,(skygw_log_write(
|
||||||
LOGFILE_MESSAGE,
|
LOGFILE_MESSAGE,
|
||||||
"%s: atempting to connect to master server %s.",
|
"%s: atempting to connect to master server %s.",
|
||||||
|
@ -204,6 +204,7 @@ createInstance(SERVICE *service, char **options)
|
|||||||
{
|
{
|
||||||
ROUTER_INSTANCE *inst;
|
ROUTER_INSTANCE *inst;
|
||||||
SERVER *server;
|
SERVER *server;
|
||||||
|
SERVER_REF *sref;
|
||||||
int i, n;
|
int i, n;
|
||||||
BACKEND *backend;
|
BACKEND *backend;
|
||||||
char *weightby;
|
char *weightby;
|
||||||
@ -220,7 +221,7 @@ char *weightby;
|
|||||||
* that we can maintain a count of the number of connections to each
|
* that we can maintain a count of the number of connections to each
|
||||||
* backend server.
|
* backend server.
|
||||||
*/
|
*/
|
||||||
for (server = service->databases, n = 0; server; server = server->nextdb)
|
for (sref = service->dbref, n = 0; sref; sref = sref->next)
|
||||||
n++;
|
n++;
|
||||||
|
|
||||||
inst->servers = (BACKEND **)calloc(n + 1, sizeof(BACKEND *));
|
inst->servers = (BACKEND **)calloc(n + 1, sizeof(BACKEND *));
|
||||||
@ -230,7 +231,7 @@ char *weightby;
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (server = service->databases, n = 0; server; server = server->nextdb)
|
for (sref = service->dbref, n = 0; sref; sref = sref->next)
|
||||||
{
|
{
|
||||||
if ((inst->servers[n] = malloc(sizeof(BACKEND))) == NULL)
|
if ((inst->servers[n] = malloc(sizeof(BACKEND))) == NULL)
|
||||||
{
|
{
|
||||||
@ -240,7 +241,7 @@ char *weightby;
|
|||||||
free(inst);
|
free(inst);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
inst->servers[n]->server = server;
|
inst->servers[n]->server = sref->server;
|
||||||
inst->servers[n]->current_connection_count = 0;
|
inst->servers[n]->current_connection_count = 0;
|
||||||
inst->servers[n]->weight = 1000;
|
inst->servers[n]->weight = 1000;
|
||||||
n++;
|
n++;
|
||||||
|
@ -558,6 +558,7 @@ createInstance(SERVICE *service, char **options)
|
|||||||
{
|
{
|
||||||
ROUTER_INSTANCE* router;
|
ROUTER_INSTANCE* router;
|
||||||
SERVER* server;
|
SERVER* server;
|
||||||
|
SERVER_REF* sref;
|
||||||
int nservers;
|
int nservers;
|
||||||
int i;
|
int i;
|
||||||
CONFIG_PARAMETER* param;
|
CONFIG_PARAMETER* param;
|
||||||
@ -570,13 +571,13 @@ createInstance(SERVICE *service, char **options)
|
|||||||
spinlock_init(&router->lock);
|
spinlock_init(&router->lock);
|
||||||
|
|
||||||
/** Calculate number of servers */
|
/** Calculate number of servers */
|
||||||
server = service->databases;
|
sref = service->dbref;
|
||||||
nservers = 0;
|
nservers = 0;
|
||||||
|
|
||||||
while (server != NULL)
|
while (sref != NULL)
|
||||||
{
|
{
|
||||||
nservers++;
|
nservers++;
|
||||||
server=server->nextdb;
|
sref=sref->next;
|
||||||
}
|
}
|
||||||
router->servers = (BACKEND **)calloc(nservers + 1, sizeof(BACKEND *));
|
router->servers = (BACKEND **)calloc(nservers + 1, sizeof(BACKEND *));
|
||||||
|
|
||||||
@ -590,10 +591,11 @@ createInstance(SERVICE *service, char **options)
|
|||||||
* maintain a count of the number of connections to each
|
* maintain a count of the number of connections to each
|
||||||
* backend server.
|
* backend server.
|
||||||
*/
|
*/
|
||||||
server = service->databases;
|
|
||||||
|
sref = service->dbref;
|
||||||
nservers= 0;
|
nservers= 0;
|
||||||
|
|
||||||
while (server != NULL) {
|
while (sref != NULL) {
|
||||||
if ((router->servers[nservers] = malloc(sizeof(BACKEND))) == NULL)
|
if ((router->servers[nservers] = malloc(sizeof(BACKEND))) == NULL)
|
||||||
{
|
{
|
||||||
/** clean up */
|
/** clean up */
|
||||||
@ -604,7 +606,7 @@ createInstance(SERVICE *service, char **options)
|
|||||||
free(router);
|
free(router);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
router->servers[nservers]->backend_server = server;
|
router->servers[nservers]->backend_server = sref->server;
|
||||||
router->servers[nservers]->backend_conn_count = 0;
|
router->servers[nservers]->backend_conn_count = 0;
|
||||||
router->servers[nservers]->be_valid = false;
|
router->servers[nservers]->be_valid = false;
|
||||||
router->servers[nservers]->weight = 1000;
|
router->servers[nservers]->weight = 1000;
|
||||||
@ -613,7 +615,7 @@ createInstance(SERVICE *service, char **options)
|
|||||||
router->servers[nservers]->be_chk_tail = CHK_NUM_BACKEND;
|
router->servers[nservers]->be_chk_tail = CHK_NUM_BACKEND;
|
||||||
#endif
|
#endif
|
||||||
nservers += 1;
|
nservers += 1;
|
||||||
server = server->nextdb;
|
sref = sref->next;
|
||||||
}
|
}
|
||||||
router->servers[nservers] = NULL;
|
router->servers[nservers] = NULL;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user