diff --git a/server/core/dcb.c b/server/core/dcb.c index 2195a46f3..698af09ba 100644 --- a/server/core/dcb.c +++ b/server/core/dcb.c @@ -408,7 +408,9 @@ DCB_CALLBACK *cb; } if (dcb->protocol && (!DCB_IS_CLONE(dcb))) - free(dcb->protocol); + free(dcb->protocol); + if (dcb->protoname) + free(dcb->protoname); if (dcb->remote) free(dcb->remote); if (dcb->user) @@ -635,14 +637,31 @@ int rc; char *user; user = session_getUser(session); - if (NULL != user && strlen(user)) + if (user && strlen(user)) { LOGIF(LD, (skygw_log_write( LOGFILE_DEBUG, "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) { + /** + * 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; } } @@ -666,6 +685,7 @@ char *user; return NULL; } memcpy(&(dcb->func), funcs, sizeof(GWPROTOCOL)); + dcb->protoname = strdup(protocol); /** * Link dcb to session. Unlink is called in dcb_final_free diff --git a/server/core/server.c b/server/core/server.c index 7f66e93e4..2026cab91 100644 --- a/server/core/server.c +++ b/server/core/server.c @@ -138,7 +138,7 @@ SERVER *ptr; * @param user The name of the user needing the connection */ DCB * -server_get_persistent(SERVER *server, char *user) +server_get_persistent(SERVER *server, char *user, char *protocol) { DCB *dcb, *previous; int rc; @@ -148,7 +148,7 @@ server_get_persistent(SERVER *server, char *user) previous = NULL; while (dcb) { /* 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) { diff --git a/server/include/dcb.h b/server/include/dcb.h index c21a91e5d..262e3a3e9 100644 --- a/server/include/dcb.h +++ b/server/include/dcb.h @@ -234,6 +234,7 @@ typedef struct dcb { char *remote; /**< Address of remote end */ char *user; /**< User name for connection */ struct sockaddr_in ipv4; /**< remote end IPv4 address */ + char *protoname; /**< Name of the protocol */ void *protocol; /**< The protocol specific state */ struct session *session; /**< The owning session */ GWPROTOCOL func; /**< The functions for this descriptor */ diff --git a/server/include/server.h b/server/include/server.h index 399a2536e..a838053da 100644 --- a/server/include/server.h +++ b/server/include/server.h @@ -192,6 +192,6 @@ extern void serverAddParameter(SERVER *, char *, char *); extern char *serverGetParameter(SERVER *, char *); extern void server_update(SERVER *, char *, char *, 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(); #endif