mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
Fix for bug #7637: "Test failure: 'user_limits' on QNX and 64-bit systems"
Made user_limits.test scheduling independant (this solves failure on QNX). Made sys_var_max_user_conn variable int sized. Changed max_user_connections from ulong to uint to be able to use it in sys_var_max_user_conn::value_ptr() (solves failures on 64-bit platforms). mysql-test/r/user_limits.result: Made test scheduling independant. mysql-test/t/user_limits.test: Made test scheduling independant. sql/mysql_priv.h: Made max_user_connections to be the same size as USER_RESOURCES::user_conn (to be able to use them in sys_var_max_user_conn::value_ptr()). sql/mysqld.cc: Made max_user_connections to be the same size as USER_RESOURCES::user_conn (to be able to use them in sys_var_max_user_conn::value_ptr()). sql/set_var.cc: sys_var::item(): Added support for int system variables. sql/set_var.h: Made sys_var_max_user_conn to be int sized variable.
This commit is contained in:
@ -6,6 +6,7 @@ delete from mysql.tables_priv where user like 'mysqltest\_%';
|
|||||||
delete from mysql.columns_priv where user like 'mysqltest\_%';
|
delete from mysql.columns_priv where user like 'mysqltest\_%';
|
||||||
flush privileges;
|
flush privileges;
|
||||||
grant usage on *.* to mysqltest_1@localhost with max_queries_per_hour 2;
|
grant usage on *.* to mysqltest_1@localhost with max_queries_per_hour 2;
|
||||||
|
flush user_resources;
|
||||||
select * from t1;
|
select * from t1;
|
||||||
i
|
i
|
||||||
select * from t1;
|
select * from t1;
|
||||||
@ -16,6 +17,7 @@ select * from t1;
|
|||||||
ERROR 42000: User 'mysqltest_1' has exceeded the 'max_questions' resource (current value: 2)
|
ERROR 42000: User 'mysqltest_1' has exceeded the 'max_questions' resource (current value: 2)
|
||||||
drop user mysqltest_1@localhost;
|
drop user mysqltest_1@localhost;
|
||||||
grant usage on *.* to mysqltest_1@localhost with max_updates_per_hour 2;
|
grant usage on *.* to mysqltest_1@localhost with max_updates_per_hour 2;
|
||||||
|
flush user_resources;
|
||||||
select * from t1;
|
select * from t1;
|
||||||
i
|
i
|
||||||
select * from t1;
|
select * from t1;
|
||||||
@ -34,6 +36,7 @@ select * from t1;
|
|||||||
i
|
i
|
||||||
drop user mysqltest_1@localhost;
|
drop user mysqltest_1@localhost;
|
||||||
grant usage on *.* to mysqltest_1@localhost with max_connections_per_hour 2;
|
grant usage on *.* to mysqltest_1@localhost with max_connections_per_hour 2;
|
||||||
|
flush user_resources;
|
||||||
select * from t1;
|
select * from t1;
|
||||||
i
|
i
|
||||||
select * from t1;
|
select * from t1;
|
||||||
@ -47,6 +50,7 @@ ERROR 42000: User 'mysqltest_1' has exceeded the 'max_connections' resource (cur
|
|||||||
drop user mysqltest_1@localhost;
|
drop user mysqltest_1@localhost;
|
||||||
flush privileges;
|
flush privileges;
|
||||||
grant usage on *.* to mysqltest_1@localhost with max_user_connections 2;
|
grant usage on *.* to mysqltest_1@localhost with max_user_connections 2;
|
||||||
|
flush user_resources;
|
||||||
select * from t1;
|
select * from t1;
|
||||||
i
|
i
|
||||||
select * from t1;
|
select * from t1;
|
||||||
@ -56,6 +60,7 @@ ERROR 42000: User 'mysqltest_1' has exceeded the 'max_user_connections' resource
|
|||||||
select * from t1;
|
select * from t1;
|
||||||
i
|
i
|
||||||
grant usage on *.* to mysqltest_1@localhost with max_user_connections 3;
|
grant usage on *.* to mysqltest_1@localhost with max_user_connections 3;
|
||||||
|
flush user_resources;
|
||||||
select * from t1;
|
select * from t1;
|
||||||
i
|
i
|
||||||
connect(localhost,mysqltest_1,,test,MYSQL_PORT,MYSQL_SOCK);
|
connect(localhost,mysqltest_1,,test,MYSQL_PORT,MYSQL_SOCK);
|
||||||
@ -71,6 +76,7 @@ select @@session.max_user_connections, @@global.max_user_connections;
|
|||||||
@@session.max_user_connections @@global.max_user_connections
|
@@session.max_user_connections @@global.max_user_connections
|
||||||
2 2
|
2 2
|
||||||
grant usage on *.* to mysqltest_1@localhost;
|
grant usage on *.* to mysqltest_1@localhost;
|
||||||
|
flush user_resources;
|
||||||
select @@session.max_user_connections, @@global.max_user_connections;
|
select @@session.max_user_connections, @@global.max_user_connections;
|
||||||
@@session.max_user_connections @@global.max_user_connections
|
@@session.max_user_connections @@global.max_user_connections
|
||||||
2 2
|
2 2
|
||||||
@ -79,6 +85,7 @@ i
|
|||||||
connect(localhost,mysqltest_1,,test,MYSQL_PORT,MYSQL_SOCK);
|
connect(localhost,mysqltest_1,,test,MYSQL_PORT,MYSQL_SOCK);
|
||||||
ERROR 42000: User mysqltest_1 already has more than 'max_user_connections' active connections
|
ERROR 42000: User mysqltest_1 already has more than 'max_user_connections' active connections
|
||||||
grant usage on *.* to mysqltest_1@localhost with max_user_connections 3;
|
grant usage on *.* to mysqltest_1@localhost with max_user_connections 3;
|
||||||
|
flush user_resources;
|
||||||
select @@session.max_user_connections, @@global.max_user_connections;
|
select @@session.max_user_connections, @@global.max_user_connections;
|
||||||
@@session.max_user_connections @@global.max_user_connections
|
@@session.max_user_connections @@global.max_user_connections
|
||||||
3 2
|
3 2
|
||||||
|
@ -19,6 +19,8 @@ flush privileges;
|
|||||||
|
|
||||||
# Test of MAX_QUERIES_PER_HOUR limit
|
# Test of MAX_QUERIES_PER_HOUR limit
|
||||||
grant usage on *.* to mysqltest_1@localhost with max_queries_per_hour 2;
|
grant usage on *.* to mysqltest_1@localhost with max_queries_per_hour 2;
|
||||||
|
# This ensures that counters are reset and makes test scheduling independent
|
||||||
|
flush user_resources;
|
||||||
connect (mqph, localhost, mysqltest_1,,);
|
connect (mqph, localhost, mysqltest_1,,);
|
||||||
connection mqph;
|
connection mqph;
|
||||||
select * from t1;
|
select * from t1;
|
||||||
@ -37,6 +39,7 @@ disconnect mqph2;
|
|||||||
|
|
||||||
# Test of MAX_UPDATES_PER_HOUR limit
|
# Test of MAX_UPDATES_PER_HOUR limit
|
||||||
grant usage on *.* to mysqltest_1@localhost with max_updates_per_hour 2;
|
grant usage on *.* to mysqltest_1@localhost with max_updates_per_hour 2;
|
||||||
|
flush user_resources;
|
||||||
connect (muph, localhost, mysqltest_1,,);
|
connect (muph, localhost, mysqltest_1,,);
|
||||||
connection muph;
|
connection muph;
|
||||||
select * from t1;
|
select * from t1;
|
||||||
@ -60,6 +63,7 @@ disconnect muph2;
|
|||||||
|
|
||||||
# Test of MAX_CONNECTIONS_PER_HOUR limit
|
# Test of MAX_CONNECTIONS_PER_HOUR limit
|
||||||
grant usage on *.* to mysqltest_1@localhost with max_connections_per_hour 2;
|
grant usage on *.* to mysqltest_1@localhost with max_connections_per_hour 2;
|
||||||
|
flush user_resources;
|
||||||
connect (mcph1, localhost, mysqltest_1,,);
|
connect (mcph1, localhost, mysqltest_1,,);
|
||||||
connection mcph1;
|
connection mcph1;
|
||||||
select * from t1;
|
select * from t1;
|
||||||
@ -86,6 +90,7 @@ drop user mysqltest_1@localhost;
|
|||||||
# We need this to reset internal mqh_used variable
|
# We need this to reset internal mqh_used variable
|
||||||
flush privileges;
|
flush privileges;
|
||||||
grant usage on *.* to mysqltest_1@localhost with max_user_connections 2;
|
grant usage on *.* to mysqltest_1@localhost with max_user_connections 2;
|
||||||
|
flush user_resources;
|
||||||
connect (muc1, localhost, mysqltest_1,,);
|
connect (muc1, localhost, mysqltest_1,,);
|
||||||
connection muc1;
|
connection muc1;
|
||||||
select * from t1;
|
select * from t1;
|
||||||
@ -102,6 +107,7 @@ select * from t1;
|
|||||||
# Changing of limit should also help (and immediately)
|
# Changing of limit should also help (and immediately)
|
||||||
connection default;
|
connection default;
|
||||||
grant usage on *.* to mysqltest_1@localhost with max_user_connections 3;
|
grant usage on *.* to mysqltest_1@localhost with max_user_connections 3;
|
||||||
|
flush user_resources;
|
||||||
connect (muc4, localhost, mysqltest_1,,);
|
connect (muc4, localhost, mysqltest_1,,);
|
||||||
connection muc4;
|
connection muc4;
|
||||||
select * from t1;
|
select * from t1;
|
||||||
@ -127,6 +133,7 @@ set global max_user_connections= 2;
|
|||||||
select @@session.max_user_connections, @@global.max_user_connections;
|
select @@session.max_user_connections, @@global.max_user_connections;
|
||||||
# Let us check that global limit works
|
# Let us check that global limit works
|
||||||
grant usage on *.* to mysqltest_1@localhost;
|
grant usage on *.* to mysqltest_1@localhost;
|
||||||
|
flush user_resources;
|
||||||
connect (muca1, localhost, mysqltest_1,,);
|
connect (muca1, localhost, mysqltest_1,,);
|
||||||
connection muca1;
|
connection muca1;
|
||||||
select @@session.max_user_connections, @@global.max_user_connections;
|
select @@session.max_user_connections, @@global.max_user_connections;
|
||||||
@ -139,6 +146,7 @@ connect (muca3, localhost, mysqltest_1,,);
|
|||||||
# Now we are testing that per-account limit prevails over gloabl limit
|
# Now we are testing that per-account limit prevails over gloabl limit
|
||||||
connection default;
|
connection default;
|
||||||
grant usage on *.* to mysqltest_1@localhost with max_user_connections 3;
|
grant usage on *.* to mysqltest_1@localhost with max_user_connections 3;
|
||||||
|
flush user_resources;
|
||||||
connect (muca3, localhost, mysqltest_1,,);
|
connect (muca3, localhost, mysqltest_1,,);
|
||||||
connection muca3;
|
connection muca3;
|
||||||
select @@session.max_user_connections, @@global.max_user_connections;
|
select @@session.max_user_connections, @@global.max_user_connections;
|
||||||
|
@ -1001,7 +1001,7 @@ extern ulong ha_read_count, ha_discover_count;
|
|||||||
extern ulong table_cache_size;
|
extern ulong table_cache_size;
|
||||||
extern ulong max_connections,max_connect_errors, connect_timeout;
|
extern ulong max_connections,max_connect_errors, connect_timeout;
|
||||||
extern ulong slave_net_timeout;
|
extern ulong slave_net_timeout;
|
||||||
extern ulong max_user_connections;
|
extern uint max_user_connections;
|
||||||
extern my_bool timed_mutexes;
|
extern my_bool timed_mutexes;
|
||||||
extern ulong what_to_log,flush_time;
|
extern ulong what_to_log,flush_time;
|
||||||
extern ulong query_buff_size, thread_stack,thread_stack_min;
|
extern ulong query_buff_size, thread_stack,thread_stack_min;
|
||||||
|
@ -333,7 +333,8 @@ ulong delayed_insert_errors,flush_time, thread_created;
|
|||||||
ulong specialflag=0;
|
ulong specialflag=0;
|
||||||
ulong binlog_cache_use= 0, binlog_cache_disk_use= 0;
|
ulong binlog_cache_use= 0, binlog_cache_disk_use= 0;
|
||||||
ulong max_connections,max_used_connections,
|
ulong max_connections,max_used_connections,
|
||||||
max_connect_errors, max_user_connections = 0;
|
max_connect_errors;
|
||||||
|
uint max_user_connections= 0;
|
||||||
ulong thread_id=1L,current_pid;
|
ulong thread_id=1L,current_pid;
|
||||||
my_bool timed_mutexes= 0;
|
my_bool timed_mutexes= 0;
|
||||||
ulong slow_launch_threads = 0, sync_binlog_period;
|
ulong slow_launch_threads = 0, sync_binlog_period;
|
||||||
@ -5246,8 +5247,8 @@ The minimum value for this variable is 4096.",
|
|||||||
REQUIRED_ARG, 32, 1, ~0L, 0, 1, 0},
|
REQUIRED_ARG, 32, 1, ~0L, 0, 1, 0},
|
||||||
{"max_user_connections", OPT_MAX_USER_CONNECTIONS,
|
{"max_user_connections", OPT_MAX_USER_CONNECTIONS,
|
||||||
"The maximum number of active connections for a single user (0 = no limit).",
|
"The maximum number of active connections for a single user (0 = no limit).",
|
||||||
(gptr*) &max_user_connections, (gptr*) &max_user_connections, 0, GET_ULONG,
|
(gptr*) &max_user_connections, (gptr*) &max_user_connections, 0, GET_UINT,
|
||||||
REQUIRED_ARG, 0, 1, ~0L, 0, 1, 0},
|
REQUIRED_ARG, 0, 1, ~0, 0, 1, 0},
|
||||||
{"max_write_lock_count", OPT_MAX_WRITE_LOCK_COUNT,
|
{"max_write_lock_count", OPT_MAX_WRITE_LOCK_COUNT,
|
||||||
"After this many write locks, allow some read locks to run in between.",
|
"After this many write locks, allow some read locks to run in between.",
|
||||||
(gptr*) &max_write_lock_count, (gptr*) &max_write_lock_count, 0, GET_ULONG,
|
(gptr*) &max_write_lock_count, (gptr*) &max_write_lock_count, 0, GET_ULONG,
|
||||||
|
@ -1599,6 +1599,14 @@ Item *sys_var::item(THD *thd, enum_var_type var_type, LEX_STRING *base)
|
|||||||
var_type= OPT_GLOBAL;
|
var_type= OPT_GLOBAL;
|
||||||
}
|
}
|
||||||
switch (type()) {
|
switch (type()) {
|
||||||
|
case SHOW_INT:
|
||||||
|
{
|
||||||
|
uint value;
|
||||||
|
pthread_mutex_lock(&LOCK_global_system_variables);
|
||||||
|
value= *(uint*) value_ptr(thd, var_type, base);
|
||||||
|
pthread_mutex_unlock(&LOCK_global_system_variables);
|
||||||
|
return new Item_uint((int32) value);
|
||||||
|
}
|
||||||
case SHOW_LONG:
|
case SHOW_LONG:
|
||||||
{
|
{
|
||||||
ulong value;
|
ulong value;
|
||||||
|
@ -740,7 +740,7 @@ public:
|
|||||||
return type != OPT_GLOBAL || !option_limits;
|
return type != OPT_GLOBAL || !option_limits;
|
||||||
}
|
}
|
||||||
void set_default(THD *thd, enum_var_type type);
|
void set_default(THD *thd, enum_var_type type);
|
||||||
SHOW_TYPE type() { return SHOW_LONG; }
|
SHOW_TYPE type() { return SHOW_INT; }
|
||||||
byte *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base);
|
byte *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user