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
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
mariadb
Commits
838fa0d6
Commit
838fa0d6
authored
Jun 11, 2008
by
Daniel Fischer
Browse files
Options
Browse Files
Download
Plain Diff
update from bk repository
parents
636e751f
b6791a4d
Changes
34
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
34 changed files
with
634 additions
and
329 deletions
+634
-329
acinclude.m4
acinclude.m4
+2
-2
client/mysql.cc
client/mysql.cc
+15
-4
client/mysqltest.c
client/mysqltest.c
+2
-2
configure.in
configure.in
+30
-20
innobase/buf/buf0buf.c
innobase/buf/buf0buf.c
+115
-56
innobase/buf/buf0flu.c
innobase/buf/buf0flu.c
+65
-27
innobase/buf/buf0lru.c
innobase/buf/buf0lru.c
+24
-1
innobase/include/buf0buf.h
innobase/include/buf0buf.h
+28
-12
innobase/include/buf0buf.ic
innobase/include/buf0buf.ic
+12
-7
innobase/include/sync0arr.h
innobase/include/sync0arr.h
+4
-9
innobase/include/sync0rw.h
innobase/include/sync0rw.h
+1
-0
innobase/include/sync0rw.ic
innobase/include/sync0rw.ic
+4
-2
innobase/include/sync0sync.h
innobase/include/sync0sync.h
+1
-0
innobase/os/os0sync.c
innobase/os/os0sync.c
+52
-3
innobase/sync/sync0arr.c
innobase/sync/sync0arr.c
+41
-78
innobase/sync/sync0rw.c
innobase/sync/sync0rw.c
+2
-0
innobase/sync/sync0sync.c
innobase/sync/sync0sync.c
+6
-2
libmysql/libmysql.c
libmysql/libmysql.c
+5
-8
libmysqld/lib_sql.cc
libmysqld/lib_sql.cc
+1
-1
mysql-test/mysql-test-run.pl
mysql-test/mysql-test-run.pl
+1
-0
mysql-test/r/symlink.result
mysql-test/r/symlink.result
+21
-17
mysql-test/t/symlink.test
mysql-test/t/symlink.test
+32
-19
mysys/mf_pack.c
mysys/mf_pack.c
+2
-2
ndb/src/common/util/SocketServer.cpp
ndb/src/common/util/SocketServer.cpp
+1
-1
scripts/make_binary_distribution.sh
scripts/make_binary_distribution.sh
+6
-4
sql/log.cc
sql/log.cc
+2
-2
sql/mysql_priv.h
sql/mysql_priv.h
+1
-0
sql/mysqld.cc
sql/mysqld.cc
+4
-0
sql/repl_failsafe.cc
sql/repl_failsafe.cc
+1
-1
sql/sql_parse.cc
sql/sql_parse.cc
+60
-1
sql/sql_show.cc
sql/sql_show.cc
+3
-2
sql/unireg.cc
sql/unireg.cc
+8
-0
strings/strmake.c
strings/strmake.c
+16
-14
support-files/mysql.spec.sh
support-files/mysql.spec.sh
+66
-32
No files found.
acinclude.m4
View file @
838fa0d6
...
...
@@ -1095,11 +1095,11 @@ AC_MSG_CHECKING(for OpenSSL)
AC_MSG_RESULT(no)
if test ! -z "$openssl_includes"
then
AC_MSG_ERROR(Can't have --with-openssl-includes without --with-openssl)
;
AC_MSG_ERROR(Can't have --with-openssl-includes without --with-openssl)
fi
if test ! -z "$openssl_libs"
then
AC_MSG_ERROR(Can't have --with-openssl-libs without --with-openssl)
;
AC_MSG_ERROR(Can't have --with-openssl-libs without --with-openssl)
fi
fi
AC_SUBST(openssl_libs)
...
...
client/mysql.cc
View file @
838fa0d6
/* Copyright (C) 2000-200
3
MySQL AB
/* Copyright (C) 2000-200
8
MySQL AB
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
...
...
@@ -729,7 +729,7 @@ static void usage(int version)
if
(
version
)
return
;
printf
(
"\
Copyright (C) 200
2
MySQL AB
\n
\
Copyright (C) 200
0-2008
MySQL AB
\n
\
This software comes with ABSOLUTELY NO WARRANTY. This is free software,
\n
\
and you are welcome to modify and redistribute it under the GPL license
\n
"
);
printf
(
"Usage: %s [OPTIONS] [database]
\n
"
,
my_progname
);
...
...
@@ -1910,7 +1910,8 @@ com_charset(String *buffer __attribute__((unused)), char *line)
static
int
com_go
(
String
*
buffer
,
char
*
line
__attribute__
((
unused
)))
{
char
buff
[
200
],
time_buff
[
32
],
*
pos
;
char
buff
[
200
];
/* about 110 chars used so far */
char
time_buff
[
52
+
3
+
1
];
/* time max + space&parens + NUL */
MYSQL_RES
*
result
;
ulong
timer
,
warnings
;
uint
error
=
0
;
...
...
@@ -1973,6 +1974,8 @@ com_go(String *buffer,char *line __attribute__((unused)))
do
{
char
*
pos
;
if
(
quick
)
{
if
(
!
(
result
=
mysql_use_result
(
&
mysql
))
&&
mysql_field_count
(
&
mysql
))
...
...
@@ -1988,7 +1991,9 @@ com_go(String *buffer,char *line __attribute__((unused)))
if
(
verbose
>=
3
||
!
opt_silent
)
mysql_end_timer
(
timer
,
time_buff
);
else
time_buff
[
0
]
=
0
;
time_buff
[
0
]
=
'\0'
;
/* Every branch must truncate buff . */
if
(
result
)
{
if
(
!
mysql_num_rows
(
result
)
&&
!
quick
)
...
...
@@ -2045,6 +2050,7 @@ com_go(String *buffer,char *line __attribute__((unused)))
fflush
(
stdout
);
mysql_free_result
(
result
);
}
while
(
!
(
err
=
mysql_next_result
(
&
mysql
)));
if
(
err
>=
1
)
error
=
put_error
(
&
mysql
);
...
...
@@ -3275,6 +3281,11 @@ static ulong start_timer(void)
}
/**
Write as many as 52+1 bytes to buff, in the form of a legible duration of time.
len("4294967296 days, 23 hours, 59 minutes, 60.00 seconds") -> 52
*/
static
void
nice_time
(
double
sec
,
char
*
buff
,
bool
part_second
)
{
ulong
tmp
;
...
...
client/mysqltest.c
View file @
838fa0d6
...
...
@@ -3067,7 +3067,7 @@ void do_get_file_name(struct st_command *command,
if
(
*
p
)
*
p
++=
0
;
command
->
last_argument
=
p
;
strmake
(
dest
,
name
,
dest_max_len
);
strmake
(
dest
,
name
,
dest_max_len
-
1
);
}
...
...
@@ -6375,7 +6375,7 @@ int main(int argc, char **argv)
if
(
save_file
[
0
])
{
strmake
(
command
->
require_file
,
save_file
,
sizeof
(
save_file
));
strmake
(
command
->
require_file
,
save_file
,
sizeof
(
save_file
)
-
1
);
save_file
[
0
]
=
0
;
}
run_query
(
cur_con
,
command
,
flags
);
...
...
configure.in
View file @
838fa0d6
...
...
@@ -5,7 +5,7 @@ AC_INIT(sql/mysqld.cc)
AC_CANONICAL_SYSTEM
# The Docs Makefile.am parses this line!
# remember to also change ndb version below and update version.c in ndb
AM_INIT_AUTOMAKE
(
mysql, 4.1.2
4
)
AM_INIT_AUTOMAKE
(
mysql, 4.1.2
5
)
AM_CONFIG_HEADER
(
config.h
)
PROTOCOL_VERSION
=
10
...
...
@@ -21,14 +21,24 @@ NDB_SHARED_LIB_VERSION=$NDB_SHARED_LIB_MAJOR_VERSION:0:0
# ndb version
NDB_VERSION_MAJOR
=
4
NDB_VERSION_MINOR
=
1
NDB_VERSION_BUILD
=
2
4
NDB_VERSION_BUILD
=
2
5
NDB_VERSION_STATUS
=
""
# Set all version vars based on $VERSION. How do we do this more elegant ?
# Remember that regexps needs to quote [ and ] since this is run through m4
MYSQL_NO_DASH_VERSION
=
`
echo
$VERSION
|
sed
-e
"s|[[a-z]]*-.*
$|
|"
`
MYSQL_BASE_VERSION
=
`
echo
$MYSQL_NO_DASH_VERSION
|
sed
-e
"s|
\.
[[^.]]*
$|
|"
`
MYSQL_VERSION_ID
=
`
echo
$MYSQL_NO_DASH_VERSION
.
|
sed
-e
's/[[^0-9.]]//g; s/\./ /g; s/ \([[0-9]]\) / 0\\1 /g; s/ //g'
`
# We take some made up examples
#
# VERSION 5.1.40sp1-alpha 5.0.34a
# MYSQL_NO_DASH_VERSION 5.1.40sp1 5.0.34a
# MYSQL_NUMERIC_VERSION 5.1.40 5.0.34
# MYSQL_BASE_VERSION 5.1 5.0
# MYSQL_VERSION_ID 50140 50034
#
MYSQL_NO_DASH_VERSION
=
`
echo
$VERSION
|
sed
-e
"s|-.*
$|
|"
`
MYSQL_NUMERIC_VERSION
=
`
echo
$MYSQL_NO_DASH_VERSION
|
sed
-e
"s|[[a-z]][[a-z0-9]]*
$|
|"
`
MYSQL_BASE_VERSION
=
`
echo
$MYSQL_NUMERIC_VERSION
|
sed
-e
"s|
\.
[[^.]]*
$|
|"
`
MYSQL_VERSION_ID
=
`
echo
$MYSQL_NUMERIC_VERSION
|
\
awk
-F
.
'{printf "%d%0.2d%0.2d", $1, $2, $3}'
`
# The port should be constant for a LONG time
MYSQL_TCP_PORT_DEFAULT
=
3306
...
...
@@ -205,7 +215,7 @@ CC_VERSION=`$CC --version | sed 1q`
esac
if
test
$?
-eq
"0"
then
AC_MSG_CHECKING
(
"C Compiler version"
)
;
AC_MSG_CHECKING
(
"C Compiler version"
)
AC_MSG_RESULT
(
"
$CC
$CC_VERSION
"
)
else
CC_VERSION
=
""
...
...
@@ -220,7 +230,7 @@ CXX_VERSION=`$CXX --version | sed 1q`
esac
if
test
$?
-eq
"0"
then
AC_MSG_CHECKING
(
"C++ compiler version"
)
;
AC_MSG_CHECKING
(
"C++ compiler version"
)
AC_MSG_RESULT
(
"
$CXX
$CXX_VERSION
"
)
else
CXX_VERSION
=
""
...
...
@@ -1369,7 +1379,7 @@ See the Installation chapter in the Reference Manual for more information.])
AC_MSG_RESULT
(
"no need to check headers"
)
fi
AC_MSG_CHECKING
(
"for pthread_create in -lpthread"
)
;
AC_MSG_CHECKING
(
"for pthread_create in -lpthread"
)
ac_save_LIBS
=
"
$LIBS
"
LIBS
=
"
$LIBS
-lpthread"
AC_TRY_LINK
(
[
#include <pthread.h>],
...
...
@@ -1429,7 +1439,7 @@ then
then
AC_MSG_RESULT
(
"yes"
)
else
AC_MSG_ERROR
([
On SCO UNIX MySQL must be compiled with gcc. See the Installation chapter
in
the Reference Manual.]
)
;
AC_MSG_ERROR
([
On SCO UNIX MySQL must be compiled with gcc. See the Installation chapter
in
the Reference Manual.]
)
fi
AC_MSG_RESULT
(
"yes"
)
elif
test
-f
/usr/local/lib/libpthread.a
-o
-f
/usr/local/lib/libpthread.so
...
...
@@ -1445,7 +1455,7 @@ then
then
AC_MSG_RESULT
(
"yes"
)
else
AC_MSG_ERROR
([
On SCO UNIX MySQL must be compiled with gcc. See the Installation chapter
in
the Reference Manual.]
)
;
AC_MSG_ERROR
([
On SCO UNIX MySQL must be compiled with gcc. See the Installation chapter
in
the Reference Manual.]
)
fi
AC_MSG_RESULT
(
"yes"
)
# Hack for SCO UnixWare 7.1.x
...
...
@@ -1487,7 +1497,7 @@ then
AC_MSG_RESULT
(
"no"
)
fi
else
AC_MSG_ERROR
([
On SCO UNIX MySQL requires that the FSUThreads package is installed. See the Installation chapter
in
the Reference Manual.]
)
;
AC_MSG_ERROR
([
On SCO UNIX MySQL requires that the FSUThreads package is installed. See the Installation chapter
in
the Reference Manual.]
)
fi
else
AC_MSG_RESULT
(
"no"
)
...
...
@@ -1585,7 +1595,7 @@ else
if
test
"
$with_mit_threads
"
=
"no"
then
# pthread_create is in standard libraries (As in BSDI 3.0)
AC_MSG_CHECKING
(
"for pthread_create in -libc"
)
;
AC_MSG_CHECKING
(
"for pthread_create in -libc"
)
AC_TRY_LINK
(
[
#include <pthread.h>],
[
(
void
)
pthread_create
((
pthread_t
*
)
0,
(
pthread_attr_t
*
)
0, 0, 0
)
;
]
,
...
...
@@ -1593,7 +1603,7 @@ else
AC_MSG_RESULT
(
"
$with_posix_threads
"
)
if
test
"
$with_posix_threads
"
=
"no"
then
AC_MSG_CHECKING
(
"for pthread_create in -lpthread"
)
;
AC_MSG_CHECKING
(
"for pthread_create in -lpthread"
)
ac_save_LIBS
=
"
$LIBS
"
LIBS
=
"
$LIBS
-lpthread"
AC_TRY_LINK
(
...
...
@@ -1604,7 +1614,7 @@ else
if
test
"
$with_posix_threads
"
=
"no"
then
LIBS
=
"
$ac_save_LIBS
-lpthreads"
AC_MSG_CHECKING
(
"for pthread_create in -lpthreads"
)
;
AC_MSG_CHECKING
(
"for pthread_create in -lpthreads"
)
AC_TRY_LINK
(
[
#include <pthread.h>],
[
pthread_create
((
pthread_t
*
)
0,
(
pthread_attr_t
*
)
0, 0, 0
)
;
]
,
...
...
@@ -1614,7 +1624,7 @@ else
then
# This is for FreeBSD
LIBS
=
"
$ac_save_LIBS
-pthread"
AC_MSG_CHECKING
(
"for pthread_create in -pthread"
)
;
AC_MSG_CHECKING
(
"for pthread_create in -pthread"
)
AC_TRY_LINK
(
[
#include <pthread.h>],
[
pthread_create
((
pthread_t
*
)
0,
(
pthread_attr_t
*
)
0, 0, 0
)
;
]
,
...
...
@@ -1895,7 +1905,7 @@ if test "$ac_cv_conv_longlong_to_float" != "yes"
then
AC_MSG_ERROR
([
Your compiler cannot convert a longlong value to a float!
If you are using gcc 2.8.# you should upgrade to egcs 1.0.3 or newer and try
again]
)
;
again]
)
fi
fi
AC_CHECK_TYPES
([
sigset_t, off_t],
[]
,
[]
,
[
#include <sys/types.h>])
...
...
@@ -2047,7 +2057,7 @@ CFLAGS="$ORG_CFLAGS"
AC_CHECK_FUNC
(
fseeko,
[
if
test
"
$large_file_support
"
=
no
-a
"
$TARGET_LINUX
"
=
"true"
;
then
AC_MSG_ERROR
(
"Found fseeko symbol but large_file_support is not enabled!"
)
;
AC_MSG_ERROR
(
"Found fseeko symbol but large_file_support is not enabled!"
)
fi
]
)
...
...
@@ -2740,7 +2750,7 @@ do
;;
*
)
AC_MSG_ERROR
([
Charset
'$cs'
not available.
(
Available are:
$CHARSETS_AVAILABLE
)
.
See the Installation chapter
in
the Reference Manual.]
)
;
See the Installation chapter
in
the Reference Manual.]
)
esac
done
...
...
@@ -2917,7 +2927,7 @@ case $default_charset in
;;
*
)
AC_MSG_ERROR
([
Charset
$cs
not available.
(
Available are:
$CHARSETS_AVAILABLE
)
.
See the Installation chapter
in
the Reference Manual.]
)
;
See the Installation chapter
in
the Reference Manual.]
)
esac
if
test
"
$default_collation
"
=
default
;
then
...
...
@@ -2942,7 +2952,7 @@ else
Collation
$default_collation
is not valid
for
character
set
$default_charset
.
Valid collations are:
$default_charset_collations
.
See the Installation chapter
in
the Reference Manual.
])
;
])
fi
AC_DEFINE_UNQUOTED
([
MYSQL_DEFAULT_CHARSET_NAME],
[
"
$default_charset
"
]
,
...
...
innobase/buf/buf0buf.c
View file @
838fa0d6
This diff is collapsed.
Click to expand it.
innobase/buf/buf0flu.c
View file @
838fa0d6
...
...
@@ -114,6 +114,7 @@ buf_flush_ready_for_replace(
{
#ifdef UNIV_SYNC_DEBUG
ut_ad
(
mutex_own
(
&
(
buf_pool
->
mutex
)));
ut_ad
(
mutex_own
(
&
block
->
mutex
));
#endif
/* UNIV_SYNC_DEBUG */
if
(
block
->
state
!=
BUF_BLOCK_FILE_PAGE
)
{
ut_print_timestamp
(
stderr
);
...
...
@@ -148,6 +149,7 @@ buf_flush_ready_for_flush(
{
#ifdef UNIV_SYNC_DEBUG
ut_ad
(
mutex_own
(
&
(
buf_pool
->
mutex
)));
ut_ad
(
mutex_own
(
&
(
block
->
mutex
)));
#endif
/* UNIV_SYNC_DEBUG */
ut_a
(
block
->
state
==
BUF_BLOCK_FILE_PAGE
);
...
...
@@ -533,8 +535,15 @@ buf_flush_try_page(
ut_a
(
!
block
||
block
->
state
==
BUF_BLOCK_FILE_PAGE
);
if
(
!
block
)
{
mutex_exit
(
&
(
buf_pool
->
mutex
));
return
(
0
);
}
mutex_enter
(
&
block
->
mutex
);
if
(
flush_type
==
BUF_FLUSH_LIST
&&
b
lock
&&
b
uf_flush_ready_for_flush
(
block
,
flush_type
))
{
&&
buf_flush_ready_for_flush
(
block
,
flush_type
))
{
block
->
io_fix
=
BUF_IO_WRITE
;
...
...
@@ -572,6 +581,7 @@ buf_flush_try_page(
locked
=
TRUE
;
}
mutex_exit
(
&
block
->
mutex
);
mutex_exit
(
&
(
buf_pool
->
mutex
));
if
(
!
locked
)
{
...
...
@@ -590,8 +600,8 @@ buf_flush_try_page(
return
(
1
);
}
else
if
(
flush_type
==
BUF_FLUSH_LRU
&&
block
&&
buf_flush_ready_for_flush
(
block
,
flush_type
))
{
}
else
if
(
flush_type
==
BUF_FLUSH_LRU
&&
buf_flush_ready_for_flush
(
block
,
flush_type
))
{
/* VERY IMPORTANT:
Because any thread may call the LRU flush, even when owning
...
...
@@ -631,14 +641,15 @@ buf_flush_try_page(
buf_pool mutex: this ensures that the latch is acquired
immediately. */
mutex_exit
(
&
block
->
mutex
);
mutex_exit
(
&
(
buf_pool
->
mutex
));
buf_flush_write_block_low
(
block
);
return
(
1
);
}
else
if
(
flush_type
==
BUF_FLUSH_SINGLE_PAGE
&&
block
&&
buf_flush_ready_for_flush
(
block
,
flush_type
))
{
}
else
if
(
flush_type
==
BUF_FLUSH_SINGLE_PAGE
&&
buf_flush_ready_for_flush
(
block
,
flush_type
))
{
block
->
io_fix
=
BUF_IO_WRITE
;
...
...
@@ -664,6 +675,7 @@ buf_flush_try_page(
(
buf_pool
->
n_flush
[
flush_type
])
++
;
mutex_exit
(
&
block
->
mutex
);
mutex_exit
(
&
(
buf_pool
->
mutex
));
rw_lock_s_lock_gen
(
&
(
block
->
lock
),
BUF_IO_WRITE
);
...
...
@@ -678,11 +690,12 @@ buf_flush_try_page(
buf_flush_write_block_low
(
block
);
return
(
1
);
}
else
{
mutex_exit
(
&
(
buf_pool
->
mutex
));
}
return
(
0
);
}
mutex_exit
(
&
block
->
mutex
);
mutex_exit
(
&
(
buf_pool
->
mutex
));
return
(
0
);
}
/***************************************************************
...
...
@@ -727,34 +740,48 @@ buf_flush_try_neighbors(
block
=
buf_page_hash_get
(
space
,
i
);
ut_a
(
!
block
||
block
->
state
==
BUF_BLOCK_FILE_PAGE
);
if
(
block
&&
flush_type
==
BUF_FLUSH_LRU
&&
i
!=
offset
&&
!
block
->
old
)
{
if
(
!
block
)
{
continue
;
}
else
if
(
flush_type
==
BUF_FLUSH_LRU
&&
i
!=
offset
&&
!
block
->
old
)
{
/* We avoid flushing 'non-old' blocks in an LRU flush,
because the flushed blocks are soon freed */
continue
;
}
}
else
{
mutex_enter
(
&
block
->
mutex
);
if
(
buf_flush_ready_for_flush
(
block
,
flush_type
)
&&
(
i
==
offset
||
block
->
buf_fix_count
==
0
))
{
/* We only try to flush those
neighbors != offset where the buf fix count is
zero, as we then know that we probably can
latch the page without a semaphore wait.
Semaphore waits are expensive because we must
flush the doublewrite buffer before we start
waiting. */
if
(
block
&&
buf_flush_ready_for_flush
(
block
,
flush_type
)
&&
(
i
==
offset
||
block
->
buf_fix_count
==
0
))
{
/* We only try to flush those neighbors != offset
where the buf fix count is zero, as we then know that
we probably can latch the page without a semaphore
wait. Semaphore waits are expensive because we must
flush the doublewrite buffer before we start
waiting. */
mutex_exit
(
&
block
->
mutex
);
mutex_exit
(
&
(
buf_pool
->
mutex
));
mutex_exit
(
&
(
buf_pool
->
mutex
));
/* Note: as we release the buf_pool mutex above, in
buf_flush_try_page we cannot be sure the page is still
in a flushable state: therefore we check it again
inside that function. */
/* Note: as we release the buf_pool mutex
above, in buf_flush_try_page we cannot be sure
the page is still in a flushable state:
therefore we check it again inside that
function. */
count
+=
buf_flush_try_page
(
space
,
i
,
flush_type
);
count
+=
buf_flush_try_page
(
space
,
i
,
flush_type
);
mutex_enter
(
&
(
buf_pool
->
mutex
));
mutex_enter
(
&
(
buf_pool
->
mutex
));
}
else
{
mutex_exit
(
&
block
->
mutex
);
}
}
}
...
...
@@ -848,12 +875,15 @@ buf_flush_batch(
while
((
block
!=
NULL
)
&&
!
found
)
{
ut_a
(
block
->
state
==
BUF_BLOCK_FILE_PAGE
);
mutex_enter
(
&
block
->
mutex
);
if
(
buf_flush_ready_for_flush
(
block
,
flush_type
))
{
found
=
TRUE
;
space
=
block
->
space
;
offset
=
block
->
offset
;
mutex_exit
(
&
block
->
mutex
);
mutex_exit
(
&
(
buf_pool
->
mutex
));
old_page_count
=
page_count
;
...
...
@@ -871,10 +901,14 @@ buf_flush_batch(
}
else
if
(
flush_type
==
BUF_FLUSH_LRU
)
{
mutex_exit
(
&
block
->
mutex
);
block
=
UT_LIST_GET_PREV
(
LRU
,
block
);
}
else
{
ut_ad
(
flush_type
==
BUF_FLUSH_LIST
);
mutex_exit
(
&
block
->
mutex
);
block
=
UT_LIST_GET_PREV
(
flush_list
,
block
);
}
}
...
...
@@ -951,10 +985,14 @@ buf_flush_LRU_recommendation(void)
+
BUF_FLUSH_EXTRA_MARGIN
)
&&
(
distance
<
BUF_LRU_FREE_SEARCH_LEN
))
{
mutex_enter
(
&
block
->
mutex
);
if
(
buf_flush_ready_for_replace
(
block
))
{
n_replaceable
++
;
}
mutex_exit
(
&
block
->
mutex
);
distance
++
;
block
=
UT_LIST_GET_PREV
(
LRU
,
block
);
...
...
innobase/buf/buf0lru.c
View file @
838fa0d6
...
...
@@ -86,6 +86,9 @@ scan_again:
block
=
UT_LIST_GET_LAST
(
buf_pool
->
LRU
);
while
(
block
!=
NULL
)
{
mutex_enter
(
&
block
->
mutex
);
ut_a
(
block
->
state
==
BUF_BLOCK_FILE_PAGE
);
if
(
block
->
space
==
id
...
...
@@ -112,6 +115,8 @@ scan_again:
if
(
block
->
is_hashed
)
{
page_no
=
block
->
offset
;
mutex_exit
(
&
block
->
mutex
);
mutex_exit
(
&
(
buf_pool
->
mutex
));
/* Note that the following call will acquire
...
...
@@ -138,6 +143,7 @@ scan_again:
buf_LRU_block_free_hashed_page
(
block
);
}
next_page:
mutex_exit
(
&
block
->
mutex
);
block
=
UT_LIST_GET_PREV
(
LRU
,
block
);
}
...
...
@@ -211,6 +217,9 @@ buf_LRU_search_and_free_block(
while
(
block
!=
NULL
)
{
ut_a
(
block
->
in_LRU_list
);
mutex_enter
(
&
block
->
mutex
);
if
(
buf_flush_ready_for_replace
(
block
))
{
if
(
buf_debug_prints
)
{
...
...
@@ -223,6 +232,7 @@ buf_LRU_search_and_free_block(
buf_LRU_block_remove_hashed_page
(
block
);
mutex_exit
(
&
(
buf_pool
->
mutex
));
mutex_exit
(
&
block
->
mutex
);
/* Remove possible adaptive hash index built on the
page; in the case of AWE the block may not have a
...
...
@@ -231,15 +241,21 @@ buf_LRU_search_and_free_block(
if
(
block
->
frame
)
{
btr_search_drop_page_hash_index
(
block
->
frame
);
}
mutex_enter
(
&
(
buf_pool
->
mutex
));
ut_a
(
block
->
buf_fix_count
==
0
);
mutex_enter
(
&
(
buf_pool
->
mutex
));
mutex_enter
(
&
block
->
mutex
);
buf_LRU_block_free_hashed_page
(
block
);
freed
=
TRUE
;
mutex_exit
(
&
block
->
mutex
);
break
;
}
mutex_exit
(
&
block
->
mutex
);
block
=
UT_LIST_GET_PREV
(
LRU
,
block
);
distance
++
;
...
...
@@ -413,8 +429,12 @@ loop:
}
}
mutex_enter
(
&
block
->
mutex
);
block
->
state
=
BUF_BLOCK_READY_FOR_USE
;
mutex_exit
(
&
block
->
mutex
);
mutex_exit
(
&
(
buf_pool
->
mutex
));
if
(
started_monitor
)
{
...
...
@@ -815,6 +835,7 @@ buf_LRU_block_free_non_file_page(
{
#ifdef UNIV_SYNC_DEBUG
ut_ad
(
mutex_own
(
&
(
buf_pool
->
mutex
)));
ut_ad
(
mutex_own
(
&
block
->
mutex
));
#endif
/* UNIV_SYNC_DEBUG */
ut_ad
(
block
);
...
...
@@ -854,6 +875,7 @@ buf_LRU_block_remove_hashed_page(
{
#ifdef UNIV_SYNC_DEBUG
ut_ad
(
mutex_own
(
&
(
buf_pool
->
mutex
)));
ut_ad
(
mutex_own
(
&
block
->
mutex
));
#endif
/* UNIV_SYNC_DEBUG */
ut_ad
(
block
);
...
...
@@ -911,6 +933,7 @@ buf_LRU_block_free_hashed_page(
{
#ifdef UNIV_SYNC_DEBUG
ut_ad
(
mutex_own
(
&
(
buf_pool
->
mutex
)));
ut_ad
(
mutex_own
(
&
block
->
mutex
));
#endif
/* UNIV_SYNC_DEBUG */
ut_a
(
block
->
state
==
BUF_BLOCK_REMOVE_HASH
);
...
...
innobase/include/buf0buf.h
View file @
838fa0d6
...
...
@@ -455,8 +455,8 @@ Gets the mutex number protecting the page record lock hash chain in the lock
table. */
UNIV_INLINE
mutex_t
*
buf_frame_get_
lock_
mutex
(
/*================
=====
*/
buf_frame_get_mutex
(
/*================*/
/* out: mutex */
byte
*
ptr
);
/* in: pointer to within a buffer frame */
/***********************************************************************
...
...
@@ -699,7 +699,10 @@ struct buf_block_struct{
ulint
magic_n
;
/* magic number to check */
ulint
state
;
/* state of the control block:
BUF_BLOCK_NOT_USED, ... */
BUF_BLOCK_NOT_USED, ...; changing
this is only allowed when a thread
has BOTH the buffer pool mutex AND
block->mutex locked */
byte
*
frame
;
/* pointer to buffer frame which
is of size UNIV_PAGE_SIZE, and
aligned to an address divisible by
...
...
@@ -717,8 +720,12 @@ struct buf_block_struct{
ulint
offset
;
/* page number within the space */
ulint
lock_hash_val
;
/* hashed value of the page address
in the record lock hash table */
mutex_t
*
lock_mutex
;
/* mutex protecting the chain in the
record lock hash table */
mutex_t
mutex
;
/* mutex protecting this block:
state (also protected by the buffer
pool mutex), io_fix, buf_fix_count,
and accessed; we introduce this new
mutex in InnoDB-5.1 to relieve
contention on the buffer pool mutex */
rw_lock_t
lock
;
/* read-write lock of the buffer
frame */
buf_block_t
*
hash
;
/* node used in chaining to the page
...
...
@@ -774,20 +781,27 @@ struct buf_block_struct{
in heuristic algorithms, because of
the possibility of a wrap-around! */
ulint
freed_page_clock
;
/* the value of freed_page_clock
buffer pool when this block was
last time put to the head of the
LRU list */
of the buffer pool when this block was
the last time put to the head of the
LRU list; a thread is allowed to
read this for heuristic purposes
without holding any mutex or latch */
ibool
old
;
/* TRUE if the block is in the old
blocks in the LRU list */
ibool
accessed
;
/* TRUE if the page has been accessed
while in the buffer pool: read-ahead
may read in pages which have not been
accessed yet */
accessed yet; this is protected by
block->mutex; a thread is allowed to
read this for heuristic purposes
without holding any mutex or latch */
ulint
buf_fix_count
;
/* count of how manyfold this block
is currently bufferfixed */
is currently bufferfixed; this is
protected by block->mutex */
ulint
io_fix
;
/* if a read is pending to the frame,
io_fix is BUF_IO_READ, in the case
of a write BUF_IO_WRITE, otherwise 0 */
of a write BUF_IO_WRITE, otherwise 0;
this is protected by block->mutex */
/* 4. Optimistic search field */
dulint
modify_clock
;
/* this clock is incremented every
...
...
@@ -940,7 +954,9 @@ struct buf_pool_struct{
number of buffer blocks removed from
the end of the LRU list; NOTE that
this counter may wrap around at 4
billion! */
billion! A thread is allowed to
read this for heuristic purposes
without holding any mutex or latch */
ulint
LRU_flush_ended
;
/* when an LRU flush ends for a page,
this is incremented by one; this is
set to zero when a buffer block is
...
...
innobase/include/buf0buf.ic
View file @
838fa0d6
...
...
@@ -333,8 +333,8 @@ Gets the mutex number protecting the page record lock hash chain in the lock
table. */
UNIV_INLINE
mutex_t*
buf_frame_get_
lock_
mutex(
/*================
=====
*/
buf_frame_get_mutex(
/*================*/
/* out: mutex */
byte* ptr) /* in: pointer to within a buffer frame */
{
...
...
@@ -342,7 +342,7 @@ buf_frame_get_lock_mutex(
block = buf_block_align(ptr);
return(
block->lock_
mutex);
return(
&block->
mutex);
}
/*************************************************************************
...
...
@@ -521,6 +521,7 @@ buf_block_buf_fix_inc_debug(
ret = rw_lock_s_lock_func_nowait(&(block->debug_latch), file, line);
ut_ad(ret == TRUE);
ut_ad(mutex_own(&block->mutex));
#endif
block->buf_fix_count++;
}
...
...
@@ -533,6 +534,9 @@ buf_block_buf_fix_inc(
/*==================*/
buf_block_t* block) /* in: block to bufferfix */
{
#ifdef UNIV_SYNC_DEBUG
ut_ad(mutex_own(&block->mutex));
#endif
block->buf_fix_count++;
}
#endif /* UNIV_SYNC_DEBUG */
...
...
@@ -627,23 +631,24 @@ buf_page_release(
ut_ad(block);
mutex_enter_fast(&(buf_pool->mutex));
ut_a(block->state == BUF_BLOCK_FILE_PAGE);
ut_a(block->buf_fix_count > 0);
if (rw_latch == RW_X_LATCH && mtr->modifications) {
mutex_enter(&buf_pool->mutex);
buf_flush_note_modification(block, mtr);
mutex_exit(&buf_pool->mutex);
}
mutex_enter(&block->mutex);
#ifdef UNIV_SYNC_DEBUG
rw_lock_s_unlock(&(block->debug_latch));
#endif
buf_fix_count = block->buf_fix_count;
block->buf_fix_count = buf_fix_count - 1;
mutex_exit(&
(buf_pool->mutex)
);
mutex_exit(&
block->mutex
);
if (rw_latch == RW_S_LATCH) {
rw_lock_s_unlock(&(block->lock));
...
...
innobase/include/sync0arr.h
View file @
838fa0d6
...
...
@@ -75,17 +75,12 @@ sync_array_free_cell(
sync_array_t
*
arr
,
/* in: wait array */
ulint
index
);
/* in: index of the cell in array */
/**************************************************************************
Looks for the cells in the wait array which refer
to the wait object specified,
and sets their corresponding events to the signaled state. In this
way releases the threads waiting for the object to contend for the object.
It is possible that no such cell is found, in which case does nothing. */
Note that one of the wait objects was signalled. */
void
sync_array_signal_object
(
/*=====================*/
sync_array_t
*
arr
,
/* in: wait array */
void
*
object
);
/* in: wait object */
sync_array_object_signalled
(
/*========================*/
sync_array_t
*
arr
);
/* in: wait array */
/**************************************************************************
If the wakeup algorithm does not work perfectly at semaphore relases,
this function will do the waking (see the comment in mutex_exit). This
...
...
innobase/include/sync0rw.h
View file @
838fa0d6
...
...
@@ -410,6 +410,7 @@ blocked by readers, a writer may queue for the lock by setting the writer
field. Then no new readers are allowed in. */
struct
rw_lock_struct
{
os_event_t
event
;
/* Used by sync0arr.c for thread queueing */
ulint
reader_count
;
/* Number of readers who have locked this
lock in the shared mode */
ulint
writer
;
/* This field is set to RW_LOCK_EX if there
...
...
innobase/include/sync0rw.ic
View file @
838fa0d6
...
...
@@ -380,7 +380,8 @@ rw_lock_s_unlock_func(
mutex_exit(mutex);
if (sg == TRUE) {
sync_array_signal_object(sync_primary_wait_array, lock);
os_event_set(lock->event);
sync_array_object_signalled(sync_primary_wait_array);
}
ut_ad(rw_lock_validate(lock));
...
...
@@ -459,7 +460,8 @@ rw_lock_x_unlock_func(
mutex_exit(&(lock->mutex));
if (sg == TRUE) {
sync_array_signal_object(sync_primary_wait_array, lock);
os_event_set(lock->event);
sync_array_object_signalled(sync_primary_wait_array);
}
ut_ad(rw_lock_validate(lock));
...
...
innobase/include/sync0sync.h
View file @
838fa0d6
...
...
@@ -447,6 +447,7 @@ Do not use its fields directly! The structure used in the spin lock
implementation of a mutual exclusion semaphore. */
struct
mutex_struct
{
os_event_t
event
;
/* Used by sync0arr.c for the wait queue */
ulint
lock_word
;
/* This ulint is the target of the atomic
test-and-set instruction in Win32 */
#if !defined(_WIN32) || !defined(UNIV_CAN_USE_X86_ASSEMBLER)
...
...
innobase/os/os0sync.c
View file @
838fa0d6
...
...
@@ -21,6 +21,7 @@ Created 9/6/1995 Heikki Tuuri
/* Type definition for an operating system mutex struct */
struct
os_mutex_struct
{
os_event_t
event
;
/* Used by sync0arr.c for queing threads */
void
*
handle
;
/* OS handle to mutex */
ulint
count
;
/* we use this counter to check
that the same thread does not
...
...
@@ -35,6 +36,7 @@ struct os_mutex_struct{
/* Mutex protecting counts and the lists of OS mutexes and events */
os_mutex_t
os_sync_mutex
;
ibool
os_sync_mutex_inited
=
FALSE
;
ibool
os_sync_free_called
=
FALSE
;
/* This is incremented by 1 in os_thread_create and decremented by 1 in
os_thread_exit */
...
...
@@ -50,6 +52,10 @@ ulint os_event_count = 0;
ulint
os_mutex_count
=
0
;
ulint
os_fast_mutex_count
=
0
;
/* Because a mutex is embedded inside an event and there is an
event embedded inside a mutex, on free, this generates a recursive call.
This version of the free event function doesn't acquire the global lock */
static
void
os_event_free_internal
(
os_event_t
event
);
/*************************************************************
Initializes global event and OS 'slow' mutex lists. */
...
...
@@ -76,6 +82,7 @@ os_sync_free(void)
os_event_t
event
;
os_mutex_t
mutex
;
os_sync_free_called
=
TRUE
;
event
=
UT_LIST_GET_FIRST
(
os_event_list
);
while
(
event
)
{
...
...
@@ -99,6 +106,7 @@ os_sync_free(void)
mutex
=
UT_LIST_GET_FIRST
(
os_mutex_list
);
}
os_sync_free_called
=
FALSE
;
}
/*************************************************************
...
...
@@ -146,14 +154,21 @@ os_event_create(
event
->
signal_count
=
0
;
#endif
/* __WIN__ */
/* Put to the list of events */
os_mutex_enter
(
os_sync_mutex
);
/* The os_sync_mutex can be NULL because during startup an event
can be created [ because it's embedded in the mutex/rwlock ] before
this module has been initialized */
if
(
os_sync_mutex
!=
NULL
)
{
os_mutex_enter
(
os_sync_mutex
);
}
/* Put to the list of events */
UT_LIST_ADD_FIRST
(
os_event_list
,
os_event_list
,
event
);
os_event_count
++
;
os_mutex_exit
(
os_sync_mutex
);
if
(
os_sync_mutex
!=
NULL
)
{
os_mutex_exit
(
os_sync_mutex
);
}
return
(
event
);
}
...
...
@@ -255,6 +270,35 @@ os_event_reset(
#endif
}
/**************************************************************
Frees an event object, without acquiring the global lock. */
static
void
os_event_free_internal
(
/*===================*/
os_event_t
event
)
/* in: event to free */
{
#ifdef __WIN__
ut_a
(
event
);
ut_a
(
CloseHandle
(
event
->
handle
));
#else
ut_a
(
event
);
/* This is to avoid freeing the mutex twice */
os_fast_mutex_free
(
&
(
event
->
os_mutex
));
ut_a
(
0
==
pthread_cond_destroy
(
&
(
event
->
cond_var
)));
#endif
/* Remove from the list of events */
UT_LIST_REMOVE
(
os_event_list
,
os_event_list
,
event
);
os_event_count
--
;
ut_free
(
event
);
}
/**************************************************************
Frees an event object. */
...
...
@@ -456,6 +500,7 @@ os_mutex_create(
mutex_str
->
handle
=
mutex
;
mutex_str
->
count
=
0
;
mutex_str
->
event
=
os_event_create
(
NULL
);
if
(
os_sync_mutex_inited
)
{
/* When creating os_sync_mutex itself we cannot reserve it */
...
...
@@ -532,6 +577,10 @@ os_mutex_free(
{
ut_a
(
mutex
);
if
(
!
os_sync_free_called
)
{
os_event_free_internal
(
mutex
->
event
);
}
if
(
os_sync_mutex_inited
)
{
os_mutex_enter
(
os_sync_mutex
);
}
...
...
innobase/sync/sync0arr.c
View file @
838fa0d6
...
...
@@ -62,9 +62,6 @@ struct sync_cell_struct {
ibool
waiting
;
/* TRUE if the thread has already
called sync_array_event_wait
on this cell */
ibool
event_set
;
/* TRUE if the event is set */
os_event_t
event
;
/* operating system event
semaphore handle */
time_t
reservation_time
;
/* time when the thread reserved
the wait cell */
};
...
...
@@ -218,10 +215,7 @@ sync_array_create(
for
(
i
=
0
;
i
<
n_cells
;
i
++
)
{
cell
=
sync_array_get_nth_cell
(
arr
,
i
);
cell
->
wait_object
=
NULL
;
/* Create an operating system event semaphore with no name */
cell
->
event
=
os_event_create
(
NULL
);
cell
->
event_set
=
FALSE
;
/* it is created in reset state */
cell
->
waiting
=
FALSE
;
}
return
(
arr
);
...
...
@@ -235,19 +229,12 @@ sync_array_free(
/*============*/
sync_array_t
*
arr
)
/* in, own: sync wait array */
{
ulint
i
;
sync_cell_t
*
cell
;
ulint
protection
;
ut_a
(
arr
->
n_reserved
==
0
);
sync_array_validate
(
arr
);
for
(
i
=
0
;
i
<
arr
->
n_cells
;
i
++
)
{
cell
=
sync_array_get_nth_cell
(
arr
,
i
);
os_event_free
(
cell
->
event
);
}
protection
=
arr
->
protection
;
/* Release the mutex protecting the wait array complex */
...
...
@@ -292,28 +279,20 @@ sync_array_validate(
sync_array_exit
(
arr
);
}
/***********************************************************************
Puts the cell event in set state. */
static
void
sync_cell_event_set
(
/*================*/
sync_cell_t
*
cell
)
/* in: array cell */
{
os_event_set
(
cell
->
event
);
cell
->
event_set
=
TRUE
;
}
/***********************************************************************
Puts the cell event in reset state. */
static
void
sync_cell_event_reset
(
/*==================*/
sync_cell_t
*
cell
)
/* in: array cell */
ulint
type
,
/* in: lock type mutex/rw_lock */
void
*
object
)
/* in: the rw_lock/mutex object */
{
os_event_reset
(
cell
->
event
);
cell
->
event_set
=
FALSE
;
if
(
type
==
SYNC_MUTEX
)
{
os_event_reset
(((
mutex_t
*
)
object
)
->
event
);
}
else
{
os_event_reset
(((
rw_lock_t
*
)
object
)
->
event
);
}
}
/**********************************************************************
...
...
@@ -346,14 +325,7 @@ sync_array_reserve_cell(
if
(
cell
->
wait_object
==
NULL
)
{
/* Make sure the event is reset */
if
(
cell
->
event_set
)
{
sync_cell_event_reset
(
cell
);
}
cell
->
reservation_time
=
time
(
NULL
);
cell
->
thread
=
os_thread_get_curr_id
();
cell
->
waiting
=
FALSE
;
cell
->
wait_object
=
object
;
if
(
type
==
SYNC_MUTEX
)
{
...
...
@@ -363,7 +335,6 @@ sync_array_reserve_cell(
}
cell
->
request_type
=
type
;
cell
->
waiting
=
FALSE
;
cell
->
file
=
file
;
cell
->
line
=
line
;
...
...
@@ -373,6 +344,13 @@ sync_array_reserve_cell(
*
index
=
i
;
sync_array_exit
(
arr
);
/* Make sure the event is reset */
sync_cell_event_reset
(
type
,
object
);
cell
->
reservation_time
=
time
(
NULL
);
cell
->
thread
=
os_thread_get_curr_id
();
return
;
}
...
...
@@ -408,7 +386,12 @@ sync_array_wait_event(
ut_a
(
!
cell
->
waiting
);
ut_ad
(
os_thread_get_curr_id
()
==
cell
->
thread
);
event
=
cell
->
event
;
if
(
cell
->
request_type
==
SYNC_MUTEX
)
{
event
=
((
mutex_t
*
)
cell
->
wait_object
)
->
event
;
}
else
{
event
=
((
rw_lock_t
*
)
cell
->
wait_object
)
->
event
;
}
cell
->
waiting
=
TRUE
;
#ifdef UNIV_SYNC_DEBUG
...
...
@@ -510,10 +493,6 @@ sync_array_cell_print(
if
(
!
cell
->
waiting
)
{
fputs
(
"wait has ended
\n
"
,
file
);
}
if
(
cell
->
event_set
)
{
fputs
(
"wait is ending
\n
"
,
file
);
}
}
#ifdef UNIV_SYNC_DEBUG
...
...
@@ -623,7 +602,7 @@ sync_array_detect_deadlock(
depth
++
;
if
(
cell
->
event_set
||
!
cell
->
waiting
)
{
if
(
!
cell
->
waiting
)
{
return
(
FALSE
);
/* No deadlock here */
}
...
...
@@ -802,6 +781,7 @@ sync_array_free_cell(
ut_a
(
cell
->
wait_object
!=
NULL
);
cell
->
waiting
=
FALSE
;
cell
->
wait_object
=
NULL
;
ut_a
(
arr
->
n_reserved
>
0
);
...
...
@@ -811,44 +791,17 @@ sync_array_free_cell(
}
/**************************************************************************
Looks for the cells in the wait array which refer to the wait object
specified, and sets their corresponding events to the signaled state. In this
way releases the threads waiting for the object to contend for the object.
It is possible that no such cell is found, in which case does nothing. */
Increments the signalled count. */
void
sync_array_signal_object
(
/*=====================*/
sync_array_t
*
arr
,
/* in: wait array */
void
*
object
)
/* in: wait object */
sync_array_object_signalled
(
/*========================*/
sync_array_t
*
arr
)
/* in: wait array */
{
sync_cell_t
*
cell
;
ulint
count
;
ulint
i
;
sync_array_enter
(
arr
);
arr
->
sg_count
++
;
i
=
0
;
count
=
0
;
while
(
count
<
arr
->
n_reserved
)
{
cell
=
sync_array_get_nth_cell
(
arr
,
i
);
if
(
cell
->
wait_object
!=
NULL
)
{
count
++
;
if
(
cell
->
wait_object
==
object
)
{
sync_cell_event_set
(
cell
);
}
}
i
++
;
}
sync_array_exit
(
arr
);
}
...
...
@@ -881,7 +834,17 @@ sync_arr_wake_threads_if_sema_free(void)
if
(
sync_arr_cell_can_wake_up
(
cell
))
{
sync_cell_event_set
(
cell
);
if
(
cell
->
request_type
==
SYNC_MUTEX
)
{
mutex_t
*
mutex
;
mutex
=
cell
->
wait_object
;
os_event_set
(
mutex
->
event
);
}
else
{
rw_lock_t
*
lock
;
lock
=
cell
->
wait_object
;
os_event_set
(
lock
->
event
);
}
}
}
...
...
@@ -911,7 +874,7 @@ sync_array_print_long_waits(void)
cell
=
sync_array_get_nth_cell
(
sync_primary_wait_array
,
i
);
if
(
cell
->
wait_object
!=
NULL
if
(
cell
->
wait_object
!=
NULL
&&
cell
->
waiting
&&
difftime
(
time
(
NULL
),
cell
->
reservation_time
)
>
240
)
{
fputs
(
"InnoDB: Warning: a long semaphore wait:
\n
"
,
stderr
);
...
...
@@ -919,7 +882,7 @@ sync_array_print_long_waits(void)
noticed
=
TRUE
;
}
if
(
cell
->
wait_object
!=
NULL
if
(
cell
->
wait_object
!=
NULL
&&
cell
->
waiting
&&
difftime
(
time
(
NULL
),
cell
->
reservation_time
)
>
fatal_timeout
)
{
fatal
=
TRUE
;
...
...
innobase/sync/sync0rw.c
View file @
838fa0d6
...
...
@@ -123,6 +123,7 @@ rw_lock_create_func(
lock
->
last_x_file_name
=
"not yet reserved"
;
lock
->
last_s_line
=
0
;
lock
->
last_x_line
=
0
;
lock
->
event
=
os_event_create
(
NULL
);
mutex_enter
(
&
rw_lock_list_mutex
);
...
...
@@ -158,6 +159,7 @@ rw_lock_free(
mutex_free
(
rw_lock_get_mutex
(
lock
));
mutex_enter
(
&
rw_lock_list_mutex
);
os_event_free
(
lock
->
event
);
if
(
UT_LIST_GET_PREV
(
list
,
lock
))
{
ut_a
(
UT_LIST_GET_PREV
(
list
,
lock
)
->
magic_n
==
RW_LOCK_MAGIC_N
);
...
...
innobase/sync/sync0sync.c
View file @
838fa0d6
...
...
@@ -210,6 +210,7 @@ mutex_create_func(
os_fast_mutex_init
(
&
(
mutex
->
os_fast_mutex
));
mutex
->
lock_word
=
0
;
#endif
mutex
->
event
=
os_event_create
(
NULL
);
mutex_set_waiters
(
mutex
,
0
);
mutex
->
magic_n
=
MUTEX_MAGIC_N
;
#ifdef UNIV_SYNC_DEBUG
...
...
@@ -275,6 +276,8 @@ mutex_free(
mutex_exit
(
&
mutex_list_mutex
);
}
os_event_free
(
mutex
->
event
);
#if !defined(_WIN32) || !defined(UNIV_CAN_USE_X86_ASSEMBLER)
os_fast_mutex_free
(
&
(
mutex
->
os_fast_mutex
));
#endif
...
...
@@ -498,8 +501,8 @@ mutex_signal_object(
/* The memory order of resetting the waiters field and
signaling the object is important. See LEMMA 1 above. */
sync_array_
signal_object
(
sync_primary_wait_array
,
mutex
);
os_event_set
(
mutex
->
event
);
sync_array_
object_signalled
(
sync_primary_wait_array
);
}
#ifdef UNIV_SYNC_DEBUG
...
...
@@ -1047,6 +1050,7 @@ sync_thread_add_level(
ut_a
(
sync_thread_levels_g
(
array
,
SYNC_PURGE_SYS
));
}
else
if
(
level
==
SYNC_TREE_NODE
)
{
ut_a
(
sync_thread_levels_contain
(
array
,
SYNC_INDEX_TREE
)
||
sync_thread_levels_contain
(
array
,
SYNC_DICT_OPERATION
)
||
sync_thread_levels_g
(
array
,
SYNC_TREE_NODE
-
1
));
}
else
if
(
level
==
SYNC_TREE_NODE_FROM_HASH
)
{
ut_a
(
1
);
...
...
libmysql/libmysql.c
View file @
838fa0d6
...
...
@@ -4522,14 +4522,11 @@ my_bool STDCALL mysql_stmt_free_result(MYSQL_STMT *stmt)
{
MYSQL
*
mysql
=
stmt
->
mysql
;
if
(
result
->
data
)
{
/* Result buffered */
free_root
(
&
result
->
alloc
,
MYF
(
MY_KEEP_PREALLOC
));
result
->
data
=
NULL
;
result
->
rows
=
0
;
stmt
->
data_cursor
=
NULL
;
}
/* Result buffered */
free_root
(
&
result
->
alloc
,
MYF
(
MY_KEEP_PREALLOC
));
result
->
data
=
NULL
;
result
->
rows
=
0
;
stmt
->
data_cursor
=
NULL
;
if
(
mysql
&&
stmt
->
field_count
&&
(
int
)
stmt
->
state
>
(
int
)
MYSQL_STMT_PREPARE_DONE
)
...
...
libmysqld/lib_sql.cc
View file @
838fa0d6
...
...
@@ -668,7 +668,7 @@ bool Protocol::send_fields(List<Item> *list, uint flag)
DBUG_RETURN
(
0
);
field_count
=
list
->
elements
;
field_alloc
=
thd
->
current_stmt
?
&
thd
->
current_stmt
->
mem_root
:
field_alloc
=
thd
->
current_stmt
?
&
thd
->
current_stmt
->
result
.
alloc
:
&
mysql
->
field_alloc
;
if
(
!
(
client_field
=
mysql
->
fields
=
(
MYSQL_FIELD
*
)
alloc_root
(
field_alloc
,
...
...
mysql-test/mysql-test-run.pl
View file @
838fa0d6
...
...
@@ -188,6 +188,7 @@ our $opt_force;
our
$opt_reorder
=
0
;
our
$opt_enable_disabled
;
our
$opt_mem
=
$ENV
{'
MTR_MEM
'};
our
$opt_report_features
;
our
$opt_gcov
;
our
$opt_gcov_err
;
...
...
mysql-test/r/symlink.result
View file @
838fa0d6
...
...
@@ -91,23 +91,15 @@ t1 CREATE TABLE `t1` (
) ENGINE=MyISAM DEFAULT CHARSET=latin1
drop table t1;
CREATE TABLE t1(a INT)
DATA DIRECTORY='TEST_DIR/master-data/mysql'
INDEX DIRECTORY='TEST_DIR/master-data/mysql';
RENAME TABLE t1 TO user;
ERROR HY000: Can't create/write to file 'TEST_DIR/master-data/mysql/user.MYI' (Errcode: 17)
DROP TABLE t1;
show create table t1;
Table Create Table
t1 CREATE TABLE `t1` (
`i` int(11) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
drop table t1;
show create table t1;
Table Create Table
t1 CREATE TABLE `t1` (
`i` int(11) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
drop table t1;
DATA DIRECTORY='TEST_DIR/tmp'
INDEX DIRECTORY='TEST_DIR/tmp';
ERROR HY000: Can't create/write to file 'TEST_DIR/tmp/t1.MYI' (Errcode: 17)
CREATE TABLE t2(a INT)
DATA DIRECTORY='TEST_DIR/tmp'
INDEX DIRECTORY='TEST_DIR/tmp';
RENAME TABLE t2 TO t1;
ERROR HY000: Can't create/write to file 'TEST_DIR/tmp/t1.MYI' (Errcode: 17)
DROP TABLE t2;
show create table t1;
Table Create Table
t1 CREATE TEMPORARY TABLE `t1` (
...
...
@@ -144,4 +136,16 @@ t1 CREATE TABLE `t1` (
) ENGINE=MyISAM DEFAULT CHARSET=latin1 DATA DIRECTORY='MYSQLTEST_VARDIR/tmp/'
drop table t1;
deallocate prepare stmt;
CREATE TABLE t1(a INT)
DATA DIRECTORY='TEST_DIR/var/master-data/test';
ERROR HY000: Incorrect arguments to DATA DIRECORY
CREATE TABLE t1(a INT)
DATA DIRECTORY='TEST_DIR/var/master-data/';
ERROR HY000: Incorrect arguments to DATA DIRECORY
CREATE TABLE t1(a INT)
INDEX DIRECTORY='TEST_DIR/var/master-data';
ERROR HY000: Incorrect arguments to INDEX DIRECORY
CREATE TABLE t1(a INT)
INDEX DIRECTORY='TEST_DIR/var/master-data_var';
ERROR HY000: Can't create/write to file 'TEST_DIR/var/master-data_var/t1.MYI' (Errcode: 2)
End of 4.1 tests
mysql-test/t/symlink.test
View file @
838fa0d6
...
...
@@ -121,29 +121,22 @@ drop table t1;
#
# BUG#32111 - Security Breach via DATA/INDEX DIRECORY and RENAME TABLE
#
--
write_file
$MYSQLTEST_VARDIR
/
tmp
/
t1
.
MYI
EOF
--
replace_result
$MYSQLTEST_VARDIR
TEST_DIR
--
error
1
eval
CREATE
TABLE
t1
(
a
INT
)
DATA
DIRECTORY
=
'$MYSQLTEST_VARDIR/master-data/mysql'
INDEX
DIRECTORY
=
'$MYSQLTEST_VARDIR/master-data/mysql'
;
DATA
DIRECTORY
=
'$MYSQLTEST_VARDIR/tmp'
INDEX
DIRECTORY
=
'$MYSQLTEST_VARDIR/tmp'
;
--
replace_result
$MYSQLTEST_VARDIR
TEST_DIR
eval
CREATE
TABLE
t2
(
a
INT
)
DATA
DIRECTORY
=
'$MYSQLTEST_VARDIR/tmp'
INDEX
DIRECTORY
=
'$MYSQLTEST_VARDIR/tmp'
;
--
replace_result
$MYSQLTEST_VARDIR
TEST_DIR
--
error
1
RENAME
TABLE
t1
TO
user
;
DROP
TABLE
t1
;
#
# Test specifying DATA DIRECTORY that is the same as what would normally
# have been chosen. (Bug #8707)
#
disable_query_log
;
eval
create
table
t1
(
i
int
)
data
directory
=
"
$MYSQL_TEST_DIR
/var/master-data/test/"
;
enable_query_log
;
show
create
table
t1
;
drop
table
t1
;
disable_query_log
;
eval
create
table
t1
(
i
int
)
index
directory
=
"
$MYSQL_TEST_DIR
/var/master-data/test/"
;
enable_query_log
;
show
create
table
t1
;
drop
table
t1
;
RENAME
TABLE
t2
TO
t1
;
DROP
TABLE
t2
;
--
remove_file
$MYSQLTEST_VARDIR
/
tmp
/
t1
.
MYI
#
# Bug#8706 - temporary table with data directory option fails
...
...
@@ -201,4 +194,24 @@ show create table t1;
drop
table
t1
;
deallocate
prepare
stmt
;
#
# Bug#32167 another privilege bypass with DATA/INDEX DIRECORY
#
--
replace_result
$MYSQL_TEST_DIR
TEST_DIR
--
error
1210
eval
CREATE
TABLE
t1
(
a
INT
)
DATA
DIRECTORY
=
'$MYSQL_TEST_DIR/var/master-data/test'
;
--
replace_result
$MYSQL_TEST_DIR
TEST_DIR
--
error
1210
eval
CREATE
TABLE
t1
(
a
INT
)
DATA
DIRECTORY
=
'$MYSQL_TEST_DIR/var/master-data/'
;
--
replace_result
$MYSQL_TEST_DIR
TEST_DIR
--
error
1210
eval
CREATE
TABLE
t1
(
a
INT
)
INDEX
DIRECTORY
=
'$MYSQL_TEST_DIR/var/master-data'
;
--
replace_result
$MYSQL_TEST_DIR
TEST_DIR
--
error
1
eval
CREATE
TABLE
t1
(
a
INT
)
INDEX
DIRECTORY
=
'$MYSQL_TEST_DIR/var/master-data_var'
;
--
echo
End
of
4.1
tests
mysys/mf_pack.c
View file @
838fa0d6
...
...
@@ -272,7 +272,7 @@ void symdirget(char *dir)
SYNOPSIS
unpack_dirname()
to
Store result here. May be
= from
to
result-buffer, FN_REFLEN characters. may be =
= from
from 'Packed' directory name (may contain ~)
IMPLEMENTATION
...
...
@@ -398,7 +398,7 @@ uint unpack_filename(my_string to, const char *from)
/* Convert filename (unix standard) to system standard */
/* Used before system command's like open(), create() .. */
/* Returns
length of to
*/
/* Returns
used length of to; total length should be FN_REFLEN
*/
uint
system_filename
(
my_string
to
,
const
char
*
from
)
{
...
...
ndb/src/common/util/SocketServer.cpp
View file @
838fa0d6
...
...
@@ -111,7 +111,7 @@ SocketServer::setup(SocketServer::Service * service,
const
int
on
=
1
;
if
(
setsockopt
(
sock
,
SOL_SOCKET
,
SO_REUSEADDR
,
(
const
char
*
)
&
on
,
sizeof
(
on
))
==
-
1
)
{
DBUG_PRINT
(
"error"
,(
"
g
etsockopt() - %d - %s"
,
DBUG_PRINT
(
"error"
,(
"
s
etsockopt() - %d - %s"
,
errno
,
strerror
(
errno
)));
NDB_CLOSE_SOCKET
(
sock
);
DBUG_RETURN
(
false
);
...
...
scripts/make_binary_distribution.sh
View file @
838fa0d6
...
...
@@ -322,11 +322,13 @@ BASE=$BASE2
#
if
[
x
"@GXX@"
=
x
"yes"
]
;
then
gcclib
=
`
@CC@ @CFLAGS@
--print-libgcc-file
`
if
[
$?
-ne
0
]
;
then
echo
"Warning: Co
uldn't find
libgcc.a!"
el
se
gcclib
=
`
@CC@ @CFLAGS@
--print-libgcc-file
2>/dev/null
`
||
true
if
[
-z
"
$gcclib
"
]
;
then
echo
"Warning: Co
mpiler doesn't tell
libgcc.a!"
el
if
[
-f
"
$gcclib
"
]
;
then
$CP
$gcclib
$BASE
/lib/libmygcc.a
else
echo
"Warning: Compiler result '
$gcclib
' not found / no file!"
fi
fi
...
...
sql/log.cc
View file @
838fa0d6
...
...
@@ -963,10 +963,10 @@ err:
void
MYSQL_LOG
::
make_log_name
(
char
*
buf
,
const
char
*
log_ident
)
{
uint
dir_len
=
dirname_length
(
log_file_name
);
if
(
dir_len
>
FN_REFLEN
)
if
(
dir_len
>
=
FN_REFLEN
)
dir_len
=
FN_REFLEN
-
1
;
strnmov
(
buf
,
log_file_name
,
dir_len
);
strmake
(
buf
+
dir_len
,
log_ident
,
FN_REFLEN
-
dir_len
);
strmake
(
buf
+
dir_len
,
log_ident
,
FN_REFLEN
-
dir_len
-
1
);
}
...
...
sql/mysql_priv.h
View file @
838fa0d6
...
...
@@ -890,6 +890,7 @@ void my_dbopt_free(void);
extern
time_t
start_time
;
extern
char
*
mysql_data_home
,
server_version
[
SERVER_VERSION_LENGTH
],
mysql_real_data_home
[],
*
opt_mysql_tmpdir
,
mysql_charsets_dir
[],
mysql_unpacked_real_data_home
[],
def_ft_boolean_syntax
[
sizeof
(
ft_boolean_syntax
)];
#define mysql_tmpdir (my_tmpdir(&mysql_tmpdir_list))
extern
MY_TMPDIR
mysql_tmpdir_list
;
...
...
sql/mysqld.cc
View file @
838fa0d6
...
...
@@ -390,6 +390,7 @@ const char *opt_date_time_formats[3];
char
compiled_default_collation_name
[]
=
MYSQL_DEFAULT_COLLATION_NAME
;
char
*
language_ptr
,
*
default_collation_name
,
*
default_character_set_name
;
char
mysql_data_home_buff
[
2
],
*
mysql_data_home
=
mysql_real_data_home
;
char
mysql_unpacked_real_data_home
[
FN_REFLEN
];
struct
passwd
*
user_info
;
char
server_version
[
SERVER_VERSION_LENGTH
];
char
*
mysqld_unix_port
,
*
opt_mysql_tmpdir
;
...
...
@@ -6896,6 +6897,9 @@ static void fix_paths(void)
pos
[
1
]
=
0
;
}
convert_dirname
(
mysql_real_data_home
,
mysql_real_data_home
,
NullS
);
(
void
)
fn_format
(
buff
,
mysql_real_data_home
,
""
,
""
,
(
MY_RETURN_REAL_PATH
|
MY_RESOLVE_SYMLINKS
));
(
void
)
unpack_dirname
(
mysql_unpacked_real_data_home
,
buff
);
convert_dirname
(
language
,
language
,
NullS
);
(
void
)
my_load_path
(
mysql_home
,
mysql_home
,
""
);
// Resolve current dir
(
void
)
my_load_path
(
mysql_real_data_home
,
mysql_real_data_home
,
mysql_home
);
...
...
sql/repl_failsafe.cc
View file @
838fa0d6
...
...
@@ -926,7 +926,7 @@ int load_master_data(THD* thd)
0
,
(
SLAVE_IO
|
SLAVE_SQL
)))
send_error
(
thd
,
ER_MASTER_INFO
);
strmake
(
active_mi
->
master_log_name
,
row
[
0
],
sizeof
(
active_mi
->
master_log_name
));
sizeof
(
active_mi
->
master_log_name
)
-
1
);
active_mi
->
master_log_pos
=
my_strtoll10
(
row
[
1
],
(
char
**
)
0
,
&
error
);
/* at least in recent versions, the condition below should be false */
if
(
active_mi
->
master_log_pos
<
BIN_LOG_HEADER_SIZE
)
...
...
sql/sql_parse.cc
View file @
838fa0d6
...
...
@@ -65,7 +65,8 @@ static bool append_file_to_dir(THD *thd, const char **filename_ptr,
const
char
*
table_name
);
static
TABLE_LIST
*
get_table_by_alias
(
TABLE_LIST
*
tl
,
const
char
*
db
,
const
char
*
alias
);
const
char
*
alias
);
static
bool
test_if_data_home_dir
(
const
char
*
dir
);
const
char
*
any_db
=
"*any*"
;
// Special symbol for check_access
...
...
@@ -2531,6 +2532,20 @@ mysql_execute_command(THD *thd)
"INDEX DIRECTORY option ignored"
);
create_info
.
data_file_name
=
create_info
.
index_file_name
=
NULL
;
#else
if
(
test_if_data_home_dir
(
lex
->
create_info
.
data_file_name
))
{
my_error
(
ER_WRONG_ARGUMENTS
,
MYF
(
0
),
"DATA DIRECORY"
);
res
=
-
1
;
break
;
}
if
(
test_if_data_home_dir
(
lex
->
create_info
.
index_file_name
))
{
my_error
(
ER_WRONG_ARGUMENTS
,
MYF
(
0
),
"INDEX DIRECORY"
);
res
=
-
1
;
break
;
}
/* Fix names if symlinked tables */
if
(
append_file_to_dir
(
thd
,
&
create_info
.
data_file_name
,
create_table
->
real_name
)
||
...
...
@@ -5920,3 +5935,47 @@ Item *negate_expression(THD *thd, Item *expr)
return
negated
;
return
new
Item_func_not
(
expr
);
}
/*
Check if path does not contain mysql data home directory
SYNOPSIS
test_if_data_home_dir()
dir directory
conv_home_dir converted data home directory
home_dir_len converted data home directory length
RETURN VALUES
0 ok
1 error
*/
static
bool
test_if_data_home_dir
(
const
char
*
dir
)
{
char
path
[
FN_REFLEN
],
conv_path
[
FN_REFLEN
];
uint
dir_len
,
home_dir_len
=
strlen
(
mysql_unpacked_real_data_home
);
DBUG_ENTER
(
"test_if_data_home_dir"
);
if
(
!
dir
)
DBUG_RETURN
(
0
);
(
void
)
fn_format
(
path
,
dir
,
""
,
""
,
(
MY_RETURN_REAL_PATH
|
MY_RESOLVE_SYMLINKS
));
dir_len
=
unpack_dirname
(
conv_path
,
dir
);
if
(
home_dir_len
<=
dir_len
)
{
if
(
lower_case_file_system
)
{
if
(
!
my_strnncoll
(
default_charset_info
,
(
const
uchar
*
)
conv_path
,
home_dir_len
,
(
const
uchar
*
)
mysql_unpacked_real_data_home
,
home_dir_len
))
DBUG_RETURN
(
1
);
}
else
if
(
!
memcmp
(
conv_path
,
mysql_unpacked_real_data_home
,
home_dir_len
))
DBUG_RETURN
(
1
);
}
DBUG_RETURN
(
0
);
}
sql/sql_show.cc
View file @
838fa0d6
...
...
@@ -136,7 +136,8 @@ int mysqld_show_tables(THD *thd,const char *db,const char *wild)
{
Item_string
*
field
=
new
Item_string
(
""
,
0
,
thd
->
charset
());
List
<
Item
>
field_list
;
char
path
[
FN_LEN
],
*
end
;
char
path
[
FN_REFLEN
],
*
end
;
// for unpack_dirname()
List
<
char
>
files
;
char
*
file_name
;
Protocol
*
protocol
=
thd
->
protocol
;
...
...
@@ -457,7 +458,7 @@ int mysqld_extend_show_tables(THD *thd,const char *db,const char *wild)
Item
*
item
;
List
<
char
>
files
;
List
<
Item
>
field_list
;
char
path
[
FN_
LEN
];
char
path
[
FN_
REFLEN
];
// for unpack_dirname()
char
*
file_name
;
TABLE
*
table
;
Protocol
*
protocol
=
thd
->
protocol
;
...
...
sql/unireg.cc
View file @
838fa0d6
...
...
@@ -140,6 +140,14 @@ bool mysql_create_frm(THD *thd, my_string file_name,
strmake
((
char
*
)
forminfo
+
47
,
create_info
->
comment
?
create_info
->
comment
:
""
,
60
);
forminfo
[
46
]
=
(
uchar
)
strlen
((
char
*
)
forminfo
+
47
);
// Length of comment
#ifdef EXTRA_DEBUG
/*
EXTRA_DEBUG causes strmake() to initialize its buffer behind the
payload with a magic value to detect wrong buffer-sizes. We
explicitly zero that segment again.
*/
memset
((
char
*
)
forminfo
+
47
+
forminfo
[
46
],
0
,
61
-
forminfo
[
46
]);
#endif
if
(
my_pwrite
(
file
,(
byte
*
)
fileinfo
,
64
,
0L
,
MYF_RW
)
||
my_pwrite
(
file
,(
byte
*
)
keybuff
,
key_info_length
,
...
...
strings/strmake.c
View file @
838fa0d6
...
...
@@ -28,23 +28,25 @@
#include <my_global.h>
#include "m_string.h"
#ifdef BAD_STRING_COMPILER
char
*
strmake
(
char
*
dst
,
const
char
*
src
,
uint
length
)
char
*
strmake
(
register
char
*
dst
,
register
const
char
*
src
,
uint
length
)
{
reg1
char
*
res
;
if
((
res
=
memccpy
(
dst
,
src
,
0
,
length
)))
return
res
-
1
;
dst
[
length
]
=
0
;
return
dst
+
length
;
}
#define strmake strmake_overlapp
/* Use orginal for overlapping str */
#ifdef EXTRA_DEBUG
/*
'length' is the maximum length of the string; the buffer needs
to be one character larger to accomodate the terminating '\0'.
This is easy to get wrong, so we make sure we write to the
entire length of the buffer to identify incorrect buffer-sizes.
We only initialise the "unused" part of the buffer here, a) for
efficiency, and b) because dst==src is allowed, so initialising
the entire buffer would overwrite the source-string. Also, we
write a character rather than '\0' as this makes spotting these
problems in the results easier.
*/
uint
n
=
strlen
(
src
)
+
1
;
if
(
n
<=
length
)
memset
(
dst
+
n
,
(
int
)
'Z'
,
length
-
n
+
1
);
#endif
char
*
strmake
(
register
char
*
dst
,
register
const
char
*
src
,
uint
length
)
{
while
(
length
--
)
if
(
!
(
*
dst
++
=
*
src
++
))
return
dst
-
1
;
...
...
support-files/mysql.spec.sh
View file @
838fa0d6
%define mysql_version @VERSION@
# Copyright (C) 2000-2007 MySQL AB
#
# 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; see the file COPYING. If not, write to the
# Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston
# MA 02110-1301 USA.
%define mysql_version @VERSION@
%define mysql_vendor MySQL AB
# use "rpmbuild --with static" or "rpm --define '_with_static 1'" (for RPM 3.x)
# to enable static linking (off by default)
%
{
?_with_static:%define STATIC_BUILD 1
}
...
...
@@ -9,7 +27,7 @@
%define release 0.glibc23
%endif
%define license GPL
%define mysqld_user
mysql
%define mysqld_user mysql
%define mysqld_group mysql
%define server_suffix
-standard
%define mysqldatadir /var/lib/mysql
...
...
@@ -20,6 +38,23 @@
%define see_base For a description of MySQL see the base MySQL RPM or http://www.mysql.com
# On SuSE 9 no separate "debuginfo" package is built. To enable basic
# debugging on that platform, we don't strip binaries on SuSE 9. We
# disable the strip of binaries by redefining the RPM macro
# "__os_install_post" leaving out the script calls that normally does
# this. We do this in all cases, as on platforms where "debuginfo" is
# created, a script "find-debuginfo.sh" will be called that will do
# the strip anyway, part of separating the executable and debug
# information into separate files put into separate packages.
#
# Some references (shows more advanced conditional usage):
# http://www.redhat.com/archives/rpm-list/2001-November/msg00257.html
# http://www.redhat.com/archives/rpm-list/2003-February/msg00275.html
# http://www.redhat.com/archives/rhl-devel-list/2004-January/msg01546.html
# http://lists.opensuse.org/archive/opensuse-commit/2006-May/1171.html
%define __os_install_post /usr/lib/rpm/brp-compress
Name: MySQL
Summary: MySQL: a very fast and reliable SQL database server
Group: Applications/Databases
...
...
@@ -29,7 +64,7 @@ License: %{license}
Source: http://www.mysql.com/Downloads/MySQL-@MYSQL_BASE_VERSION@/mysql-%
{
mysql_version
}
.tar.gz
URL: http://www.mysql.com/
Packager: MySQL Production Engineering Team <build@mysql.com>
Vendor:
MySQL AB
Vendor:
%
{
mysql_vendor
}
Provides: msqlormysql MySQL-server mysql
BuildRequires: ncurses-devel
Obsoletes: mysql
...
...
@@ -46,12 +81,9 @@ is intended for mission-critical, heavy-load production systems as well
as
for
embedding into mass-deployed software. MySQL is a trademark of
MySQL AB.
The MySQL software has Dual Licensing, which means you can use the MySQL
software free of charge under the GNU General Public License
(
http://www.gnu.org/licenses/
)
.
You can also purchase commercial MySQL
licenses from MySQL AB
if
you
do
not wish to be bound by the terms of
the GPL. See the chapter
"Licensing and Support"
in
the manual
for
further info.
Copyright
(
C
)
2000-2007 MySQL AB
This software comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to modify and redistribute it under the GPL license.
The MySQL web site
(
http://www.mysql.com/
)
provides the latest
news and information about the MySQL software. Also please see the
...
...
@@ -71,12 +103,9 @@ is intended for mission-critical, heavy-load production systems as well
as
for
embedding into mass-deployed software. MySQL is a trademark of
MySQL AB.
The MySQL software has Dual Licensing, which means you can use the MySQL
software free of charge under the GNU General Public License
(
http://www.gnu.org/licenses/
)
.
You can also purchase commercial MySQL
licenses from MySQL AB
if
you
do
not wish to be bound by the terms of
the GPL. See the chapter
"Licensing and Support"
in
the manual
for
further info.
Copyright
(
C
)
2000-2007 MySQL AB
This software comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to modify and redistribute it under the GPL license.
The MySQL web site
(
http://www.mysql.com/
)
provides the latest
news and information about the MySQL software. Also please see the
...
...
@@ -86,7 +115,7 @@ This package includes the MySQL server binary (incl. InnoDB) as well
as related utilities to run and administrate a MySQL server.
If you want to access and work with the database, you have to
install
package
"MySQL-client"
as well!
the
package
"MySQL-client"
as well!
%package client
Summary: MySQL - Client
...
...
@@ -253,7 +282,7 @@ sh -c "PATH=\"${MYSQL_BUILD_PATH:-$PATH}\" \
--includedir=%{_includedir}
\
--mandir=%{_mandir}
\
--enable-thread-safe-client
\
--with-readline ;
--with-readline ;
\
# Add this for more debugging support
# --with-debug
# Add this for MyISAM RAID support:
...
...
@@ -319,7 +348,10 @@ then
cp
-fp
config.log
"
$MYSQL_MAXCONFLOG_DEST
"
fi
make test-bt
(
cd
mysql-test
perl ./mysql-test-run.pl
--comment
=
"max"
--force
--report-features
perl ./mysql-test-run.pl
--comment
=
"max+ps"
--force
--ps-protocol
true
)
# Save mysqld-max
./libtool
--mode
=
execute
cp
sql/mysqld sql/mysqld-max
...
...
@@ -332,7 +364,7 @@ make test-bt
(
cd
ndb
;
make
install
DESTDIR
=
$RBR
)
# Install embedded server library in the build root
install
-m
644 libmysqld/libmysqld.a
$RBR
%
{
_libdir
}
/mysql/
install
-m644
libmysqld/libmysqld.a
$RBR
%
{
_libdir
}
/mysql/
# Include libgcc.a in the devel subpackage (BUG 4921)
if
expr
"
$CC
"
:
".*gcc.*"
>
/dev/null
;
...
...
@@ -341,7 +373,7 @@ then
if
[
-f
$libgcc
]
then
%define have_libgcc 1
install
-m
644
$libgcc
$RBR
%
{
_libdir
}
/mysql/libmygcc.a
install
-m644
$libgcc
$RBR
%
{
_libdir
}
/mysql/libmygcc.a
fi
fi
...
...
@@ -382,10 +414,8 @@ then
cp
-fp
config.log
"
$MYSQL_CONFLOG_DEST
"
fi
(
cd
mysql-test
perl ./mysql-test-run.pl
--force
--report-features
perl ./mysql-test-run.pl
--force
--ps-protocol
true
)
echo
"# standard"
make test-bt
%install
RBR
=
$RPM_BUILD_ROOT
...
...
@@ -400,7 +430,6 @@ install -d $RBR%{_libdir}
install
-d
$RBR
%
{
_mandir
}
install
-d
$RBR
%
{
_sbindir
}
# Install all binaries stripped
make install-strip
DESTDIR
=
$RBR
benchdir_root
=
%
{
_datadir
}
...
...
@@ -414,12 +443,12 @@ install -s -m755 $MBD/sql/mysqld-max $RBR%{_sbindir}/mysqld-max
install
-s
-m755
$MBD
/extra/perror.ndb
$RBR
%
{
_bindir
}
/perror
# install symbol files ( for stack trace resolution)
install
-m644
$MBD
/sql/mysqld-max.sym
$RBR
%
{
_libdir
}
/mysql/mysqld-max.sym
install
-m644
$MBD
/sql/mysqld.sym
$RBR
%
{
_libdir
}
/mysql/mysqld.sym
install
-m
644
$MBD
/sql/mysqld-max.sym
$RBR
%
{
_libdir
}
/mysql/mysqld-max.sym
install
-m
644
$MBD
/sql/mysqld.sym
$RBR
%
{
_libdir
}
/mysql/mysqld.sym
# Install logrotate and autostart
install
-m644
$MBD
/support-files/mysql-log-rotate
$RBR
%
{
_sysconfdir
}
/logrotate.d/mysql
install
-m755
$MBD
/support-files/mysql.server
$RBR
%
{
_sysconfdir
}
/init.d/mysql
install
-m
644
$MBD
/support-files/mysql-log-rotate
$RBR
%
{
_sysconfdir
}
/logrotate.d/mysql
install
-m
755
$MBD
/support-files/mysql.server
$RBR
%
{
_sysconfdir
}
/init.d/mysql
# Create a symlink "rcmysql", pointing to the init.script. SuSE users
# will appreciate that, as all services usually offer this.
...
...
@@ -451,7 +480,7 @@ fi
mysql_datadir
=
%
{
mysqldatadir
}
# Create data directory if needed
if
test
!
-d
$mysql_datadir
;
then
mkdir
-m755
$mysql_datadir
;
fi
if
test
!
-d
$mysql_datadir
;
then
mkdir
-m
755
$mysql_datadir
;
fi
if
test
!
-d
$mysql_datadir
/mysql
;
then
mkdir
$mysql_datadir
/mysql
;
fi
if
test
!
-d
$mysql_datadir
/test
;
then
mkdir
$mysql_datadir
/test
;
fi
...
...
@@ -493,12 +522,11 @@ chmod -R og-rw $mysql_datadir/mysql
# Allow safe_mysqld to start mysqld and print a message before we exit
sleep
2
%post ndb-storage
mysql_clusterdir
=
/var/lib/mysql-cluster
# Create cluster directory if needed
if
test
!
-d
$mysql_clusterdir
;
then
mkdir
-m755
$mysql_clusterdir
;
fi
if
test
!
-d
$mysql_clusterdir
;
then
mkdir
-m
755
$mysql_clusterdir
;
fi
%post Max
...
...
@@ -642,10 +670,12 @@ fi
%files ndb-storage
%defattr
(
-,root,root,0755
)
%attr
(
755, root, root
)
%
{
_sbindir
}
/ndbd
%doc %attr
(
644, root, man
)
%
{
_mandir
}
/man8/ndbd.8
*
%files ndb-management
%defattr
(
-,root,root,0755
)
%attr
(
755, root, root
)
%
{
_sbindir
}
/ndb_mgmd
%doc %attr
(
644, root, man
)
%
{
_mandir
}
/man8/ndb_mgmd.8
*
%files ndb-tools
%defattr
(
-,root,root,0755
)
...
...
@@ -737,6 +767,10 @@ fi
# itself - note that they must be ordered by date (important when
# merging BK trees)
%changelog
*
Wed Mar 19 2008 Joerg Bruehe <joerg@mysql.com>
- Add the man pages
for
"ndbd"
and
"ndb_mgmd"
.
*
Fri Mar 02 2007 Joerg Bruehe <joerg@mysql.com>
- Add several man pages
for
NDB which are now created.
...
...
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