When no users are loaded from backends, instead of counting it as a failure the service is started and the next time a client connects an attempt to load the users from the backends is made.
This commit is contained in:
Markus Makela
2015-01-05 17:38:45 +02:00
parent 9717190b4a
commit cd99849581
4 changed files with 15 additions and 89 deletions

View File

@ -215,12 +215,6 @@ GWPROTOCOL *funcs;
(port->address == NULL ? "0.0.0.0" : port->address), (port->address == NULL ? "0.0.0.0" : port->address),
port->port, port->port,
service->name))); service->name)));
hashtable_free(service->users->data);
free(service->users);
service->users = NULL;
dcb_free(port->listener);
port->listener = NULL;
goto retblock;
} }
/* At service start last update is set to USERS_REFRESH_TIME seconds earlier. /* At service start last update is set to USERS_REFRESH_TIME seconds earlier.
* This way MaxScale could try reloading users' just after startup * This way MaxScale could try reloading users' just after startup
@ -331,22 +325,16 @@ serviceStart(SERVICE *service)
{ {
SERV_PROTOCOL *port; SERV_PROTOCOL *port;
int listeners = 0; int listeners = 0;
if(service->router_instance == NULL)
{ if ((service->router_instance = service->router->createInstance(service,
/* service->routerOptions)) == NULL)
* This is the first time this service's router is being started or the {
* previous attempt failed. LOGIF(LE, (skygw_log_write_flush(LOGFILE_ERROR,
*/ "%s: Failed to create router instance for service. Service not started.",
if((service->router_instance = service->router->createInstance(service, service->name)));
service->routerOptions)) == NULL) service->state = SERVICE_STATE_FAILED;
{ return 0;
LOGIF(LE, (skygw_log_write_flush(LOGFILE_ERROR, }
"%s: Failed to create router instance for service. Service not started.",
service->name)));
service->state = SERVICE_STATE_FAILED;
return 0;
}
}
port = service->ports; port = service->ports;
while (!service->svc_do_shutdown && port) while (!service->svc_do_shutdown && port)
@ -359,10 +347,7 @@ int listeners = 0;
service->state = SERVICE_STATE_STARTED; service->state = SERVICE_STATE_STARTED;
service->stats.started = time(0); service->stats.started = time(0);
} }
else
{
service->state = SERVICE_STATE_LISTENER_FAILED;
}
return listeners; return listeners;
} }
@ -417,40 +402,6 @@ int n = 0,i;
return n; return n;
} }
/**
* Try to start services that failed to start their listeners but successfully
* started their routers.
* @return Number of successfully started services
*/
int
serviceStartFailedListeners()
{
SERVICE *ptr;
int n = 0,i;
spinlock_acquire(&service_spin);
ptr = allServices;
spinlock_release(&service_spin);
while (ptr && !ptr->svc_do_shutdown)
{
if(ptr->state == SERVICE_STATE_LISTENER_FAILED)
{
n += (i = serviceStart(ptr));
if(i == 0)
{
LOGIF(LE, (skygw_log_write(
LOGFILE_ERROR,
"Error : Failed to start service '%s'.",
ptr->name)));
}
}
ptr = ptr->next;
}
return n;
}
/** /**
* Stop a service * Stop a service
* *
@ -858,6 +809,7 @@ SERVICE *service;
return service; return service;
} }
/** /**
* Print details of an individual service * Print details of an individual service
* *

View File

@ -130,7 +130,6 @@ typedef struct server {
(SERVER_RUNNING|SERVER_MASTER|SERVER_SLAVE|SERVER_MAINT)) == \ (SERVER_RUNNING|SERVER_MASTER|SERVER_SLAVE|SERVER_MAINT)) == \
(SERVER_RUNNING|SERVER_MASTER)) (SERVER_RUNNING|SERVER_MASTER))
#define SRV_DOWN_STATUS(status) ((status & SERVER_RUNNING) == 0)
/** /**
* Is the server valid candidate for root master. The server must be running, * Is the server valid candidate for root master. The server must be running,
* marked as master and not have maintenance bit set. * marked as master and not have maintenance bit set.

View File

@ -152,8 +152,6 @@ typedef enum count_spec_t {COUNT_NONE=0, COUNT_ATLEAST, COUNT_EXACT, COUNT_ATMOS
#define SERVICE_STATE_STARTED 2 /**< The service has been started */ #define SERVICE_STATE_STARTED 2 /**< The service has been started */
#define SERVICE_STATE_FAILED 3 /**< The service failed to start */ #define SERVICE_STATE_FAILED 3 /**< The service failed to start */
#define SERVICE_STATE_STOPPED 4 /**< The service has been stopped */ #define SERVICE_STATE_STOPPED 4 /**< The service has been stopped */
#define SERVICE_STATE_LISTENER_FAILED 5 /**< The service successfully started the
router but failed to start the listeners*/
extern SERVICE *service_alloc(const char *, const char *); extern SERVICE *service_alloc(const char *, const char *);
extern int service_free(SERVICE *); extern int service_free(SERVICE *);
@ -167,7 +165,6 @@ extern void serviceAddRouterOption(SERVICE *, char *);
extern void serviceClearRouterOptions(SERVICE *); extern void serviceClearRouterOptions(SERVICE *);
extern int serviceStart(SERVICE *); extern int serviceStart(SERVICE *);
extern int serviceStartAll(); extern int serviceStartAll();
extern int serviceStartFailedListeners();
extern void serviceStartProtocol(SERVICE *, char *, int); extern void serviceStartProtocol(SERVICE *, char *, int);
extern int serviceStop(SERVICE *); extern int serviceStop(SERVICE *);
extern int serviceRestart(SERVICE *); extern int serviceRestart(SERVICE *);

View File

@ -64,8 +64,6 @@
#include <dcb.h> #include <dcb.h>
#include <modinfo.h> #include <modinfo.h>
#include "service.h"
/** Defined in log_manager.cc */ /** Defined in log_manager.cc */
extern int lm_enabled_logfiles_bitmask; extern int lm_enabled_logfiles_bitmask;
extern size_t log_ses_count[]; extern size_t log_ses_count[];
@ -612,7 +610,7 @@ int num_servers=0;
MONITOR_SERVERS *root_master = NULL; MONITOR_SERVERS *root_master = NULL;
size_t nrounds = 0; size_t nrounds = 0;
int log_no_master = 1; int log_no_master = 1;
int new_backends = 0;
if (mysql_thread_init()) if (mysql_thread_init())
{ {
LOGIF(LE, (skygw_log_write_flush( LOGIF(LE, (skygw_log_write_flush(
@ -651,9 +649,6 @@ int new_backends = 0;
/* reset num_servers */ /* reset num_servers */
num_servers = 0; num_servers = 0;
/* reset new_backends */
new_backends = 0;
/* start from the first server in the list */ /* start from the first server in the list */
ptr = handle->databases; ptr = handle->databases;
@ -697,12 +692,6 @@ int new_backends = 0;
{ {
dcb_call_foreach(DCB_REASON_NOT_RESPONDING); dcb_call_foreach(DCB_REASON_NOT_RESPONDING);
} }
if(SRV_DOWN_STATUS(ptr->mon_prev_status) &&
SERVER_IS_RUNNING(ptr->server))
{
new_backends++;
}
} }
if (mon_status_changed(ptr)) if (mon_status_changed(ptr))
@ -738,17 +727,6 @@ int new_backends = 0;
ptr = ptr->next; ptr = ptr->next;
} }
/**
* Some new servers are now running. Try to start services
* that failed to start their listeners but successfully created
* their router instances.
*/
if(new_backends > 0)
{
serviceStartFailedListeners();
}
ptr = handle->databases; ptr = handle->databases;
/* if only one server is configured, that's is Master */ /* if only one server is configured, that's is Master */
if (num_servers == 1) { if (num_servers == 1) {