Merge branch 'release-1.0GA' of https://github.com/mariadb-corporation/MaxScale into release-1.0GA

This commit is contained in:
Markus Makela
2014-12-23 11:15:48 +02:00
7 changed files with 98 additions and 57 deletions

View File

@ -310,7 +310,7 @@ DCB *clone;
return NULL; return NULL;
} }
clone->fd = DCBFD_CLONED;; clone->fd = DCBFD_CLOSED;
clone->flags |= DCBF_CLONE; clone->flags |= DCBF_CLONE;
clone->state = orig->state; clone->state = orig->state;
clone->data = orig->data; clone->data = orig->data;
@ -321,11 +321,10 @@ DCB *clone;
clone->protocol = orig->protocol; clone->protocol = orig->protocol;
clone->func.write = dcb_null_write; clone->func.write = dcb_null_write;
#if 1 /**
* Close triggers closing of router session as well which is needed.
*/
clone->func.close = orig->func.close; clone->func.close = orig->func.close;
#else
clone->func.close = dcb_null_close;
#endif
clone->func.auth = dcb_null_auth; clone->func.auth = dcb_null_auth;
return clone; return clone;

View File

@ -357,7 +357,6 @@ bool session_free(
int i; int i;
CHK_SESSION(session); CHK_SESSION(session);
/*< /*<
* Remove one reference. If there are no references left, * Remove one reference. If there are no references left,
* free session. * free session.
@ -389,14 +388,14 @@ bool session_free(
atomic_add(&session->service->stats.n_current, -1); atomic_add(&session->service->stats.n_current, -1);
/** /**
* Free router_session and set it NULL * If session is not child of some other session, free router_session.
* Otherwise let the parent free it.
*/ */
if (session->router_session) if (!session->ses_is_child && session->router_session)
{ {
session->service->router->freeSession( session->service->router->freeSession(
session->service->router_instance, session->service->router_instance,
session->router_session); session->router_session);
session->router_session = NULL;
} }
if (session->n_filters) if (session->n_filters)
{ {

View File

@ -130,7 +130,6 @@ typedef struct {
#define GWPROTOCOL_VERSION {1, 0, 0} #define GWPROTOCOL_VERSION {1, 0, 0}
#define DCBFD_CLOSED -1 #define DCBFD_CLOSED -1
#define DCBFD_CLONED -2
/** /**
* The statitics gathered on a descriptor control block * The statitics gathered on a descriptor control block
@ -332,4 +331,6 @@ bool dcb_get_ses_log_info(DCB* dcb, size_t* sesid, int* enabled_logs);
*/ */
#define DCBF_CLONE 0x0001 /*< DCB is a clone */ #define DCBF_CLONE 0x0001 /*< DCB is a clone */
#define DCBF_HUNG 0x0002 /*< Hangup has been dispatched */ #define DCBF_HUNG 0x0002 /*< Hangup has been dispatched */
#define DCB_IS_CLONE(d) ((d)->flags & DCBF_CLONE)
#endif /* _DCB_H */ #endif /* _DCB_H */

View File

@ -351,7 +351,7 @@ char *remote, *userName;
if ((dcb = dcb_clone(session->client)) == NULL) if ((dcb = dcb_clone(session->client)) == NULL)
{ {
freeSession(my_instance, (void *)my_session); freeSession(instance, (void *)my_session);
my_session = NULL; my_session = NULL;
LOGIF(LE, (skygw_log_write_flush( LOGIF(LE, (skygw_log_write_flush(
@ -364,7 +364,7 @@ char *remote, *userName;
if ((ses = session_alloc(my_instance->service, dcb)) == NULL) if ((ses = session_alloc(my_instance->service, dcb)) == NULL)
{ {
dcb_close(dcb); dcb_close(dcb);
freeSession(my_instance, (void *)my_session); freeSession(instance, (void *)my_session);
my_session = NULL; my_session = NULL;
LOGIF(LE, (skygw_log_write_flush( LOGIF(LE, (skygw_log_write_flush(
LOGFILE_ERROR, LOGFILE_ERROR,
@ -438,12 +438,26 @@ freeSession(FILTER *instance, void *session)
TEE_SESSION *my_session = (TEE_SESSION *)session; TEE_SESSION *my_session = (TEE_SESSION *)session;
SESSION* ses = my_session->branch_session; SESSION* ses = my_session->branch_session;
if (ses != NULL && ses->state == SESSION_STATE_TO_BE_FREED) if (ses != NULL)
{ {
ses->state = SESSION_STATE_FREE; if (ses->state == SESSION_STATE_ROUTER_READY)
free(ses); {
session_free(ses);
}
if (ses->state == SESSION_STATE_TO_BE_FREED)
{
/** Free branch router session */
ses->service->router->freeSession(
ses->service->router_instance,
ses->router_session);
/** Free memory of branch client session */
ses->state = SESSION_STATE_FREE;
free(ses);
/** This indicates that branch session is not available anymore */
my_session->branch_session = NULL;
}
} }
free(session);
return; return;
} }
@ -490,46 +504,76 @@ char *ptr;
int length, rval, residual = 0; int length, rval, residual = 0;
GWBUF *clone = NULL; GWBUF *clone = NULL;
if (my_session->residual) if (my_session->branch_session->state == SESSION_STATE_ROUTER_READY)
{ {
clone = gwbuf_clone(queue);
if (my_session->residual < GWBUF_LENGTH(clone))
GWBUF_RTRIM(clone, GWBUF_LENGTH(clone) - residual);
my_session->residual -= GWBUF_LENGTH(clone);
if (my_session->residual < 0)
my_session->residual = 0;
}
else if ( my_session->active && (ptr = modutil_get_SQL(queue)) != NULL)
{
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))
{
char *dummy;
modutil_MySQL_Query(queue, &dummy, &length, &residual);
clone = gwbuf_clone(queue);
my_session->residual = residual;
if (my_session->residual)
{
clone = gwbuf_clone(queue);
if (my_session->residual < GWBUF_LENGTH(clone))
{
GWBUF_RTRIM(clone, GWBUF_LENGTH(clone) - residual);
}
my_session->residual -= GWBUF_LENGTH(clone);
if (my_session->residual < 0)
{
my_session->residual = 0;
}
} }
free(ptr); else if (my_session->active && (ptr = modutil_get_SQL(queue)) != NULL)
} {
else if (packet_is_required(queue)) if ((my_instance->match == NULL ||
{ regexec(&my_instance->re, ptr, 0, NULL, 0) == 0) &&
clone = gwbuf_clone(queue); (my_instance->nomatch == NULL ||
} regexec(&my_instance->nore,ptr,0,NULL, 0) != 0))
{
char *dummy;
modutil_MySQL_Query(queue, &dummy, &length, &residual);
clone = gwbuf_clone(queue);
my_session->residual = residual;
}
free(ptr);
}
else if (packet_is_required(queue))
{
clone = gwbuf_clone(queue);
}
}
/* Pass the query downstream */ /* Pass the query downstream */
rval = my_session->down.routeQuery(my_session->down.instance, rval = my_session->down.routeQuery(my_session->down.instance,
my_session->down.session, queue); my_session->down.session,
queue);
if (clone) if (clone)
{ {
my_session->n_duped++; my_session->n_duped++;
SESSION_ROUTE_QUERY(my_session->branch_session, clone);
if (my_session->branch_session->state == SESSION_STATE_ROUTER_READY)
{
SESSION_ROUTE_QUERY(my_session->branch_session, clone);
}
else
{
/** Close tee session */
my_session->active = 0;
LOGIF(LT, (skygw_log_write(
LOGFILE_TRACE,
"Closed tee filter session.")));
gwbuf_free(clone);
}
} }
else else
{ {
if (my_session->active)
{
LOGIF(LT, (skygw_log_write(
LOGFILE_TRACE,
"Closed tee filter session.")));
my_session->active = 0;
}
my_session->n_rejected++; my_session->n_rejected++;
} }
return rval; return rval;

View File

@ -790,14 +790,14 @@ int log_no_master = 1;
{ {
LOGIF(LM, (skygw_log_write( LOGIF(LM, (skygw_log_write(
LOGFILE_MESSAGE, LOGFILE_MESSAGE,
"Info: A Master Server is now available: %s:%i", "Info : A Master Server is now available: %s:%i",
root_master->server->name, root_master->server->name,
root_master->server->port))); root_master->server->port)));
} }
} else { } else {
LOGIF(LE, (skygw_log_write_flush( LOGIF(LE, (skygw_log_write_flush(
LOGFILE_ERROR, LOGFILE_ERROR,
"Error: No Master can be determined. Last known was %s:%i", "Error : No Master can be determined. Last known was %s:%i",
root_master->server->name, root_master->server->name,
root_master->server->port))); root_master->server->port)));
} }
@ -807,7 +807,7 @@ int log_no_master = 1;
{ {
LOGIF(LE, (skygw_log_write_flush( LOGIF(LE, (skygw_log_write_flush(
LOGFILE_ERROR, LOGFILE_ERROR,
"Error: No Master can be determined"))); "Error : No Master can be determined")));
log_no_master = 0; log_no_master = 0;
} }
} }

View File

@ -1401,9 +1401,14 @@ gw_client_close(DCB *dcb)
LOGIF(LD, (skygw_log_write(LOGFILE_DEBUG, LOGIF(LD, (skygw_log_write(LOGFILE_DEBUG,
"%lu [gw_client_close]", "%lu [gw_client_close]",
pthread_self()))); pthread_self())));
/**
mysql_protocol_done(dcb); * Since only protocol pointer is copied from original DCB to clone in
* dcb_clone, only dcb_close for the original DCB closes protocol.
*/
if (!DCB_IS_CLONE(dcb))
{
mysql_protocol_done(dcb);
}
session = dcb->session; session = dcb->session;
/** /**
* session may be NULL if session_alloc failed. * session may be NULL if session_alloc failed.

View File

@ -1032,13 +1032,6 @@ static void freeSession(
router = (ROUTER_INSTANCE *)router_instance; router = (ROUTER_INSTANCE *)router_instance;
backend_ref = router_cli_ses->rses_backend_ref; backend_ref = router_cli_ses->rses_backend_ref;
for (i=0; i<router_cli_ses->rses_nbackends; i++)
{
if (!BREF_IS_IN_USE((&backend_ref[i])))
{
continue;
}
}
spinlock_acquire(&router->lock); spinlock_acquire(&router->lock);
if (router->connections == router_cli_ses) { if (router->connections == router_cli_ses) {