From 27e0ccd6415d572382bea2fef500265b9ce73cdd Mon Sep 17 00:00:00 2001 From: Mark Riddoch Date: Thu, 11 Sep 2014 11:03:53 +0100 Subject: [PATCH] Fix for bug 447 - Error log flooded with same warnings if there are no slaves present --- server/modules/include/readwritesplit.h | 4 +++ .../routing/readwritesplit/readwritesplit.c | 34 +++++++++++++++---- 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/server/modules/include/readwritesplit.h b/server/modules/include/readwritesplit.h index 6fc639005..15d190ddb 100644 --- a/server/modules/include/readwritesplit.h +++ b/server/modules/include/readwritesplit.h @@ -71,6 +71,7 @@ typedef enum backend_type_t { BE_COUNT } backend_type_t; +struct router_instance; typedef struct rses_property_st rses_property_t; typedef struct router_client_session ROUTER_CLIENT_SES; @@ -261,6 +262,7 @@ struct router_client_session { #if defined(PREP_STMT_CACHING) HASHTABLE* rses_prep_stmt[2]; #endif + struct router_instance *router; /*< The router instance */ struct router_client_session* next; #if defined(SS_DEBUG) skygw_chk_t rses_chk_tail; @@ -294,6 +296,8 @@ typedef struct router_instance { unsigned int bitvalue; /*< Required value of server->status */ ROUTER_STATS stats; /*< Statistics for this router */ struct router_instance* next; /*< Next router on the list */ + bool available_slaves; + /*< The router has some slaves avialable */ } ROUTER_INSTANCE; #define BACKEND_TYPE(b) (SERVER_IS_MASTER((b)->backend_server) ? BE_MASTER : \ diff --git a/server/modules/routing/readwritesplit/readwritesplit.c b/server/modules/routing/readwritesplit/readwritesplit.c index 1c22d4979..79c26c0f6 100644 --- a/server/modules/routing/readwritesplit/readwritesplit.c +++ b/server/modules/routing/readwritesplit/readwritesplit.c @@ -484,6 +484,11 @@ createInstance(SERVICE *service, char **options) } 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 * 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_tail = CHK_NUM_ROUTER_SES; #endif + + client_rses->router = router; /** * If service config has been changed, reload config from service to * router instance first. @@ -972,15 +979,30 @@ static bool get_dcb( (master_host && (backend_ref->bref_backend->backend_server == master_host->backend_server)) && smallest_nconn == -1); - LOGIF(LE, (skygw_log_write_flush( - LOGFILE_ERROR, - "Warning : No slaves connected nor " - "available. Choosing master %s:%d " - "instead.", + if (rses->router->available_slaves) + { + rses->router->available_slaves = false; + LOGIF(LE, (skygw_log_write_flush( + 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->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); } else if (btype == BE_MASTER)