Added more diagnostic output.

This commit is contained in:
Markus Makela 2015-03-06 17:06:09 +02:00
parent 0d8eca98db
commit 8cfd368e6b

View File

@ -21,7 +21,6 @@
#include <string.h>
#include <stdlib.h>
#include <stdint.h>
#include <router.h>
#include <schemarouter.h>
#include <secrets.h>
@ -187,10 +186,6 @@ static bool route_session_write(
unsigned char packet_type,
skygw_query_type_t qtype);
static void refreshInstance(
ROUTER_INSTANCE* router,
CONFIG_PARAMETER* param);
static void bref_clear_state(backend_ref_t* bref, bref_state_t state);
static void bref_set_state(backend_ref_t* bref, bref_state_t state);
static sescmd_cursor_t* backend_ref_get_sescmd_cursor (backend_ref_t* bref);
@ -542,6 +537,12 @@ bool check_shard_status(ROUTER_INSTANCE* router, char* shard)
return rval;
}
/**
* Turn a string into an array of strings. The last element in the list is a NULL
* pointer.
* @param str String to tokenize
* @return Pointer to an array of strings.
*/
char** tokenize_string(char* str)
{
char *tok;
@ -579,6 +580,11 @@ char** tokenize_string(char* str)
return list;
}
/**
* A fake DCB read function used to forward queued queries.
* @param dcb Internal DCB used by the router session
* @return Always 1
*/
int internalRoute(DCB* dcb)
{
if(dcb->dcb_readqueue)
@ -593,6 +599,11 @@ int internalRoute(DCB* dcb)
return 1;
}
/**
* A fake DCB read function used to forward replies to the client.
* @param dcb Internal DCB used by the router session
* @return Always 1
*/
int internalReply(DCB* dcb)
{
if(dcb->dcb_readqueue)
@ -624,7 +635,7 @@ ModuleInit()
{
LOGIF(LM, (skygw_log_write_flush(
LOGFILE_MESSAGE,
"Initializing Database Sharding router module.")));
"Initializing Schema Sharding Router.")));
spinlock_init(&instlock);
instances = NULL;
}
@ -642,49 +653,6 @@ ROUTER_OBJECT* GetModuleObject()
return &MyObject;
}
static void refreshInstance(
ROUTER_INSTANCE* router,
CONFIG_PARAMETER* singleparam)
{
CONFIG_PARAMETER* param;
bool refresh_single;
config_param_type_t paramtype;
if (singleparam != NULL)
{
param = singleparam;
refresh_single = true;
}
else
{
param = router->service->svc_config_param;
refresh_single = false;
}
paramtype = config_get_paramtype(param);
while (param != NULL)
{
/** Catch unused parameter types */
ss_dassert(paramtype == COUNT_TYPE ||
paramtype == PERCENT_TYPE ||
paramtype == SQLVAR_TARGET_TYPE ||
paramtype == STRING_TYPE);
if (paramtype == COUNT_TYPE)
{
}
else if (paramtype == PERCENT_TYPE)
{
}
if (refresh_single)
{
break;
}
param = param->next;
}
}
/**
* Create an instance of schemarouter router within the MaxScale.
*
@ -767,26 +735,12 @@ createInstance(SERVICE *service, char **options)
router->bitmask = 0;
router->bitvalue = 0;
conf = config_get_param(service->svc_config_param,"ignore_databases");
if(conf)
{
refreshInstance(router, conf);
}
/**
* Read config version number from service to inform what configuration
* is used if any.
*/
router->schemarouter_version = service->svc_config_version;
/** refreshInstance(router, NULL); */
/**
* Get hashtable which includes dbname,backend pairs
*/
/**
* We have completed the creation of the router data, so now
* insert this router into the linked list of routers
@ -1291,50 +1245,50 @@ static route_target_t get_shard_route_target (
* @param type The type of the query resolved so far
*/
void check_drop_tmp_table(
ROUTER* instance,
void* router_session,
GWBUF* querybuf,
skygw_query_type_t type)
ROUTER* instance,
void* router_session,
GWBUF* querybuf,
skygw_query_type_t type)
{
int tsize = 0, klen = 0,i;
char** tbl = NULL;
char *hkey,*dbname;
int tsize = 0, klen = 0,i;
char** tbl = NULL;
char *hkey,*dbname;
ROUTER_CLIENT_SES* router_cli_ses = (ROUTER_CLIENT_SES *)router_session;
rses_property_t* rses_prop_tmp;
ROUTER_CLIENT_SES* router_cli_ses = (ROUTER_CLIENT_SES *)router_session;
rses_property_t* rses_prop_tmp;
rses_prop_tmp = router_cli_ses->rses_properties[RSES_PROP_TYPE_TMPTABLES];
dbname = router_cli_ses->rses_mysql_session->db;
rses_prop_tmp = router_cli_ses->rses_properties[RSES_PROP_TYPE_TMPTABLES];
dbname = router_cli_ses->rses_mysql_session->db;
if (is_drop_table_query(querybuf))
if (is_drop_table_query(querybuf))
{
tbl = skygw_get_table_names(querybuf,&tsize,false);
if(tbl != NULL){
for(i = 0; i<tsize; i++)
{
klen = strlen(dbname) + strlen(tbl[i]) + 2;
hkey = calloc(klen,sizeof(char));
strcpy(hkey,dbname);
strcat(hkey,".");
strcat(hkey,tbl[i]);
if (rses_prop_tmp &&
rses_prop_tmp->rses_prop_data.temp_tables)
{
if (hashtable_delete(rses_prop_tmp->rses_prop_data.temp_tables,
(void *)hkey))
{
LOGIF(LT, (skygw_log_write(LOGFILE_TRACE,
"Temporary table dropped: %s",hkey)));
}
}
free(tbl[i]);
free(hkey);
}
tbl = skygw_get_table_names(querybuf,&tsize,false);
if(tbl != NULL){
for(i = 0; i<tsize; i++)
{
klen = strlen(dbname) + strlen(tbl[i]) + 2;
hkey = calloc(klen,sizeof(char));
strcpy(hkey,dbname);
strcat(hkey,".");
strcat(hkey,tbl[i]);
free(tbl);
}
if (rses_prop_tmp &&
rses_prop_tmp->rses_prop_data.temp_tables)
{
if (hashtable_delete(rses_prop_tmp->rses_prop_data.temp_tables,
(void *)hkey))
{
LOGIF(LT, (skygw_log_write(LOGFILE_TRACE,
"Temporary table dropped: %s",hkey)));
}
}
free(tbl[i]);
free(hkey);
}
free(tbl);
}
}
}
@ -1347,74 +1301,74 @@ void check_drop_tmp_table(
* @return The type of the query
*/
skygw_query_type_t is_read_tmp_table(
ROUTER* instance,
ROUTER* instance,
void* router_session,
GWBUF* querybuf,
skygw_query_type_t type)
skygw_query_type_t type)
{
bool target_tmp_table = false;
int tsize = 0, klen = 0,i;
char** tbl = NULL;
char *hkey,*dbname;
bool target_tmp_table = false;
int tsize = 0, klen = 0,i;
char** tbl = NULL;
char *hkey,*dbname;
ROUTER_CLIENT_SES* router_cli_ses = (ROUTER_CLIENT_SES *)router_session;
skygw_query_type_t qtype = type;
rses_property_t* rses_prop_tmp;
ROUTER_CLIENT_SES* router_cli_ses = (ROUTER_CLIENT_SES *)router_session;
skygw_query_type_t qtype = type;
rses_property_t* rses_prop_tmp;
rses_prop_tmp = router_cli_ses->rses_properties[RSES_PROP_TYPE_TMPTABLES];
dbname = router_cli_ses->rses_mysql_session->db;
rses_prop_tmp = router_cli_ses->rses_properties[RSES_PROP_TYPE_TMPTABLES];
dbname = router_cli_ses->rses_mysql_session->db;
if (QUERY_IS_TYPE(qtype, QUERY_TYPE_READ) ||
QUERY_IS_TYPE(qtype, QUERY_TYPE_LOCAL_READ) ||
QUERY_IS_TYPE(qtype, QUERY_TYPE_USERVAR_READ) ||
QUERY_IS_TYPE(qtype, QUERY_TYPE_SYSVAR_READ) ||
QUERY_IS_TYPE(qtype, QUERY_TYPE_GSYSVAR_READ))
if (QUERY_IS_TYPE(qtype, QUERY_TYPE_READ) ||
QUERY_IS_TYPE(qtype, QUERY_TYPE_LOCAL_READ) ||
QUERY_IS_TYPE(qtype, QUERY_TYPE_USERVAR_READ) ||
QUERY_IS_TYPE(qtype, QUERY_TYPE_SYSVAR_READ) ||
QUERY_IS_TYPE(qtype, QUERY_TYPE_GSYSVAR_READ))
{
tbl = skygw_get_table_names(querybuf,&tsize,false);
tbl = skygw_get_table_names(querybuf,&tsize,false);
if (tbl != NULL && tsize > 0)
if (tbl != NULL && tsize > 0)
{
/** Query targets at least one table */
for(i = 0; i<tsize && !target_tmp_table && tbl[i]; i++)
/** Query targets at least one table */
for(i = 0; i<tsize && !target_tmp_table && tbl[i]; i++)
{
klen = strlen(dbname) + strlen(tbl[i]) + 2;
hkey = calloc(klen,sizeof(char));
strcpy(hkey,dbname);
strcat(hkey,".");
strcat(hkey,tbl[i]);
klen = strlen(dbname) + strlen(tbl[i]) + 2;
hkey = calloc(klen,sizeof(char));
strcpy(hkey,dbname);
strcat(hkey,".");
strcat(hkey,tbl[i]);
if (rses_prop_tmp &&
rses_prop_tmp->rses_prop_data.temp_tables)
if (rses_prop_tmp &&
rses_prop_tmp->rses_prop_data.temp_tables)
{
if( (target_tmp_table =
(bool)hashtable_fetch(rses_prop_tmp->rses_prop_data.temp_tables,(void *)hkey)))
if( (target_tmp_table =
(bool)hashtable_fetch(rses_prop_tmp->rses_prop_data.temp_tables,(void *)hkey)))
{
/**Query target is a temporary table*/
qtype = QUERY_TYPE_READ_TMP_TABLE;
LOGIF(LT,
(skygw_log_write(LOGFILE_TRACE,
"Query targets a temporary table: %s",hkey)));
/**Query target is a temporary table*/
qtype = QUERY_TYPE_READ_TMP_TABLE;
LOGIF(LT,
(skygw_log_write(LOGFILE_TRACE,
"Query targets a temporary table: %s",hkey)));
}
}
free(hkey);
free(hkey);
}
}
}
if(tbl != NULL){
for(i = 0; i<tsize;i++)
{
free(tbl[i]);
}
free(tbl);
if(tbl != NULL){
for(i = 0; i<tsize;i++)
{
free(tbl[i]);
}
return qtype;
free(tbl);
}
return qtype;
}
/**
@ -2203,7 +2157,11 @@ char *weightby;
router_cli_ses = router_cli_ses->next;
}
spinlock_release(&router->lock);
dcb_printf(dcb,"|%-32s-%-32s|","","");
dcb_printf(dcb,"|%-32s|%-32s|","Server","Queries");
dcb_printf(dcb,"|%-32s-%-32s|","","");
dcb_printf(dcb,
"\tNumber of router sessions: %d\n",
router->stats.n_sessions);
@ -2609,7 +2567,7 @@ lock_failed:
return;
}
/** Compare nunmber of connections from this router in backend servers */
/** Compare number of connections from this router in backend servers */
int bref_cmp_router_conn(
const void* bref1,
const void* bref2)
@ -2621,7 +2579,7 @@ int bref_cmp_router_conn(
- ((1000 * b2->backend_conn_count) / b2->weight);
}
/** Compare nunmber of global connections in backend servers */
/** Compare number of global connections in backend servers */
int bref_cmp_global_conn(
const void* bref1,
const void* bref2)
@ -2634,7 +2592,7 @@ int bref_cmp_global_conn(
}
/** Compare relication lag between backend servers */
/** Compare replication lag between backend servers */
int bref_cmp_behind_master(
const void* bref1,
const void* bref2)
@ -2646,7 +2604,7 @@ int bref_cmp_behind_master(
((b1->backend_server->rlag > b2->backend_server->rlag) ? 1 : 0));
}
/** Compare nunmber of current operations in backend servers */
/** Compare number of current operations in backend servers */
int bref_cmp_current_load(
const void* bref1,
const void* bref2)
@ -3853,6 +3811,12 @@ static void handle_error_reply_client(
}
}
/**
* Check if a router session has servers in use
* @param rses Router client session
* @return True if session has a single backend server in use that is running.
* False if no backends are in use or running.
*/
bool have_servers(ROUTER_CLIENT_SES* rses)
{
int i;
@ -3990,8 +3954,11 @@ return_succp:
return succp;
}
/**
* Count the number of servers.
* @param inst Router instance
* @return Number of servers
*/
static int router_get_servercount(
ROUTER_INSTANCE* inst)
{
@ -4042,6 +4009,10 @@ static backend_ref_t* get_bref_from_dcb(
/**
* Calls hang-up function for DCB if it is not both running and in
* master/slave/joined/ndb role. Called by DCB's callback routine.
* @param dcb Backend server DCB
* @param reason The reason this DCB callback was called
* @param data Data pointer assigned in the add_callback function call
* @return Always 1
*/
static int
router_handle_state_switch(
@ -4101,7 +4072,7 @@ static sescmd_cursor_t* backend_ref_get_sescmd_cursor (
}
/**
* Read new database nbame from MYSQL_COM_INIT_DB packet, check that it exists
* Read new database name from MYSQL_COM_INIT_DB packet, check that it exists
* in the hashtable and copy its name to MYSQL_session.
*
* @param inst Router instance