Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
M
MariaDB
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
nexedi
MariaDB
Commits
2c40fb56
Commit
2c40fb56
authored
Mar 25, 2013
by
Michael Widenius
Browse files
Options
Browse Files
Download
Plain Diff
Automatic merge
parents
615d51b6
d8986fd6
Changes
9
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
82 additions
and
79 deletions
+82
-79
mysql-test/suite/perfschema/r/func_mutex.result
mysql-test/suite/perfschema/r/func_mutex.result
+13
-31
mysql-test/suite/perfschema/t/func_mutex.test
mysql-test/suite/perfschema/t/func_mutex.test
+9
-9
mysys/my_gethwaddr.c
mysys/my_gethwaddr.c
+7
-3
sql/mysqld.cc
sql/mysqld.cc
+11
-10
sql/mysqld.h
sql/mysqld.h
+1
-1
sql/sql_acl.cc
sql/sql_acl.cc
+24
-13
sql/sql_class.cc
sql/sql_class.cc
+0
-9
sql/sql_class.h
sql/sql_class.h
+4
-1
sql/sql_parse.cc
sql/sql_parse.cc
+13
-2
No files found.
mysql-test/suite/perfschema/r/func_mutex.result
View file @
2c40fb56
...
...
@@ -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
...
...
mysql-test/suite/perfschema/t/func_mutex.test
View file @
2c40fb56
...
...
@@ -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
;
...
...
mysys/my_gethwaddr.c
View file @
2c40fb56
...
...
@@ -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)
...
...
sql/mysqld.cc
View file @
2c40fb56
...
...
@@ -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
...
...
sql/mysqld.h
View file @
2c40fb56
...
...
@@ -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
()
...
...
sql/sql_acl.cc
View file @
2c40fb56
...
...
@@ -4530,12 +4530,16 @@ my_bool grant_reload(THD *thd)
@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
];
...
...
sql/sql_class.cc
View file @
2c40fb56
...
...
@@ -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. */
...
...
sql/sql_class.h
View file @
2c40fb56
...
...
@@ -3076,7 +3076,10 @@ class THD :public Statement,
{
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
);
...
...
sql/sql_parse.cc
View file @
2c40fb56
...
...
@@ -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
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment