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:
Markus Makela
2015-01-02 20:28:26 +02:00
parent ef19b9e729
commit 95cd0b93cb
8 changed files with 68 additions and 48 deletions

View File

@ -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)));
} }
} }

View File

@ -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",

View File

@ -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 */

View File

@ -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++;
} }

View File

@ -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;
} }

View File

@ -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.",

View File

@ -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++;

View File

@ -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;