mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 20:12:31 +01:00
b2c3acc987
Analysis: ------------- If server is started with limit of MAX_CONNECTIONS and MAX_USER_CONNECTIONS then only MAX_USER_CONNECTIONS of any particular users can be connected to server and total MAX_CONNECTIONS of client can be connected to server. Server maintains a counter for total CONNECTIONS and total CONNECTIONS from particular user. Here, MAX_CONNECTIONS of connections are created to server. Out of this MAX_CONNECTIONS, connections from particular user (say USER1) are also created. The connections from USER1 is lesser than MAX_USER_CONNECTIONS. After that there was one more connection request from USER1. Since USER1 can still create connections as he havent reached MAX_USER_CONNECTIONS, server increments counter of CONNECTIONS per user. As server already has MAX_CONNECTIONS of connections, next check to total CONNECTION count fails. In this case control is returned WITHOUT decrementing the CONNECTIONS per user. So the counter per user CONNECTIONS goes on incrementing for each attempt until current connections are closed. And because of this counter per CONNECTIONS reached MAX_USER_CONNECTIONS. So, next connections form USER1 user always returns with MAX_USER_CONNECTION limit error, even when total connection to sever are less than MAX_CONNECTIONS. Fix: ------------- This issue is occurred because of not handling counters properly in the server. Changed the code to handle per user connection counters properly.
73 lines
2.7 KiB
C++
73 lines
2.7 KiB
C++
/* Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; version 2 of the License.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
|
|
|
|
#ifndef SQL_CONNECT_INCLUDED
|
|
#define SQL_CONNECT_INCLUDED
|
|
|
|
#include "my_sys.h" /* pthread_handler_t */
|
|
#include "mysql_com.h" /* enum_server_command */
|
|
#include "structs.h"
|
|
#include <hash.h>
|
|
|
|
class THD;
|
|
typedef struct st_lex_user LEX_USER;
|
|
typedef struct user_conn USER_CONN;
|
|
|
|
void init_max_user_conn(void);
|
|
void init_global_user_stats(void);
|
|
void init_global_table_stats(void);
|
|
void init_global_index_stats(void);
|
|
void init_global_client_stats(void);
|
|
void free_max_user_conn(void);
|
|
void free_global_user_stats(void);
|
|
void free_global_table_stats(void);
|
|
void free_global_index_stats(void);
|
|
void free_global_client_stats(void);
|
|
|
|
pthread_handler_t handle_one_connection(void *arg);
|
|
void do_handle_one_connection(THD *thd_arg);
|
|
bool init_new_connection_handler_thread();
|
|
void reset_mqh(LEX_USER *lu, bool get_them);
|
|
bool check_mqh(THD *thd, uint check_command);
|
|
void time_out_user_resource_limits(THD *thd, USER_CONN *uc);
|
|
#ifndef NO_EMBEDDED_ACCESS_CHECKS
|
|
void decrease_user_connections(USER_CONN *uc);
|
|
#else
|
|
#define decrease_user_connections(X) do { } while(0) /* nothing */
|
|
#endif
|
|
bool thd_init_client_charset(THD *thd, uint cs_number);
|
|
bool setup_connection_thread_globals(THD *thd);
|
|
bool thd_prepare_connection(THD *thd);
|
|
bool thd_is_connection_alive(THD *thd);
|
|
|
|
bool login_connection(THD *thd);
|
|
void prepare_new_connection_state(THD* thd);
|
|
void end_connection(THD *thd);
|
|
void update_global_user_stats(THD* thd, bool create_user, time_t now);
|
|
int get_or_create_user_conn(THD *thd, const char *user,
|
|
const char *host, const USER_RESOURCES *mqh);
|
|
int check_for_max_user_connections(THD *thd, USER_CONN *uc);
|
|
|
|
extern HASH global_user_stats;
|
|
extern HASH global_client_stats;
|
|
extern HASH global_table_stats;
|
|
extern HASH global_index_stats;
|
|
|
|
extern mysql_mutex_t LOCK_global_user_client_stats;
|
|
extern mysql_mutex_t LOCK_global_table_stats;
|
|
extern mysql_mutex_t LOCK_global_index_stats;
|
|
extern mysql_mutex_t LOCK_stats;
|
|
|
|
#endif /* SQL_CONNECT_INCLUDED */
|