From b1065603178587424fe9072f6b26f665e8c09e6f Mon Sep 17 00:00:00 2001 From: VilhoRaatikka Date: Wed, 3 Dec 2014 13:27:31 +0200 Subject: [PATCH] Fix to bug # 634, http://bugs.skysql.com/show_bug.cgi?id=634 COM_SHOW_SLAVE_STAT wasn't classified but it was treated as 'unknown' and thus routed to master. --- query_classifier/query_classifier.cc | 1 + .../routing/readwritesplit/readwritesplit.c | 54 ++++++++++--------- 2 files changed, 29 insertions(+), 26 deletions(-) diff --git a/query_classifier/query_classifier.cc b/query_classifier/query_classifier.cc index 109269252..4d484310a 100644 --- a/query_classifier/query_classifier.cc +++ b/query_classifier/query_classifier.cc @@ -619,6 +619,7 @@ static skygw_query_type_t resolve_query_type( break; case SQLCOM_SELECT: + case SQLCOM_SHOW_SLAVE_STAT: type |= QUERY_TYPE_READ; break; diff --git a/server/modules/routing/readwritesplit/readwritesplit.c b/server/modules/routing/readwritesplit/readwritesplit.c index c21ecf26b..b303022af 100644 --- a/server/modules/routing/readwritesplit/readwritesplit.c +++ b/server/modules/routing/readwritesplit/readwritesplit.c @@ -1212,25 +1212,27 @@ static bool get_dcb( * backend and update assign it to new candidate if * necessary. */ - else if (SERVER_IS_SLAVE(b->backend_server) && - (max_rlag == MAX_RLAG_UNDEFINED || + else if (SERVER_IS_SLAVE(b->backend_server)) + { + if (max_rlag == MAX_RLAG_UNDEFINED || (b->backend_server->rlag != MAX_RLAG_NOT_AVAILABLE && - b->backend_server->rlag <= max_rlag))) - { - candidate_bref = check_candidate_bref( - candidate_bref, - &backend_ref[i], - rses->rses_config.rw_slave_select_criteria); - } - else - { - LOGIF(LT, (skygw_log_write( - LOGFILE_TRACE, - "Server %s:%d is too much behind the " - "master, %d s. and can't be chosen.", - b->backend_server->name, - b->backend_server->port, - b->backend_server->rlag))); + b->backend_server->rlag <= max_rlag)) + { + candidate_bref = check_candidate_bref( + candidate_bref, + &backend_ref[i], + rses->rses_config.rw_slave_select_criteria); + } + else + { + LOGIF(LT, (skygw_log_write( + LOGFILE_TRACE, + "Server %s:%d is too much behind the " + "master, %d s. and can't be chosen.", + b->backend_server->name, + b->backend_server->port, + b->backend_server->rlag))); + } } } /*< for */ /** Assign selected DCB's pointer value */ @@ -1474,7 +1476,7 @@ static route_target_t get_route_target ( QUERY_IS_TYPE(qtype, QUERY_TYPE_UNKNOWN))); target = TARGET_MASTER; } -#if defined(SS_DEBUG) +#if defined(SS_EXTRA_DEBUG) LOGIF(LT, (skygw_log_write( LOGFILE_TRACE, "Selected target \"%s\"", @@ -2132,14 +2134,14 @@ static int routeQuery( rlag_max); if (succp) { -#if defined(SS_DEBUG) +#if defined(SS_EXTRA_DEBUG) LOGIF(LT, (skygw_log_write(LOGFILE_TRACE, "Found DCB for slave."))); +#endif ss_dassert(get_bref_from_dcb(router_cli_ses, target_dcb) != router_cli_ses->rses_master_ref); ss_dassert(get_root_master_bref(router_cli_ses) == router_cli_ses->rses_master_ref); -#endif atomic_add(&inst->stats.n_slave, 1); } else @@ -2204,7 +2206,7 @@ static int routeQuery( LOGIF(LT, (skygw_log_write( LOGFILE_TRACE, - "Route query to %s\t%s:%d <", + "Route query to %s \t%s:%d <", (SERVER_IS_MASTER(bref->bref_backend->backend_server) ? "master" : "slave"), bref->bref_backend->backend_server->name, @@ -3948,12 +3950,12 @@ static bool route_session_write( { LOGIF(LT, (skygw_log_write( LOGFILE_TRACE, - "Route query to %s\t%s:%d%s", + "Route query to %s \t%s:%d%s", (SERVER_IS_MASTER(backend_ref[i].bref_backend->backend_server) ? "master" : "slave"), backend_ref[i].bref_backend->backend_server->name, backend_ref[i].bref_backend->backend_server->port, - (i+1==router_cli_ses->rses_nbackends ? " <" : "")))); + (i+1==router_cli_ses->rses_nbackends ? " <" : " ")))); } if (BREF_IS_IN_USE((&backend_ref[i]))) @@ -4003,12 +4005,12 @@ static bool route_session_write( { LOGIF(LT, (skygw_log_write( LOGFILE_TRACE, - "Route query to %s\t%s:%d%s", + "Route query to %s \t%s:%d%s", (SERVER_IS_MASTER(backend_ref[i].bref_backend->backend_server) ? "master" : "slave"), backend_ref[i].bref_backend->backend_server->name, backend_ref[i].bref_backend->backend_server->port, - (i+1==router_cli_ses->rses_nbackends ? " <" : "")))); + (i+1==router_cli_ses->rses_nbackends ? " <" : " ")))); } scur = backend_ref_get_sescmd_cursor(&backend_ref[i]);