mirror of
https://github.com/MariaDB/server.git
synced 2025-01-17 20:42:30 +01:00
Automatic merge
This commit is contained in:
commit
2c40fb5689
9 changed files with 82 additions and 79 deletions
|
@ -70,52 +70,34 @@ Success
|
|||
TRUNCATE TABLE performance_schema.events_waits_history_long;
|
||||
TRUNCATE TABLE performance_schema.events_waits_history;
|
||||
TRUNCATE TABLE performance_schema.events_waits_current;
|
||||
SELECT * FROM t1 WHERE id = 1;
|
||||
id b
|
||||
1 initial value
|
||||
show variables like "%not_found%";
|
||||
Variable_name Value
|
||||
SET @before_count = (SELECT SUM(TIMER_WAIT)
|
||||
FROM performance_schema.events_waits_history_long
|
||||
WHERE (EVENT_NAME = 'wait/synch/rwlock/sql/LOCK_grant'));
|
||||
SELECT * FROM t1;
|
||||
id b
|
||||
1 initial value
|
||||
2 initial value
|
||||
3 initial value
|
||||
4 initial value
|
||||
5 initial value
|
||||
6 initial value
|
||||
7 initial value
|
||||
8 initial value
|
||||
WHERE (EVENT_NAME = 'wait/synch/rwlock/sql/LOCK_system_variables_hash'));
|
||||
show variables like "%not_found%";
|
||||
Variable_name Value
|
||||
SET @after_count = (SELECT SUM(TIMER_WAIT)
|
||||
FROM performance_schema.events_waits_history_long
|
||||
WHERE (EVENT_NAME = 'wait/synch/rwlock/sql/LOCK_grant'));
|
||||
WHERE (EVENT_NAME = 'wait/synch/rwlock/sql/LOCK_system_variables_hash'));
|
||||
SELECT IF((@after_count - @before_count) > 0, 'Success', 'Failure') test_fm1_rw_timed;
|
||||
test_fm1_rw_timed
|
||||
Success
|
||||
UPDATE performance_schema.setup_instruments SET enabled = 'NO'
|
||||
WHERE NAME = 'wait/synch/rwlock/sql/LOCK_grant';
|
||||
WHERE NAME = 'wait/synch/rwlock/sql/LOCK_system_variables_hash';
|
||||
TRUNCATE TABLE performance_schema.events_waits_history_long;
|
||||
TRUNCATE TABLE performance_schema.events_waits_history;
|
||||
TRUNCATE TABLE performance_schema.events_waits_current;
|
||||
SELECT * FROM t1 WHERE id = 1;
|
||||
id b
|
||||
1 initial value
|
||||
show variables like "%not_found%";
|
||||
Variable_name Value
|
||||
SET @before_count = (SELECT SUM(TIMER_WAIT)
|
||||
FROM performance_schema.events_waits_history_long
|
||||
WHERE (EVENT_NAME = 'wait/synch/rwlock/sql/LOCK_grant'));
|
||||
SELECT * FROM t1;
|
||||
id b
|
||||
1 initial value
|
||||
2 initial value
|
||||
3 initial value
|
||||
4 initial value
|
||||
5 initial value
|
||||
6 initial value
|
||||
7 initial value
|
||||
8 initial value
|
||||
WHERE (EVENT_NAME = 'wait/synch/rwlock/sql/LOCK_system_variables_hash'));
|
||||
show variables like "%not_found%";
|
||||
Variable_name Value
|
||||
SET @after_count = (SELECT SUM(TIMER_WAIT)
|
||||
FROM performance_schema.events_waits_history_long
|
||||
WHERE (EVENT_NAME = 'wait/synch/rwlock/sql/LOCK_grant'));
|
||||
WHERE (EVENT_NAME = 'LOCK_system_variables_hash'));
|
||||
SELECT IF((COALESCE(@after_count, 0) - COALESCE(@before_count, 0)) = 0, 'Success', 'Failure') test_fm2_rw_timed;
|
||||
test_fm2_rw_timed
|
||||
Success
|
||||
|
|
|
@ -87,38 +87,38 @@ TRUNCATE TABLE performance_schema.events_waits_history_long;
|
|||
TRUNCATE TABLE performance_schema.events_waits_history;
|
||||
TRUNCATE TABLE performance_schema.events_waits_current;
|
||||
|
||||
SELECT * FROM t1 WHERE id = 1;
|
||||
show variables like "%not_found%";
|
||||
|
||||
SET @before_count = (SELECT SUM(TIMER_WAIT)
|
||||
FROM performance_schema.events_waits_history_long
|
||||
WHERE (EVENT_NAME = 'wait/synch/rwlock/sql/LOCK_grant'));
|
||||
WHERE (EVENT_NAME = 'wait/synch/rwlock/sql/LOCK_system_variables_hash'));
|
||||
|
||||
SELECT * FROM t1;
|
||||
show variables like "%not_found%";
|
||||
|
||||
SET @after_count = (SELECT SUM(TIMER_WAIT)
|
||||
FROM performance_schema.events_waits_history_long
|
||||
WHERE (EVENT_NAME = 'wait/synch/rwlock/sql/LOCK_grant'));
|
||||
WHERE (EVENT_NAME = 'wait/synch/rwlock/sql/LOCK_system_variables_hash'));
|
||||
|
||||
SELECT IF((@after_count - @before_count) > 0, 'Success', 'Failure') test_fm1_rw_timed;
|
||||
|
||||
UPDATE performance_schema.setup_instruments SET enabled = 'NO'
|
||||
WHERE NAME = 'wait/synch/rwlock/sql/LOCK_grant';
|
||||
WHERE NAME = 'wait/synch/rwlock/sql/LOCK_system_variables_hash';
|
||||
|
||||
TRUNCATE TABLE performance_schema.events_waits_history_long;
|
||||
TRUNCATE TABLE performance_schema.events_waits_history;
|
||||
TRUNCATE TABLE performance_schema.events_waits_current;
|
||||
|
||||
SELECT * FROM t1 WHERE id = 1;
|
||||
show variables like "%not_found%";
|
||||
|
||||
SET @before_count = (SELECT SUM(TIMER_WAIT)
|
||||
FROM performance_schema.events_waits_history_long
|
||||
WHERE (EVENT_NAME = 'wait/synch/rwlock/sql/LOCK_grant'));
|
||||
WHERE (EVENT_NAME = 'wait/synch/rwlock/sql/LOCK_system_variables_hash'));
|
||||
|
||||
SELECT * FROM t1;
|
||||
show variables like "%not_found%";
|
||||
|
||||
SET @after_count = (SELECT SUM(TIMER_WAIT)
|
||||
FROM performance_schema.events_waits_history_long
|
||||
WHERE (EVENT_NAME = 'wait/synch/rwlock/sql/LOCK_grant'));
|
||||
WHERE (EVENT_NAME = 'LOCK_system_variables_hash'));
|
||||
|
||||
SELECT IF((COALESCE(@after_count, 0) - COALESCE(@before_count, 0)) = 0, 'Success', 'Failure') test_fm2_rw_timed;
|
||||
|
||||
|
|
|
@ -87,13 +87,17 @@ my_bool my_gethwaddr(uchar *to)
|
|||
int fd, res= 1;
|
||||
struct ifreq ifr[32];
|
||||
struct ifconf ifc;
|
||||
DBUG_ENTER("my_gethwaddr");
|
||||
|
||||
ifc.ifc_req= ifr;
|
||||
ifc.ifc_len= sizeof(ifr);
|
||||
|
||||
fd = socket(AF_INET, SOCK_DGRAM, 0);
|
||||
if (fd < 0)
|
||||
{
|
||||
DBUG_PRINT("error", ("socket() call failed with %d", errno));
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (ioctl(fd, SIOCGIFCONF, (char*)&ifc) >= 0)
|
||||
{
|
||||
|
@ -106,8 +110,8 @@ my_bool my_gethwaddr(uchar *to)
|
|||
ETHER_ADDR_LEN);
|
||||
#else
|
||||
/*
|
||||
A bug in OpenSolaris used to prevent non-root from getting a mac address:
|
||||
{no url. Oracle killed the old OpenSolaris bug database}
|
||||
A bug in OpenSolaris used to prevent non-root from getting a mac
|
||||
address: {no url. Oracle killed the old OpenSolaris bug database}
|
||||
|
||||
Thus, we'll use an alternative method and extract the address from the
|
||||
arp table.
|
||||
|
@ -124,7 +128,7 @@ my_bool my_gethwaddr(uchar *to)
|
|||
|
||||
close(fd);
|
||||
err:
|
||||
return res;
|
||||
DBUG_RETURN(res);
|
||||
}
|
||||
|
||||
#elif defined(_WIN32)
|
||||
|
|
|
@ -2529,7 +2529,7 @@ void unlink_thd(THD *thd)
|
|||
cache_thread()
|
||||
|
||||
NOTES
|
||||
LOCK_thread_cache has to be locked
|
||||
LOCK_thread_cache is used to protect the cache variables
|
||||
|
||||
RETURN
|
||||
0 Thread was not put in cache
|
||||
|
@ -2542,7 +2542,7 @@ static bool cache_thread()
|
|||
{
|
||||
DBUG_ENTER("cache_thread");
|
||||
|
||||
mysql_mutex_assert_owner(&LOCK_thread_cache);
|
||||
mysql_mutex_lock(&LOCK_thread_cache);
|
||||
if (cached_thread_count < thread_cache_size &&
|
||||
! abort_loop && !kill_cached_threads)
|
||||
{
|
||||
|
@ -2569,6 +2569,8 @@ static bool cache_thread()
|
|||
THD *thd;
|
||||
wake_thread--;
|
||||
thd= thread_cache.get();
|
||||
mysql_mutex_unlock(&LOCK_thread_cache);
|
||||
|
||||
thd->thread_stack= (char*) &thd; // For store_globals
|
||||
(void) thd->store_globals();
|
||||
|
||||
|
@ -2594,10 +2596,15 @@ static bool cache_thread()
|
|||
thd->mysys_var->abort= 0;
|
||||
thd->thr_create_utime= microsecond_interval_timer();
|
||||
thd->start_utime= thd->thr_create_utime;
|
||||
|
||||
/* Link thd into list of all active threads (THD's) */
|
||||
mysql_mutex_lock(&LOCK_thread_count);
|
||||
threads.append(thd);
|
||||
mysql_mutex_unlock(&LOCK_thread_count);
|
||||
DBUG_RETURN(1);
|
||||
}
|
||||
}
|
||||
mysql_mutex_unlock(&LOCK_thread_cache);
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
|
||||
|
@ -2627,14 +2634,8 @@ bool one_thread_per_connection_end(THD *thd, bool put_in_cache)
|
|||
unlink_thd(thd);
|
||||
/* Mark that current_thd is not valid anymore */
|
||||
set_current_thd(0);
|
||||
if (put_in_cache)
|
||||
{
|
||||
mysql_mutex_lock(&LOCK_thread_cache);
|
||||
put_in_cache= cache_thread();
|
||||
mysql_mutex_unlock(&LOCK_thread_cache);
|
||||
if (put_in_cache)
|
||||
DBUG_RETURN(0); // Thread is reused
|
||||
}
|
||||
if (put_in_cache && cache_thread())
|
||||
DBUG_RETURN(0); // Thread is reused
|
||||
|
||||
/*
|
||||
It's safe to check for thread_count outside of the mutex
|
||||
|
|
|
@ -450,7 +450,7 @@ inline query_id_t next_query_id()
|
|||
my_atomic_rwlock_wrlock(&global_query_id_lock);
|
||||
id= my_atomic_add64(&global_query_id, 1);
|
||||
my_atomic_rwlock_wrunlock(&global_query_id_lock);
|
||||
return (id+1);
|
||||
return (id);
|
||||
}
|
||||
|
||||
inline query_id_t get_query_id()
|
||||
|
|
|
@ -4530,12 +4530,16 @@ end:
|
|||
@see check_access
|
||||
@see check_table_access
|
||||
|
||||
@note This functions assumes that either number of tables to be inspected
|
||||
@note
|
||||
This functions assumes that either number of tables to be inspected
|
||||
by it is limited explicitly (i.e. is is not UINT_MAX) or table list
|
||||
used and thd->lex->query_tables_own_last value correspond to each
|
||||
other (the latter should be either 0 or point to next_global member
|
||||
of one of elements of this table list).
|
||||
|
||||
We delay locking of LOCK_grant until we really need it as we assume that
|
||||
most privileges be resolved with user or db level accesses.
|
||||
|
||||
@return Access status
|
||||
@retval FALSE Access granted; But column privileges might need to be
|
||||
checked.
|
||||
|
@ -4552,6 +4556,8 @@ bool check_grant(THD *thd, ulong want_access, TABLE_LIST *tables,
|
|||
Security_context *sctx= thd->security_ctx;
|
||||
uint i;
|
||||
ulong orig_want_access= want_access;
|
||||
my_bool locked= 0;
|
||||
GRANT_TABLE *grant_table;
|
||||
DBUG_ENTER("check_grant");
|
||||
DBUG_ASSERT(number > 0);
|
||||
|
||||
|
@ -4575,11 +4581,9 @@ bool check_grant(THD *thd, ulong want_access, TABLE_LIST *tables,
|
|||
*/
|
||||
tl->grant.orig_want_privilege= (want_access & ~SHOW_VIEW_ACL);
|
||||
}
|
||||
number= i;
|
||||
|
||||
mysql_rwlock_rdlock(&LOCK_grant);
|
||||
for (tl= tables;
|
||||
tl && number-- && tl != first_not_own_table;
|
||||
tl= tl->next_global)
|
||||
for (tl= tables; number-- ; tl= tl->next_global)
|
||||
{
|
||||
sctx = test(tl->security_ctx) ? tl->security_ctx : thd->security_ctx;
|
||||
|
||||
|
@ -4632,13 +4636,18 @@ bool check_grant(THD *thd, ulong want_access, TABLE_LIST *tables,
|
|||
}
|
||||
continue;
|
||||
}
|
||||
GRANT_TABLE *grant_table= table_hash_search(sctx->host, sctx->ip,
|
||||
tl->get_db_name(),
|
||||
sctx->priv_user,
|
||||
tl->get_table_name(),
|
||||
FALSE);
|
||||
|
||||
if (!grant_table)
|
||||
if (!locked)
|
||||
{
|
||||
locked= 1;
|
||||
mysql_rwlock_rdlock(&LOCK_grant);
|
||||
}
|
||||
|
||||
if (!(grant_table= table_hash_search(sctx->host, sctx->ip,
|
||||
tl->get_db_name(),
|
||||
sctx->priv_user,
|
||||
tl->get_table_name(),
|
||||
FALSE)))
|
||||
{
|
||||
want_access &= ~tl->grant.privilege;
|
||||
goto err; // No grants
|
||||
|
@ -4665,11 +4674,13 @@ bool check_grant(THD *thd, ulong want_access, TABLE_LIST *tables,
|
|||
goto err; // impossible
|
||||
}
|
||||
}
|
||||
mysql_rwlock_unlock(&LOCK_grant);
|
||||
if (locked)
|
||||
mysql_rwlock_unlock(&LOCK_grant);
|
||||
DBUG_RETURN(FALSE);
|
||||
|
||||
err:
|
||||
mysql_rwlock_unlock(&LOCK_grant);
|
||||
if (locked)
|
||||
mysql_rwlock_unlock(&LOCK_grant);
|
||||
if (!no_errors) // Not a silent skip of table
|
||||
{
|
||||
char command[128];
|
||||
|
|
|
@ -4326,17 +4326,8 @@ void THD::set_query_and_id(char *query_arg, uint32 query_length_arg,
|
|||
{
|
||||
mysql_mutex_lock(&LOCK_thd_data);
|
||||
set_query_inner(query_arg, query_length_arg, cs);
|
||||
query_id= new_query_id;
|
||||
mysql_mutex_unlock(&LOCK_thd_data);
|
||||
}
|
||||
|
||||
/** Assign a new value to thd->query_id. */
|
||||
|
||||
void THD::set_query_id(query_id_t new_query_id)
|
||||
{
|
||||
mysql_mutex_lock(&LOCK_thd_data);
|
||||
query_id= new_query_id;
|
||||
mysql_mutex_unlock(&LOCK_thd_data);
|
||||
}
|
||||
|
||||
/** Assign a new value to thd->mysys_var. */
|
||||
|
|
|
@ -3076,7 +3076,10 @@ public:
|
|||
{ set_query(CSET_STRING()); }
|
||||
void set_query_and_id(char *query_arg, uint32 query_length_arg,
|
||||
CHARSET_INFO *cs, query_id_t new_query_id);
|
||||
void set_query_id(query_id_t new_query_id);
|
||||
void set_query_id(query_id_t new_query_id)
|
||||
{
|
||||
query_id= new_query_id;
|
||||
}
|
||||
void set_open_tables(TABLE *open_tables_arg)
|
||||
{
|
||||
mysql_mutex_lock(&LOCK_thd_data);
|
||||
|
|
|
@ -931,9 +931,16 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
|
|||
thd->query_plan_flags= QPLAN_INIT;
|
||||
thd->lex->sql_command= SQLCOM_END; /* to avoid confusing VIEW detectors */
|
||||
thd->set_time();
|
||||
thd->set_query_id(get_query_id());
|
||||
if (!(server_command_flags[command] & CF_SKIP_QUERY_ID))
|
||||
next_query_id();
|
||||
thd->set_query_id(next_query_id());
|
||||
else
|
||||
{
|
||||
/*
|
||||
ping, get statistics or similar stateless command.
|
||||
No reason to increase query id here.
|
||||
*/
|
||||
thd->set_query_id(get_query_id());
|
||||
}
|
||||
inc_thread_running();
|
||||
|
||||
if (!(server_command_flags[command] & CF_SKIP_QUESTIONS))
|
||||
|
@ -5022,6 +5029,10 @@ check_access(THD *thd, ulong want_access, const char *db, ulong *save_priv,
|
|||
|
||||
if ((db != NULL) && (db != any_db))
|
||||
{
|
||||
/*
|
||||
Check if this is reserved database, like information schema or
|
||||
performance schema
|
||||
*/
|
||||
const ACL_internal_schema_access *access;
|
||||
access= get_cached_schema_access(grant_internal_info, db);
|
||||
if (access)
|
||||
|
|
Loading…
Reference in a new issue