From e3bed424ea881d4254602561de32b6e431723bec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20M=C3=A4kel=C3=A4?= Date: Mon, 6 Feb 2017 23:03:57 +0200 Subject: [PATCH] MXS-1123: Fix connection_timeout causing constant disconnections In a configuration with multiple services, one with connection_timeout and others without it, the connections to non-connection_timeout services would get immediately closed due to integer overflow. --- server/core/session.c | 4 +++- server/include/service.h | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/server/core/session.c b/server/core/session.c index be290256d..e6b98c975 100644 --- a/server/core/session.c +++ b/server/core/session.c @@ -1025,7 +1025,9 @@ void process_idle_sessions() while (all_session) { if (all_session->ses_is_in_use && - all_session->service && all_session->client_dcb && all_session->client_dcb->state == DCB_STATE_POLLING && + all_session->service && all_session->client_dcb && + all_session->client_dcb->state == DCB_STATE_POLLING && + all_session->service->conn_idle_timeout && hkheartbeat - all_session->client_dcb->last_read > all_session->service->conn_idle_timeout * 10) { dcb_close(all_session->client_dcb); diff --git a/server/include/service.h b/server/include/service.h index 144de3a29..c7e9c22d1 100644 --- a/server/include/service.h +++ b/server/include/service.h @@ -100,7 +100,7 @@ typedef struct server_ref_t #define SERVICE_MAX_RETRY_INTERVAL 3600 /*< The maximum interval between service start retries */ /** Value of service timeout if timeout checks are disabled */ -#define SERVICE_NO_SESSION_TIMEOUT LONG_MAX +#define SERVICE_NO_SESSION_TIMEOUT 0 /** * Parameters that are automatically detected but can also be configured by the @@ -149,7 +149,7 @@ typedef struct service SERVICE_REFRESH_RATE rate_limit; /**< The refresh rate limit for users table */ FILTER_DEF **filters; /**< Ordered list of filters */ int n_filters; /**< Number of filters */ - long conn_idle_timeout; /**< Session timeout in seconds */ + uint64_t conn_idle_timeout; /**< Session timeout in seconds */ char *weightby; struct service *next; /**< The next service in the linked list */ bool retry_start; /*< If starting of the service should be retried later */