diff --git a/server/core/service.c b/server/core/service.c index 4ef101085..116db12ae 100644 --- a/server/core/service.c +++ b/server/core/service.c @@ -349,8 +349,15 @@ serviceStart(SERVICE *service) SERV_PROTOCOL *port; int listeners = 0; - service->router_instance = service->router->createInstance(service, - service->routerOptions); + if ((service->router_instance = service->router->createInstance(service, + service->routerOptions)) == NULL) + { + 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 NULL; + } port = service->ports; while (port) @@ -359,7 +366,10 @@ int listeners = 0; port = port->next; } if (listeners) + { + service->state = SERVICE_STATE_STARTED; service->stats.started = time(0); + } return listeners; } @@ -429,6 +439,7 @@ int listeners = 0; port = port->next; } + service->state = SERVICE_STATE_STOPPED; return listeners; } @@ -900,7 +911,22 @@ int i; service->name); dcb_printf(dcb, "\tRouter: %s (%p)\n", service->routerModule, service->router); - if (service->router) + switch (service->state) + { + case SERVICE_STATE_STARTED: + dcb_printf(dcb, "\tState: Started\n"); + break; + case SERVICE_STATE_STOPPED: + dcb_printf(dcb, "\tState: Stopped\n"); + break; + case SERVICE_STATE_FAILED: + dcb_printf(dcb, "\tState: Failed\n"); + break; + case SERVICE_STATE_ALLOC: + dcb_printf(dcb, "\tState: Allocated\n"); + break; + } + if (service->router && service->router_instance) service->router->diagnostics(service->router_instance, dcb); dcb_printf(dcb, "\tStarted: %s", asctime_r(localtime_r(&service->stats.started, &result), timebuf)); diff --git a/server/include/service.h b/server/include/service.h index f68cb0774..33109e742 100644 --- a/server/include/service.h +++ b/server/include/service.h @@ -144,6 +144,8 @@ typedef enum count_spec_t {COUNT_NONE=0, COUNT_ATLEAST, COUNT_EXACT, COUNT_ATMOS #define SERVICE_STATE_ALLOC 1 /**< The service has been allocated */ #define SERVICE_STATE_STARTED 2 /**< The service has been started */ +#define SERVICE_STATE_FAILED 3 /**< The service failed to start */ +#define SERVICE_STATE_STOPPED 4 /**< The service has been stopped */ extern SERVICE *service_alloc(const char *, const char *); extern int service_free(SERVICE *);