Merge branch 'release-1.0beta-refresh' of github.com:skysql/MaxScale into release-1.0beta-refresh
This commit is contained in:
@ -454,7 +454,7 @@ static skygw_query_type_t resolve_query_type(
|
|||||||
|
|
||||||
/** SELECT ..INTO variable|OUTFILE|DUMPFILE */
|
/** SELECT ..INTO variable|OUTFILE|DUMPFILE */
|
||||||
if (lex->result != NULL) {
|
if (lex->result != NULL) {
|
||||||
type = QUERY_TYPE_SESSION_WRITE;
|
type = QUERY_TYPE_GSYSVAR_WRITE;
|
||||||
goto return_qtype;
|
goto return_qtype;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -543,7 +543,7 @@ static skygw_query_type_t resolve_query_type(
|
|||||||
else if (lex->sql_command == SQLCOM_SET_OPTION)
|
else if (lex->sql_command == SQLCOM_SET_OPTION)
|
||||||
{
|
{
|
||||||
/** Either user- or system variable write */
|
/** Either user- or system variable write */
|
||||||
type |= QUERY_TYPE_SESSION_WRITE;
|
type |= QUERY_TYPE_GSYSVAR_WRITE;
|
||||||
}
|
}
|
||||||
goto return_qtype;
|
goto return_qtype;
|
||||||
}
|
}
|
||||||
@ -759,7 +759,12 @@ static skygw_query_type_t resolve_query_type(
|
|||||||
break;
|
break;
|
||||||
/** User-defined variable modification */
|
/** User-defined variable modification */
|
||||||
case Item_func::SUSERVAR_FUNC:
|
case Item_func::SUSERVAR_FUNC:
|
||||||
func_qtype |= QUERY_TYPE_SESSION_WRITE;
|
/**
|
||||||
|
* Really it is user variable but we
|
||||||
|
* don't separate sql variables atm.
|
||||||
|
* 15.9.14
|
||||||
|
*/
|
||||||
|
func_qtype |= QUERY_TYPE_GSYSVAR_WRITE;
|
||||||
LOGIF(LD, (skygw_log_write(
|
LOGIF(LD, (skygw_log_write(
|
||||||
LOGFILE_DEBUG,
|
LOGFILE_DEBUG,
|
||||||
"%lu [resolve_query_type] "
|
"%lu [resolve_query_type] "
|
||||||
|
@ -123,6 +123,14 @@ typedef struct server {
|
|||||||
*/
|
*/
|
||||||
#define SERVER_IS_MASTER(server) \
|
#define SERVER_IS_MASTER(server) \
|
||||||
(((server)->status & (SERVER_RUNNING|SERVER_MASTER|SERVER_SLAVE|SERVER_MAINT)) == (SERVER_RUNNING|SERVER_MASTER))
|
(((server)->status & (SERVER_RUNNING|SERVER_MASTER|SERVER_SLAVE|SERVER_MAINT)) == (SERVER_RUNNING|SERVER_MASTER))
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Is the server valid candidate for root master. The server must be running,
|
||||||
|
* marked as master and not have maintenance bit set.
|
||||||
|
*/
|
||||||
|
#define SERVER_IS_ROOT_MASTER(server) \
|
||||||
|
(((server)->status & (SERVER_RUNNING|SERVER_MASTER|SERVER_MAINT)) == (SERVER_RUNNING|SERVER_MASTER))
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Is the server a slave? The server must be both running and marked as a slave
|
* Is the server a slave? The server must be both running and marked as a slave
|
||||||
* in order for the macro to return true
|
* in order for the macro to return true
|
||||||
|
@ -268,6 +268,8 @@ static bool handle_error_new_connection(
|
|||||||
GWBUF* errmsg);
|
GWBUF* errmsg);
|
||||||
static bool handle_error_reply_client(SESSION* ses, GWBUF* errmsg);
|
static bool handle_error_reply_client(SESSION* ses, GWBUF* errmsg);
|
||||||
|
|
||||||
|
static backend_ref_t* get_root_master_bref(ROUTER_CLIENT_SES* rses);
|
||||||
|
|
||||||
static BACKEND* get_root_master(
|
static BACKEND* get_root_master(
|
||||||
backend_ref_t* servers,
|
backend_ref_t* servers,
|
||||||
int router_nservers);
|
int router_nservers);
|
||||||
@ -613,13 +615,18 @@ createInstance(SERVICE *service, char **options)
|
|||||||
for (n = 0; router->servers[n]; n++)
|
for (n = 0; router->servers[n]; n++)
|
||||||
{
|
{
|
||||||
int perc;
|
int perc;
|
||||||
|
int wght;
|
||||||
backend = router->servers[n];
|
backend = router->servers[n];
|
||||||
perc = (atoi(serverGetParameter(
|
wght = atoi(serverGetParameter(backend->backend_server,
|
||||||
backend->backend_server,
|
weightby));
|
||||||
weightby)) * 1000) / total;
|
perc = (wght*1000) / total;
|
||||||
if (perc == 0)
|
|
||||||
|
if (perc == 0 && wght != 0)
|
||||||
|
{
|
||||||
perc = 1;
|
perc = 1;
|
||||||
|
}
|
||||||
backend->weight = perc;
|
backend->weight = perc;
|
||||||
|
|
||||||
if (perc == 0)
|
if (perc == 0)
|
||||||
{
|
{
|
||||||
LOGIF(LE, (skygw_log_write(
|
LOGIF(LE, (skygw_log_write(
|
||||||
@ -628,10 +635,9 @@ createInstance(SERVICE *service, char **options)
|
|||||||
"for weighting parameter '%s', "
|
"for weighting parameter '%s', "
|
||||||
"no queries will be routed to "
|
"no queries will be routed to "
|
||||||
"this server.\n",
|
"this server.\n",
|
||||||
server->unique_name,
|
router->servers[n]->backend_server->unique_name,
|
||||||
weightby)));
|
weightby)));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1040,6 +1046,7 @@ static bool get_dcb(
|
|||||||
int max_rlag)
|
int max_rlag)
|
||||||
{
|
{
|
||||||
backend_ref_t* backend_ref;
|
backend_ref_t* backend_ref;
|
||||||
|
backend_ref_t* master_bref;
|
||||||
int smallest_nconn = -1;
|
int smallest_nconn = -1;
|
||||||
int i;
|
int i;
|
||||||
bool succp = false;
|
bool succp = false;
|
||||||
@ -1055,8 +1062,12 @@ static bool get_dcb(
|
|||||||
backend_ref = rses->rses_backend_ref;
|
backend_ref = rses->rses_backend_ref;
|
||||||
|
|
||||||
/** get root master from available servers */
|
/** get root master from available servers */
|
||||||
master_host = get_root_master(backend_ref, rses->rses_nbackends);
|
master_bref = get_root_master_bref(rses);
|
||||||
|
#if defined(SS_DEBUG)
|
||||||
|
|
||||||
|
master_host = get_root_master(backend_ref, rses->rses_nbackends);
|
||||||
|
ss_dassert(master_bref->bref_backend == master_host);
|
||||||
|
#endif
|
||||||
if (name != NULL) /*< Choose backend by name from a hint */
|
if (name != NULL) /*< Choose backend by name from a hint */
|
||||||
{
|
{
|
||||||
ss_dassert(btype != BE_MASTER); /*< Master dominates and no name should be passed with it */
|
ss_dassert(btype != BE_MASTER); /*< Master dominates and no name should be passed with it */
|
||||||
@ -1064,7 +1075,6 @@ static bool get_dcb(
|
|||||||
for (i=0; i<rses->rses_nbackends; i++)
|
for (i=0; i<rses->rses_nbackends; i++)
|
||||||
{
|
{
|
||||||
BACKEND* b = backend_ref[i].bref_backend;
|
BACKEND* b = backend_ref[i].bref_backend;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* To become chosen:
|
* To become chosen:
|
||||||
* backend must be in use, name must match,
|
* backend must be in use, name must match,
|
||||||
@ -1077,7 +1087,7 @@ static bool get_dcb(
|
|||||||
name,
|
name,
|
||||||
b->backend_server->unique_name,
|
b->backend_server->unique_name,
|
||||||
PATH_MAX) == 0) &&
|
PATH_MAX) == 0) &&
|
||||||
master_host != NULL &&
|
master_bref->bref_backend != NULL &&
|
||||||
(SERVER_IS_SLAVE(b->backend_server) ||
|
(SERVER_IS_SLAVE(b->backend_server) ||
|
||||||
SERVER_IS_RELAY_SERVER(b->backend_server) ||
|
SERVER_IS_RELAY_SERVER(b->backend_server) ||
|
||||||
SERVER_IS_MASTER(b->backend_server)))
|
SERVER_IS_MASTER(b->backend_server)))
|
||||||
@ -1109,8 +1119,8 @@ static bool get_dcb(
|
|||||||
* at the moment.
|
* at the moment.
|
||||||
*/
|
*/
|
||||||
if (BREF_IS_IN_USE((&backend_ref[i])) &&
|
if (BREF_IS_IN_USE((&backend_ref[i])) &&
|
||||||
master_host != NULL &&
|
master_bref->bref_backend != NULL &&
|
||||||
b->backend_server != master_host->backend_server &&
|
b->backend_server != master_bref->bref_backend->backend_server &&
|
||||||
(max_rlag == MAX_RLAG_UNDEFINED ||
|
(max_rlag == MAX_RLAG_UNDEFINED ||
|
||||||
(b->backend_server->rlag != MAX_RLAG_NOT_AVAILABLE &&
|
(b->backend_server->rlag != MAX_RLAG_NOT_AVAILABLE &&
|
||||||
b->backend_server->rlag <= max_rlag)) &&
|
b->backend_server->rlag <= max_rlag)) &&
|
||||||
@ -1128,32 +1138,46 @@ static bool get_dcb(
|
|||||||
|
|
||||||
if (!succp) /*< No valid slave was found, search master next */
|
if (!succp) /*< No valid slave was found, search master next */
|
||||||
{
|
{
|
||||||
btype = BE_MASTER;
|
|
||||||
|
|
||||||
if (BREF_IS_IN_USE(backend_ref))
|
|
||||||
{
|
|
||||||
*p_dcb = backend_ref->bref_dcb;
|
|
||||||
succp = true;
|
|
||||||
|
|
||||||
ss_dassert(backend_ref->bref_dcb->state != DCB_STATE_ZOMBIE);
|
|
||||||
|
|
||||||
ss_dassert(
|
|
||||||
(master_host && (backend_ref->bref_backend->backend_server == master_host->backend_server)) &&
|
|
||||||
smallest_nconn == -1);
|
|
||||||
|
|
||||||
if (rses->router->available_slaves)
|
if (rses->router->available_slaves)
|
||||||
{
|
{
|
||||||
rses->router->available_slaves = false;
|
rses->router->available_slaves = false;
|
||||||
LOGIF(LE, (skygw_log_write_flush(
|
LOGIF(LE, (skygw_log_write_flush(
|
||||||
LOGFILE_ERROR,
|
LOGFILE_ERROR,
|
||||||
"Warning : No slaves available "
|
"Warning : No slaves available "
|
||||||
"for the service %s. "
|
"for the service %s.",
|
||||||
"Using master %s:%d "
|
rses->router->service->name)));
|
||||||
"instead.",
|
|
||||||
rses->router->service->name,
|
|
||||||
backend_ref->bref_backend->backend_server->name,
|
|
||||||
backend_ref->bref_backend->backend_server->port)));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
btype = BE_MASTER;
|
||||||
|
|
||||||
|
|
||||||
|
if (BREF_IS_IN_USE(master_bref))
|
||||||
|
{
|
||||||
|
*p_dcb = master_bref->bref_dcb;
|
||||||
|
succp = true;
|
||||||
|
|
||||||
|
ss_dassert(master_bref->bref_dcb->state != DCB_STATE_ZOMBIE);
|
||||||
|
|
||||||
|
ss_dassert(
|
||||||
|
(master_bref->bref_backend &&
|
||||||
|
(master_bref->bref_backend->backend_server ==
|
||||||
|
master_bref->bref_backend->backend_server)) &&
|
||||||
|
smallest_nconn == -1);
|
||||||
|
|
||||||
|
LOGIF(LE, (skygw_log_write_flush(
|
||||||
|
LOGFILE_ERROR,
|
||||||
|
"Using master %s:%d instead.",
|
||||||
|
master_bref->bref_backend->backend_server->name,
|
||||||
|
master_bref->bref_backend->backend_server->port)));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LOGIF(LE, (skygw_log_write_flush(
|
||||||
|
LOGFILE_ERROR,
|
||||||
|
"Error : No master is availabe either. "
|
||||||
|
"Unable to find backend server for "
|
||||||
|
"routing.")));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (rses->router->available_slaves == false)
|
else if (rses->router->available_slaves == false)
|
||||||
@ -1161,7 +1185,7 @@ static bool get_dcb(
|
|||||||
rses->router->available_slaves = true;
|
rses->router->available_slaves = true;
|
||||||
LOGIF(LE, (skygw_log_write_flush(
|
LOGIF(LE, (skygw_log_write_flush(
|
||||||
LOGFILE_ERROR,
|
LOGFILE_ERROR,
|
||||||
"At least one slave has become avilable for "
|
"At least one slave has become available for "
|
||||||
"the service %s.",
|
"the service %s.",
|
||||||
rses->router->service->name)));
|
rses->router->service->name)));
|
||||||
}
|
}
|
||||||
@ -1175,7 +1199,9 @@ static bool get_dcb(
|
|||||||
BACKEND* b = backend_ref[i].bref_backend;
|
BACKEND* b = backend_ref[i].bref_backend;
|
||||||
|
|
||||||
if (BREF_IS_IN_USE((&backend_ref[i])) &&
|
if (BREF_IS_IN_USE((&backend_ref[i])) &&
|
||||||
(master_host && (b->backend_server == master_host->backend_server)))
|
(master_bref->bref_backend &&
|
||||||
|
(b->backend_server ==
|
||||||
|
master_bref->bref_backend->backend_server)))
|
||||||
{
|
{
|
||||||
*p_dcb = backend_ref[i].bref_dcb;
|
*p_dcb = backend_ref[i].bref_dcb;
|
||||||
succp = true;
|
succp = true;
|
||||||
@ -1209,13 +1235,15 @@ static route_target_t get_route_target (
|
|||||||
/**
|
/**
|
||||||
* These queries are not affected by hints
|
* These queries are not affected by hints
|
||||||
*/
|
*/
|
||||||
if (!trx_active &&
|
if (QUERY_IS_TYPE(qtype, QUERY_TYPE_SESSION_WRITE) ||
|
||||||
(QUERY_IS_TYPE(qtype, QUERY_TYPE_PREPARE_STMT) ||
|
QUERY_IS_TYPE(qtype, QUERY_TYPE_PREPARE_STMT) ||
|
||||||
QUERY_IS_TYPE(qtype, QUERY_TYPE_PREPARE_NAMED_STMT) ||
|
QUERY_IS_TYPE(qtype, QUERY_TYPE_PREPARE_NAMED_STMT) ||
|
||||||
/** Configured to allow writing variables to all nodes */
|
/** Configured to allow writing variables to all nodes */
|
||||||
(use_sql_variables_in == TYPE_ALL &&
|
(use_sql_variables_in == TYPE_ALL &&
|
||||||
(QUERY_IS_TYPE(qtype, QUERY_TYPE_SESSION_WRITE) ||
|
QUERY_IS_TYPE(qtype, QUERY_TYPE_GSYSVAR_WRITE)) ||
|
||||||
QUERY_IS_TYPE(qtype, QUERY_TYPE_GSYSVAR_WRITE)))))
|
/** enable or disable autocommit are always routed to all */
|
||||||
|
QUERY_IS_TYPE(qtype, QUERY_TYPE_ENABLE_AUTOCOMMIT) ||
|
||||||
|
QUERY_IS_TYPE(qtype, QUERY_TYPE_DISABLE_AUTOCOMMIT))
|
||||||
{
|
{
|
||||||
/** hints don't affect on routing */
|
/** hints don't affect on routing */
|
||||||
target = TARGET_ALL;
|
target = TARGET_ALL;
|
||||||
@ -1678,8 +1706,6 @@ static int routeQuery(
|
|||||||
}
|
}
|
||||||
goto retblock;
|
goto retblock;
|
||||||
}
|
}
|
||||||
inst->stats.n_queries++;
|
|
||||||
|
|
||||||
master_dcb = router_cli_ses->rses_master_ref->bref_dcb;
|
master_dcb = router_cli_ses->rses_master_ref->bref_dcb;
|
||||||
CHK_DCB(master_dcb);
|
CHK_DCB(master_dcb);
|
||||||
|
|
||||||
@ -1808,6 +1834,7 @@ static int routeQuery(
|
|||||||
|
|
||||||
if (succp)
|
if (succp)
|
||||||
{
|
{
|
||||||
|
atomic_add(&inst->stats.n_all, 1);
|
||||||
ret = 1;
|
ret = 1;
|
||||||
}
|
}
|
||||||
goto retblock;
|
goto retblock;
|
||||||
@ -1904,6 +1931,10 @@ static int routeQuery(
|
|||||||
BE_SLAVE,
|
BE_SLAVE,
|
||||||
NULL,
|
NULL,
|
||||||
rlag_max);
|
rlag_max);
|
||||||
|
if (succp)
|
||||||
|
{
|
||||||
|
atomic_add(&inst->stats.n_slave, 1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!succp && TARGET_IS_MASTER(route_target))
|
if (!succp && TARGET_IS_MASTER(route_target))
|
||||||
@ -1920,6 +1951,7 @@ static int routeQuery(
|
|||||||
{
|
{
|
||||||
succp = true;
|
succp = true;
|
||||||
}
|
}
|
||||||
|
atomic_add(&inst->stats.n_master, 1);
|
||||||
target_dcb = master_dcb;
|
target_dcb = master_dcb;
|
||||||
}
|
}
|
||||||
ss_dassert(succp);
|
ss_dassert(succp);
|
||||||
@ -1931,7 +1963,7 @@ static int routeQuery(
|
|||||||
{
|
{
|
||||||
backend_ref_t* bref;
|
backend_ref_t* bref;
|
||||||
|
|
||||||
atomic_add(&inst->stats.n_slave, 1);
|
atomic_add(&inst->stats.n_queries, 1);
|
||||||
/**
|
/**
|
||||||
* Add one query response waiter to backend reference
|
* Add one query response waiter to backend reference
|
||||||
*/
|
*/
|
||||||
@ -2446,7 +2478,10 @@ static bool select_connect_backend_servers(
|
|||||||
master_found = true;
|
master_found = true;
|
||||||
master_connected = true;
|
master_connected = true;
|
||||||
/* assert with master_host */
|
/* assert with master_host */
|
||||||
ss_dassert(master_host && ((*p_master_ref)->bref_backend->backend_server == master_host->backend_server) && SERVER_MASTER);
|
ss_dassert(master_host &&
|
||||||
|
((*p_master_ref)->bref_backend->backend_server ==
|
||||||
|
master_host->backend_server) &&
|
||||||
|
SERVER_MASTER);
|
||||||
}
|
}
|
||||||
/** New session or master failure case */
|
/** New session or master failure case */
|
||||||
else
|
else
|
||||||
@ -2568,11 +2603,17 @@ static bool select_connect_backend_servers(
|
|||||||
* servers from the sorted list. First master found is selected.
|
* servers from the sorted list. First master found is selected.
|
||||||
*/
|
*/
|
||||||
for (i=0;
|
for (i=0;
|
||||||
i<router_nservers && (slaves_connected < max_nslaves || !master_connected);
|
i<router_nservers &&
|
||||||
|
(slaves_connected < max_nslaves || !master_connected);
|
||||||
i++)
|
i++)
|
||||||
{
|
{
|
||||||
BACKEND* b = backend_ref[i].bref_backend;
|
BACKEND* b = backend_ref[i].bref_backend;
|
||||||
|
|
||||||
|
if (router->servers[i]->weight == 0)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if (SERVER_IS_RUNNING(b->backend_server) &&
|
if (SERVER_IS_RUNNING(b->backend_server) &&
|
||||||
((b->backend_server->status & router->bitmask) ==
|
((b->backend_server->status & router->bitmask) ==
|
||||||
router->bitvalue))
|
router->bitvalue))
|
||||||
@ -3678,8 +3719,6 @@ static bool route_session_write(
|
|||||||
/** Unlock router session */
|
/** Unlock router session */
|
||||||
rses_end_locked_router_action(router_cli_ses);
|
rses_end_locked_router_action(router_cli_ses);
|
||||||
|
|
||||||
atomic_add(&inst->stats.n_all, 1);
|
|
||||||
|
|
||||||
return_succp:
|
return_succp:
|
||||||
return succp;
|
return succp;
|
||||||
}
|
}
|
||||||
@ -4288,22 +4327,86 @@ static bool prep_stmt_drop(
|
|||||||
* @return The Master found
|
* @return The Master found
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
static BACKEND *get_root_master(backend_ref_t *servers, int router_nservers) {
|
static BACKEND *get_root_master(
|
||||||
|
backend_ref_t *servers,
|
||||||
|
int router_nservers)
|
||||||
|
{
|
||||||
int i = 0;
|
int i = 0;
|
||||||
BACKEND * master_host = NULL;
|
BACKEND * master_host = NULL;
|
||||||
|
|
||||||
for (i = 0; i< router_nservers; i++) {
|
for (i = 0; i< router_nservers; i++)
|
||||||
BACKEND* b = NULL;
|
{
|
||||||
b = servers[i].bref_backend;
|
BACKEND* b;
|
||||||
if (b && (b->backend_server->status & (SERVER_MASTER|SERVER_MAINT)) == SERVER_MASTER) {
|
|
||||||
if (master_host && b->backend_server->depth < master_host->backend_server->depth) {
|
if (servers[i].bref_backend == NULL)
|
||||||
master_host = b;
|
{
|
||||||
} else {
|
continue;
|
||||||
if (master_host == NULL) {
|
|
||||||
master_host = b;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
b = servers[i].bref_backend;
|
||||||
|
|
||||||
|
if ((b->backend_server->status &
|
||||||
|
(SERVER_MASTER|SERVER_MAINT)) == SERVER_MASTER)
|
||||||
|
{
|
||||||
|
if (master_host == NULL ||
|
||||||
|
(b->backend_server->depth < master_host->backend_server->depth))
|
||||||
|
{
|
||||||
|
master_host = b;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return master_host;
|
return master_host;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/********************************
|
||||||
|
* This routine returns the root master server from MySQL replication tree
|
||||||
|
* Get the root Master rule:
|
||||||
|
*
|
||||||
|
* find server with the lowest replication depth level
|
||||||
|
* and the SERVER_MASTER bitval
|
||||||
|
* Servers are checked even if they are in 'maintenance'
|
||||||
|
*
|
||||||
|
* @param rses pointer to router session
|
||||||
|
* @return pointer to backend reference of the root master
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
static backend_ref_t* get_root_master_bref(
|
||||||
|
ROUTER_CLIENT_SES* rses)
|
||||||
|
{
|
||||||
|
backend_ref_t* bref;
|
||||||
|
backend_ref_t* candidate_bref = NULL;
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
bref = rses->rses_backend_ref;
|
||||||
|
|
||||||
|
while (i<rses->rses_nbackends)
|
||||||
|
{
|
||||||
|
if ((bref->bref_backend->backend_server->status &
|
||||||
|
(SERVER_MASTER|SERVER_MAINT)) == SERVER_MASTER)
|
||||||
|
{
|
||||||
|
if (bref->bref_backend->backend_server->status & SERVER_MASTER)
|
||||||
|
{
|
||||||
|
if (candidate_bref == NULL ||
|
||||||
|
(bref->bref_backend->backend_server->depth <
|
||||||
|
candidate_bref->bref_backend->backend_server->depth))
|
||||||
|
{
|
||||||
|
candidate_bref = bref;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
bref++;
|
||||||
|
i += 1;
|
||||||
|
}
|
||||||
|
return candidate_bref;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user