Bug fixes and improvements.

This commit is contained in:
counterpoint
2015-05-22 15:53:54 +01:00
parent b51c5f52ef
commit d7cd40e5a5
4 changed files with 27 additions and 6 deletions

View File

@ -408,7 +408,9 @@ DCB_CALLBACK *cb;
} }
if (dcb->protocol && (!DCB_IS_CLONE(dcb))) if (dcb->protocol && (!DCB_IS_CLONE(dcb)))
free(dcb->protocol); free(dcb->protocol);
if (dcb->protoname)
free(dcb->protoname);
if (dcb->remote) if (dcb->remote)
free(dcb->remote); free(dcb->remote);
if (dcb->user) if (dcb->user)
@ -635,14 +637,31 @@ int rc;
char *user; char *user;
user = session_getUser(session); user = session_getUser(session);
if (NULL != user && strlen(user)) if (user && strlen(user))
{ {
LOGIF(LD, (skygw_log_write( LOGIF(LD, (skygw_log_write(
LOGFILE_DEBUG, LOGFILE_DEBUG,
"About to attempt to get a persistent connection DCB"))); "About to attempt to get a persistent connection DCB")));
dcb = server_get_persistent(server, user); dcb = server_get_persistent(server, user, protocol);
if (NULL != dcb) if (NULL != dcb)
{ {
/**
* Link dcb to session. Unlink is called in dcb_final_free
*/
if (!session_link_dcb(session, dcb))
{
LOGIF(LD, (skygw_log_write(
LOGFILE_DEBUG,
"%lu [dcb_connect] Failed to link to session, the "
"session has been removed.",
pthread_self())));
dcb_final_free(dcb);
return NULL;
}
dcb->dcb_server_status = server->status;
LOGIF(LD, (skygw_log_write(
LOGFILE_DEBUG,
"Reusing a persistent connection")));
return dcb; return dcb;
} }
} }
@ -666,6 +685,7 @@ char *user;
return NULL; return NULL;
} }
memcpy(&(dcb->func), funcs, sizeof(GWPROTOCOL)); memcpy(&(dcb->func), funcs, sizeof(GWPROTOCOL));
dcb->protoname = strdup(protocol);
/** /**
* Link dcb to session. Unlink is called in dcb_final_free * Link dcb to session. Unlink is called in dcb_final_free

View File

@ -138,7 +138,7 @@ SERVER *ptr;
* @param user The name of the user needing the connection * @param user The name of the user needing the connection
*/ */
DCB * DCB *
server_get_persistent(SERVER *server, char *user) server_get_persistent(SERVER *server, char *user, char *protocol)
{ {
DCB *dcb, *previous; DCB *dcb, *previous;
int rc; int rc;
@ -148,7 +148,7 @@ server_get_persistent(SERVER *server, char *user)
previous = NULL; previous = NULL;
while (dcb) { while (dcb) {
/* Test for expired, free and remove from list if it is */ /* Test for expired, free and remove from list if it is */
if (NULL != dcb->user && 0 == strcmp(dcb->user, user)) if (dcb->user && dcb->protoname && 0 == strcmp(dcb->user, user) && 0 == strcmp(dcb->protoname, protocol))
{ {
if (NULL == previous) if (NULL == previous)
{ {

View File

@ -234,6 +234,7 @@ typedef struct dcb {
char *remote; /**< Address of remote end */ char *remote; /**< Address of remote end */
char *user; /**< User name for connection */ char *user; /**< User name for connection */
struct sockaddr_in ipv4; /**< remote end IPv4 address */ struct sockaddr_in ipv4; /**< remote end IPv4 address */
char *protoname; /**< Name of the protocol */
void *protocol; /**< The protocol specific state */ void *protocol; /**< The protocol specific state */
struct session *session; /**< The owning session */ struct session *session; /**< The owning session */
GWPROTOCOL func; /**< The functions for this descriptor */ GWPROTOCOL func; /**< The functions for this descriptor */

View File

@ -192,6 +192,6 @@ extern void serverAddParameter(SERVER *, char *, char *);
extern char *serverGetParameter(SERVER *, char *); extern char *serverGetParameter(SERVER *, char *);
extern void server_update(SERVER *, char *, char *, char *); extern void server_update(SERVER *, char *, char *, char *);
extern void server_set_unique_name(SERVER *, char *); extern void server_set_unique_name(SERVER *, char *);
extern DCB *server_get_persistent(SERVER *, char *); extern DCB *server_get_persistent(SERVER *, char *, char *);
extern RESULTSET *serverGetList(); extern RESULTSET *serverGetList();
#endif #endif