diff --git a/include/maxscale/server.h b/include/maxscale/server.h index 0ecdac470..ad2c3b01a 100644 --- a/include/maxscale/server.h +++ b/include/maxscale/server.h @@ -283,7 +283,7 @@ extern void server_transfer_status(SERVER *dest_server, const SERVER *source_ser extern void server_add_mon_user(SERVER *server, const char *user, const char *passwd); extern const char *server_get_parameter(const SERVER *server, char *name); extern void server_update_credentials(SERVER *server, const char *user, const char *passwd); -extern DCB *server_get_persistent(SERVER *server, const char *user, const char *protocol, int id); +extern DCB* server_get_persistent(SERVER *server, const char *user, const char* ip, const char *protocol, int id); extern void server_update_address(SERVER *server, const char *address); extern void server_update_port(SERVER *server, unsigned short port); extern unsigned int server_map_status(const char *str); diff --git a/server/core/dcb.c b/server/core/dcb.c index 83737a300..8305ef223 100644 --- a/server/core/dcb.c +++ b/server/core/dcb.c @@ -617,7 +617,8 @@ dcb_connect(SERVER *server, MXS_SESSION *session, const char *protocol) { MXS_DEBUG("%lu [dcb_connect] Looking for persistent connection DCB " "user %s protocol %s\n", pthread_self(), user, protocol); - dcb = server_get_persistent(server, user, protocol, session->client_dcb->thread.id); + dcb = server_get_persistent(server, user, session->client_dcb->remote, + protocol, session->client_dcb->thread.id); if (dcb) { /** @@ -664,6 +665,11 @@ dcb_connect(SERVER *server, MXS_SESSION *session, const char *protocol) memcpy(&(dcb->func), funcs, sizeof(MXS_PROTOCOL)); dcb->protoname = MXS_STRDUP_A(protocol); + if (session->client_dcb->remote) + { + dcb->remote = MXS_STRDUP_A(session->client_dcb->remote); + } + const char *authenticator = server->authenticator ? server->authenticator : dcb->func.auth_default ? dcb->func.auth_default() : "NullAuthDeny"; diff --git a/server/core/server.c b/server/core/server.c index d6db003de..d31a7e8ea 100644 --- a/server/core/server.c +++ b/server/core/server.c @@ -205,12 +205,15 @@ server_free(SERVER *tofreeserver) /** * Get a DCB from the persistent connection pool, if possible * - * @param server The server to set the name on - * @param user The name of the user needing the connection - * @param protocol The name of the protocol needed for the connection + * @param server The server to set the name on + * @param user The name of the user needing the connection + * @param ip Client IP address + * @param protocol The name of the protocol needed for the connection + * @param id Thread ID + * + * @return A DCB or NULL if no connection is found */ -DCB * -server_get_persistent(SERVER *server, const char *user, const char *protocol, int id) +DCB* server_get_persistent(SERVER *server, const char *user, const char* ip, const char *protocol, int id) { DCB *dcb, *previous = NULL; @@ -224,9 +227,12 @@ server_get_persistent(SERVER *server, const char *user, const char *protocol, in { if (dcb->user && dcb->protoname + && dcb->remote + && ip && !dcb-> dcb_errhandle_called && !(dcb->flags & DCBF_HUNG) && 0 == strcmp(dcb->user, user) + && 0 == strcmp(dcb->remote, ip) && 0 == strcmp(dcb->protoname, protocol)) { if (NULL == previous)