Fixed thread safety issues in schemarouter and shardrouter
Fixed strtok being used in a multithreaded context and removed unused code.
This commit is contained in:
@ -569,8 +569,8 @@ char* get_shard_target_name(ROUTER_INSTANCE* router, ROUTER_CLIENT_SES* client,
|
|||||||
query = modutil_get_SQL(buffer);
|
query = modutil_get_SQL(buffer);
|
||||||
if((tmp = strcasestr(query,"from")))
|
if((tmp = strcasestr(query,"from")))
|
||||||
{
|
{
|
||||||
char* tok = strtok(tmp, " ;");
|
char *saved, *tok = strtok_r(tmp, " ;", &saved);
|
||||||
tok = strtok(NULL," ;");
|
tok = strtok_r(NULL, " ;", &saved);
|
||||||
ss_dassert(tok != NULL);
|
ss_dassert(tok != NULL);
|
||||||
tmp = (char*) hashtable_fetch(ht, tok);
|
tmp = (char*) hashtable_fetch(ht, tok);
|
||||||
|
|
||||||
@ -652,49 +652,6 @@ bool check_shard_status(ROUTER_INSTANCE* router, char* shard)
|
|||||||
return rval;
|
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;
|
|
||||||
char **list = NULL;
|
|
||||||
int sz = 2, count = 0;
|
|
||||||
|
|
||||||
tok = strtok(str,", ");
|
|
||||||
|
|
||||||
if(tok == NULL)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
list = (char**)malloc(sizeof(char*)*(sz));
|
|
||||||
|
|
||||||
while(tok)
|
|
||||||
{
|
|
||||||
if(count + 1 >= sz)
|
|
||||||
{
|
|
||||||
char** tmp = realloc(list,sizeof(char*)*(sz*2));
|
|
||||||
if(tmp == NULL)
|
|
||||||
{
|
|
||||||
char errbuf[STRERROR_BUFLEN];
|
|
||||||
MXS_ERROR("realloc returned NULL: %s.",
|
|
||||||
strerror_r(errno, errbuf, sizeof(errbuf)));
|
|
||||||
free(list);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
list = tmp;
|
|
||||||
sz *= 2;
|
|
||||||
}
|
|
||||||
list[count] = strdup(tok);
|
|
||||||
count++;
|
|
||||||
tok = strtok(NULL,", ");
|
|
||||||
}
|
|
||||||
list[count] = NULL;
|
|
||||||
return list;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A fake DCB read function used to forward queued queries.
|
* A fake DCB read function used to forward queued queries.
|
||||||
* @param dcb Internal DCB used by the router session
|
* @param dcb Internal DCB used by the router session
|
||||||
|
@ -482,8 +482,8 @@ get_shard_target_name(ROUTER_INSTANCE* router, ROUTER_CLIENT_SES* client, GWBUF*
|
|||||||
query = modutil_get_SQL(buffer);
|
query = modutil_get_SQL(buffer);
|
||||||
if((tmp = strcasestr(query,"from")))
|
if((tmp = strcasestr(query,"from")))
|
||||||
{
|
{
|
||||||
char* tok = strtok(tmp, " ;");
|
char *saved, *tok = strtok_r(tmp, " ;", &saved);
|
||||||
tok = strtok(NULL," ;");
|
tok = strtok_r(NULL, " ;", &saved);
|
||||||
ss_dassert(tok != NULL);
|
ss_dassert(tok != NULL);
|
||||||
tmp = (char*) hashtable_fetch(ht, tok);
|
tmp = (char*) hashtable_fetch(ht, tok);
|
||||||
if(tmp)
|
if(tmp)
|
||||||
@ -542,44 +542,6 @@ get_shard_target_name(ROUTER_INSTANCE* router, ROUTER_CLIENT_SES* client, GWBUF*
|
|||||||
return rval;
|
return rval;
|
||||||
}
|
}
|
||||||
|
|
||||||
char**
|
|
||||||
tokenize_string(char* str)
|
|
||||||
{
|
|
||||||
char *tok;
|
|
||||||
char **list = NULL;
|
|
||||||
int sz = 2, count = 0;
|
|
||||||
|
|
||||||
tok = strtok(str, ", ");
|
|
||||||
|
|
||||||
if(tok == NULL)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
list = (char**) malloc(sizeof(char*)*(sz));
|
|
||||||
|
|
||||||
while(tok)
|
|
||||||
{
|
|
||||||
if(count + 1 >= sz)
|
|
||||||
{
|
|
||||||
char** tmp = realloc(list, sizeof(char*)*(sz * 2));
|
|
||||||
if(tmp == NULL)
|
|
||||||
{
|
|
||||||
char errbuf[STRERROR_BUFLEN];
|
|
||||||
MXS_ERROR("realloc returned NULL: %s.",
|
|
||||||
strerror_r(errno, errbuf, sizeof(errbuf)));
|
|
||||||
free(list);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
list = tmp;
|
|
||||||
sz *= 2;
|
|
||||||
}
|
|
||||||
list[count] = strdup(tok);
|
|
||||||
count++;
|
|
||||||
tok = strtok(NULL, ", ");
|
|
||||||
}
|
|
||||||
list[count] = NULL;
|
|
||||||
return list;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This is the function used to channel replies from a subservice up to the client.
|
* This is the function used to channel replies from a subservice up to the client.
|
||||||
* The values passed are set in the newSession function.
|
* The values passed are set in the newSession function.
|
||||||
|
Reference in New Issue
Block a user