Merge branch 'develop' into MAX-309
This commit is contained in:
@ -569,7 +569,10 @@ int len;
|
||||
|
||||
if ((newbuf = gwbuf_alloc(gwbuf_length(orig))) != NULL)
|
||||
{
|
||||
newbuf->gwbuf_type = orig->gwbuf_type;
|
||||
newbuf->hint = hint_dup(orig->hint);
|
||||
ptr = GWBUF_DATA(newbuf);
|
||||
|
||||
while (orig)
|
||||
{
|
||||
len = GWBUF_LENGTH(orig);
|
||||
|
||||
@ -38,6 +38,8 @@
|
||||
*
|
||||
* @param hint The hint list to duplicate
|
||||
* @return A duplicate of the list
|
||||
*
|
||||
* Note : Optimize this to use version numbering instead of copying memory
|
||||
*/
|
||||
HINT *
|
||||
hint_dup(HINT *hint)
|
||||
|
||||
@ -167,6 +167,7 @@ GWBUF *addition;
|
||||
*ptr++ = (newlength + 1) & 0xff;
|
||||
*ptr++ = ((newlength + 1) >> 8) & 0xff;
|
||||
*ptr++ = ((newlength + 1) >> 16) & 0xff;
|
||||
addition->gwbuf_type = orig->gwbuf_type;
|
||||
orig->next = addition;
|
||||
}
|
||||
|
||||
|
||||
@ -11,7 +11,7 @@ add_executable(test_service testservice.c)
|
||||
add_executable(test_server testserver.c)
|
||||
add_executable(test_users testusers.c)
|
||||
add_executable(test_adminusers testadminusers.c)
|
||||
target_link_libraries(test_mysql_users fullcore MySQLClient)
|
||||
target_link_libraries(test_mysql_users MySQLClient fullcore)
|
||||
target_link_libraries(test_hash fullcore)
|
||||
target_link_libraries(test_hint fullcore)
|
||||
target_link_libraries(test_spinlock fullcore)
|
||||
|
||||
@ -42,6 +42,13 @@ testhash: testhash.c
|
||||
-I$(ROOT_PATH)/utils \
|
||||
testhash.c ../hashtable.o ../atomic.o ../spinlock.o -o testhash
|
||||
|
||||
testmysqlusers: test_mysql_users.c
|
||||
$(CC) $(CFLAGS) \
|
||||
-I$(ROOT_PATH)/server/include \
|
||||
-I$(ROOT_PATH)/utils \
|
||||
test_mysql_users.c ../hashtable.o ../atomic.o ../modutil.o ../spinlock.o -o testmysqlusers
|
||||
|
||||
|
||||
testspinlock: testspinlock.c
|
||||
$(CC) $(CFLAGS) \
|
||||
-I$(ROOT_PATH)/server/include \
|
||||
|
||||
77
server/core/test/testsession.c
Normal file
77
server/core/test/testsession.c
Normal file
@ -0,0 +1,77 @@
|
||||
/*
|
||||
* This file is distributed as part of MaxScale. It is free
|
||||
* software: you can redistribute it and/or modify it under the terms of the
|
||||
* GNU General Public License as published by the Free Software Foundation,
|
||||
* version 2.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
|
||||
* details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc., 51
|
||||
* Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Copyright MariaDB Corporation Ab 2014
|
||||
*/
|
||||
|
||||
/**
|
||||
*
|
||||
* @verbatim
|
||||
* Revision History
|
||||
*
|
||||
* Date Who Description
|
||||
* 11-09-2014 Martin Brampton Initial implementation
|
||||
*
|
||||
* @endverbatim
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <poll.h>
|
||||
#include <dcb.h>
|
||||
|
||||
/**
|
||||
* test1 Allocate a service and do lots of other things
|
||||
*
|
||||
*/
|
||||
|
||||
static int
|
||||
test1()
|
||||
{
|
||||
DCB *dcb;
|
||||
int result;
|
||||
|
||||
/* Poll tests */
|
||||
ss_dfprintf(stderr,
|
||||
"testpoll : Initialise the polling system.");
|
||||
poll_init();
|
||||
ss_dfprintf(stderr, "\t..done\nAdd a DCB");
|
||||
dcb = dcb_alloc(DCB_ROLE_SERVICE_LISTENER);
|
||||
dcb->fd = socket(AF_UNIX, SOCK_STREAM, 0);
|
||||
poll_add_dcb(dcb);
|
||||
poll_remove_dcb(dcb);
|
||||
poll_add_dcb(dcb);
|
||||
ss_dfprintf(stderr, "\t..done\nStart wait for events.");
|
||||
sleep(10);
|
||||
poll_shutdown();
|
||||
ss_dfprintf(stderr, "\t..done\nTidy up.");
|
||||
dcb_free(dcb);
|
||||
ss_dfprintf(stderr, "\t..done\n");
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int result = 0;
|
||||
|
||||
result += test1();
|
||||
|
||||
exit(result);
|
||||
}
|
||||
|
||||
@ -106,6 +106,8 @@ int add;
|
||||
/**
|
||||
* Delete a user from the user table.
|
||||
*
|
||||
* The last user in the table can not be deleted
|
||||
*
|
||||
* @param users The users table
|
||||
* @param user The user name
|
||||
* @return The number of users deleted from the table
|
||||
@ -115,12 +117,12 @@ users_delete(USERS *users, char *user)
|
||||
{
|
||||
int del;
|
||||
|
||||
atomic_add(&users->stats.n_deletes, 1);
|
||||
if (users->stats.n_entries == 1) {
|
||||
return 0;
|
||||
}
|
||||
atomic_add(&users->stats.n_deletes, 1);
|
||||
del = hashtable_delete(users->data, user);
|
||||
atomic_add(&users->stats.n_entries, del * -1);
|
||||
atomic_add(&users->stats.n_entries, -del);
|
||||
return del;
|
||||
}
|
||||
|
||||
|
||||
@ -1168,7 +1168,11 @@ routeQuery(FILTER *instance, void *session, GWBUF *queue)
|
||||
|
||||
}
|
||||
|
||||
|
||||
if (queue->next != NULL)
|
||||
{
|
||||
queue = gwbuf_make_contiguous(queue);
|
||||
}
|
||||
|
||||
if(modutil_extract_SQL(queue, &ptr, &length)){
|
||||
|
||||
my_session->was_query = true;
|
||||
|
||||
@ -358,24 +358,30 @@ int length;
|
||||
struct tm t;
|
||||
struct timeval tv;
|
||||
|
||||
if (my_session->active && modutil_extract_SQL(queue, &ptr, &length))
|
||||
if (my_session->active)
|
||||
{
|
||||
if ((my_instance->match == NULL ||
|
||||
regexec(&my_instance->re, ptr, 0, NULL, 0) == 0) &&
|
||||
(my_instance->nomatch == NULL ||
|
||||
regexec(&my_instance->nore,ptr,0,NULL, 0) != 0))
|
||||
if (queue->next != NULL)
|
||||
{
|
||||
gettimeofday(&tv, NULL);
|
||||
localtime_r(&tv.tv_sec, &t);
|
||||
fprintf(my_session->fp,
|
||||
"%02d:%02d:%02d.%-3d %d/%02d/%d, ",
|
||||
t.tm_hour, t.tm_min, t.tm_sec, (int)(tv.tv_usec / 1000),
|
||||
t.tm_mday, t.tm_mon + 1, 1900 + t.tm_year);
|
||||
fwrite(ptr, sizeof(char), length, my_session->fp);
|
||||
fwrite("\n", sizeof(char), 1, my_session->fp);
|
||||
queue = gwbuf_make_contiguous(queue);
|
||||
}
|
||||
if (modutil_extract_SQL(queue, &ptr, &length) != 0)
|
||||
{
|
||||
if ((my_instance->match == NULL ||
|
||||
regexec(&my_instance->re, ptr, 0, NULL, 0) == 0) &&
|
||||
(my_instance->nomatch == NULL ||
|
||||
regexec(&my_instance->nore,ptr,0,NULL, 0) != 0))
|
||||
{
|
||||
gettimeofday(&tv, NULL);
|
||||
localtime_r(&tv.tv_sec, &t);
|
||||
fprintf(my_session->fp,
|
||||
"%02d:%02d:%02d.%-3d %d/%02d/%d, ",
|
||||
t.tm_hour, t.tm_min, t.tm_sec, (int)(tv.tv_usec / 1000),
|
||||
t.tm_mday, t.tm_mon + 1, 1900 + t.tm_year);
|
||||
fwrite(ptr, sizeof(char), length, my_session->fp);
|
||||
fwrite("\n", sizeof(char), 1, my_session->fp);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Pass the query downstream */
|
||||
return my_session->down.routeQuery(my_session->down.instance,
|
||||
my_session->down.session, queue);
|
||||
|
||||
@ -305,6 +305,10 @@ int length;
|
||||
|
||||
if (modutil_is_SQL(queue))
|
||||
{
|
||||
if (queue->next != NULL)
|
||||
{
|
||||
queue = gwbuf_make_contiguous(queue);
|
||||
}
|
||||
modutil_extract_SQL(queue, &sql, &length);
|
||||
newsql = regex_replace(sql, length, &my_instance->re,
|
||||
my_instance->replace);
|
||||
|
||||
@ -455,21 +455,27 @@ TOPN_SESSION *my_session = (TOPN_SESSION *)session;
|
||||
char *ptr;
|
||||
int length;
|
||||
|
||||
if (my_session->active && modutil_extract_SQL(queue, &ptr, &length))
|
||||
if (my_session->active)
|
||||
{
|
||||
if ((my_instance->match == NULL ||
|
||||
regexec(&my_instance->re, ptr, 0, NULL, 0) == 0) &&
|
||||
(my_instance->exclude == NULL ||
|
||||
regexec(&my_instance->exre,ptr,0,NULL, 0) != 0))
|
||||
if (queue->next != NULL)
|
||||
{
|
||||
my_session->n_statements++;
|
||||
if (my_session->current)
|
||||
free(my_session->current);
|
||||
gettimeofday(&my_session->start, NULL);
|
||||
my_session->current = strndup(ptr, length);
|
||||
queue = gwbuf_make_contiguous(queue);
|
||||
}
|
||||
if (modutil_extract_SQL(queue, &ptr, &length) != 0)
|
||||
{
|
||||
if ((my_instance->match == NULL ||
|
||||
regexec(&my_instance->re, ptr, 0, NULL, 0) == 0) &&
|
||||
(my_instance->exclude == NULL ||
|
||||
regexec(&my_instance->exre,ptr,0,NULL, 0) != 0))
|
||||
{
|
||||
my_session->n_statements++;
|
||||
if (my_session->current)
|
||||
free(my_session->current);
|
||||
gettimeofday(&my_session->start, NULL);
|
||||
my_session->current = strndup(ptr, length);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Pass the query downstream */
|
||||
return my_session->down.routeQuery(my_session->down.instance,
|
||||
my_session->down.session, queue);
|
||||
|
||||
@ -29,7 +29,7 @@ UTILSPATH := $(ROOT_PATH)/utils
|
||||
|
||||
CC=cc
|
||||
CFLAGS=-c -fPIC -I/usr/include -I../include -I../../include -I$(LOGPATH) \
|
||||
-I$(UTILSPATH) -Wall -g
|
||||
-I$(UTILSPATH) -I$(MYSQL_HEADERS) -Wall -g
|
||||
|
||||
include ../../../makefile.inc
|
||||
|
||||
|
||||
@ -1155,15 +1155,13 @@ static bool get_dcb(
|
||||
rses->router->available_slaves = false;
|
||||
LOGIF(LE, (skygw_log_write_flush(
|
||||
LOGFILE_ERROR,
|
||||
"Warning : No slaves available "
|
||||
"for the service %s.",
|
||||
rses->router->service->name)));
|
||||
"Warning : No slaves available "
|
||||
"for the service %s.",
|
||||
rses->router->service->name)));
|
||||
}
|
||||
|
||||
|
||||
btype = BE_MASTER;
|
||||
|
||||
|
||||
if (BREF_IS_IN_USE(master_bref))
|
||||
{
|
||||
*p_dcb = master_bref->bref_dcb;
|
||||
@ -1199,7 +1197,7 @@ static bool get_dcb(
|
||||
LOGFILE_ERROR,
|
||||
"At least one slave has become available for "
|
||||
"the service %s.",
|
||||
rses->router->service->name)));
|
||||
rses->router->service->name)));
|
||||
}
|
||||
ss_dassert(succp);
|
||||
}
|
||||
@ -1920,8 +1918,8 @@ static int routeQuery(
|
||||
}
|
||||
else if (hint->type == HINT_PARAMETER &&
|
||||
(strncasecmp((char *)hint->data,
|
||||
"max_slave_replication_lag",
|
||||
strlen("max_slave_replication_lag")) == 0))
|
||||
"max_slave_replication_lag",
|
||||
strlen("max_slave_replication_lag")) == 0))
|
||||
{
|
||||
int val = (int) strtol((char *)hint->value,
|
||||
(char **)NULL, 10);
|
||||
@ -2047,8 +2045,7 @@ static int routeQuery(
|
||||
}
|
||||
succp = false;
|
||||
ret = 0;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
if (succp) /*< Have DCB of the target backend */
|
||||
@ -3518,7 +3515,9 @@ static bool execute_sescmd_in_backend(
|
||||
#endif /*< SS_DEBUG */
|
||||
switch (scur->scmd_cur_cmd->my_sescmd_packet_type) {
|
||||
case MYSQL_COM_CHANGE_USER:
|
||||
rc = dcb->func.auth(
|
||||
/** This makes it possible to handle replies correctly */
|
||||
gwbuf_set_type(scur->scmd_cur_cmd->my_sescmd_buf, GWBUF_TYPE_SESCMD);
|
||||
rc = dcb->func.auth(
|
||||
dcb,
|
||||
NULL,
|
||||
dcb->session,
|
||||
|
||||
Reference in New Issue
Block a user