Fix for bug 447 - Error log flooded with same warnings if there are no slaves present

This commit is contained in:
Mark Riddoch
2014-09-11 11:03:53 +01:00
parent 344fcfa9ea
commit 27e0ccd641
2 changed files with 32 additions and 6 deletions

View File

@ -71,6 +71,7 @@ typedef enum backend_type_t {
BE_COUNT BE_COUNT
} backend_type_t; } backend_type_t;
struct router_instance;
typedef struct rses_property_st rses_property_t; typedef struct rses_property_st rses_property_t;
typedef struct router_client_session ROUTER_CLIENT_SES; typedef struct router_client_session ROUTER_CLIENT_SES;
@ -261,6 +262,7 @@ struct router_client_session {
#if defined(PREP_STMT_CACHING) #if defined(PREP_STMT_CACHING)
HASHTABLE* rses_prep_stmt[2]; HASHTABLE* rses_prep_stmt[2];
#endif #endif
struct router_instance *router; /*< The router instance */
struct router_client_session* next; struct router_client_session* next;
#if defined(SS_DEBUG) #if defined(SS_DEBUG)
skygw_chk_t rses_chk_tail; skygw_chk_t rses_chk_tail;
@ -294,6 +296,8 @@ typedef struct router_instance {
unsigned int bitvalue; /*< Required value of server->status */ unsigned int bitvalue; /*< Required value of server->status */
ROUTER_STATS stats; /*< Statistics for this router */ ROUTER_STATS stats; /*< Statistics for this router */
struct router_instance* next; /*< Next router on the list */ struct router_instance* next; /*< Next router on the list */
bool available_slaves;
/*< The router has some slaves avialable */
} ROUTER_INSTANCE; } ROUTER_INSTANCE;
#define BACKEND_TYPE(b) (SERVER_IS_MASTER((b)->backend_server) ? BE_MASTER : \ #define BACKEND_TYPE(b) (SERVER_IS_MASTER((b)->backend_server) ? BE_MASTER : \

View File

@ -484,6 +484,11 @@ createInstance(SERVICE *service, char **options)
} }
router->servers[nservers] = NULL; router->servers[nservers] = NULL;
/*
* Until we know otherwise assume we have some available slaves.
*/
router->available_slaves = true;
/* /*
* If server weighting has been defined calculate the percentage * If server weighting has been defined calculate the percentage
* of load that will be sent to each server. This is only used for * of load that will be sent to each server. This is only used for
@ -636,6 +641,8 @@ static void* newSession(
client_rses->rses_chk_top = CHK_NUM_ROUTER_SES; client_rses->rses_chk_top = CHK_NUM_ROUTER_SES;
client_rses->rses_chk_tail = CHK_NUM_ROUTER_SES; client_rses->rses_chk_tail = CHK_NUM_ROUTER_SES;
#endif #endif
client_rses->router = router;
/** /**
* If service config has been changed, reload config from service to * If service config has been changed, reload config from service to
* router instance first. * router instance first.
@ -972,15 +979,30 @@ static bool get_dcb(
(master_host && (backend_ref->bref_backend->backend_server == master_host->backend_server)) && (master_host && (backend_ref->bref_backend->backend_server == master_host->backend_server)) &&
smallest_nconn == -1); smallest_nconn == -1);
LOGIF(LE, (skygw_log_write_flush( if (rses->router->available_slaves)
LOGFILE_ERROR, {
"Warning : No slaves connected nor " rses->router->available_slaves = false;
"available. Choosing master %s:%d " LOGIF(LE, (skygw_log_write_flush(
"instead.", LOGFILE_ERROR,
"Warning : No slaves avialable "
"for the service %s. "
"Using master %s:%d "
"instead.",
rses->router->service->name,
backend_ref->bref_backend->backend_server->name, backend_ref->bref_backend->backend_server->name,
backend_ref->bref_backend->backend_server->port))); backend_ref->bref_backend->backend_server->port)));
}
} }
} }
else if (rses->router->available_slaves == false)
{
rses->router->available_slaves = true;
LOGIF(LE, (skygw_log_write_flush(
LOGFILE_ERROR,
"At least one slave has become avilable for "
"the service %s.",
rses->router->service->name)));
}
ss_dassert(succp); ss_dassert(succp);
} }
else if (btype == BE_MASTER) else if (btype == BE_MASTER)