There were two problems: RESET QUERY CACHE took a long time to complete
and other threads were blocked during this time.
The patch does three things:
1 fixes a bug with improper use of test-lock-test_again technique.
AKA Double-Checked Locking is applicable here only in few places.
2 Somewhat improves performance of RESET QUERY CACHE.
Do my_hash_reset() instead of deleting elements one by one. Note
however that the slowdown also happens when inserting into sorted
list of free blocks, should be rewritten using balanced tree.
3 Makes RESET QUERY CACHE non-blocking.
The patch adjusts the locking protocol of the query cache in the
following way: it introduces a flag flush_in_progress, which is
set when Query_cache::flush_cache() is in progress. This call
sets the flag on enter, and then releases the lock. Every other
call is able to acquire the lock, but does nothing if
flush_in_progress is set (as if the query cache is disabled).
The only exception is the concurrent calls to
Query_cache::flush_cache(), that are blocked until the flush is
over. When leaving Query_cache::flush_cache(), the lock is
acquired and the flag is reset, and one thread waiting on
Query_cache::flush_cache() (if any) is notified that it may
proceed.
Socket timeouts in client library were used only on Windows.
The solution is to use socket timeouts in client library on all
systems were they are supported.
No test case is provided because it is impossible to simulate network
failure in current test suit.
sql/net_serv.cc:
Retry indefinitely only if got EINTR.
vio/viosocket.c:
Set socket timeouts on POSIX systems as well as on Windows.
Socket timeouts in client library were used only on Windows.
The solution is to use socket timeouts in client library on all
systems were they are supported.
No test case is provided because it is impossible to simulate network
failure in current test suit.
Changes for Netware
sql/net_serv.cc:
Netware needs <sys/select.h>
configure.in:
Call of "comp_err" has moved, changed code for Netware that
edits make files to reflect this
netware/BUILD/compile-netware-END:
After correcting "configure.in" to edit make files correctly,
removed obsolete "sed" of "extra/Makefile.am" for Netware
include/config-win.h:
force time_t to be 32 bit on Visual C++ 2005 or later
sql/net_serv.cc:
include winsock after my_global so the time_t #define can take effect
storage/csv/ha_tina.cc:
fix the csv engine so that it supports DOS, Unix, and Mac line endings
Removed Berkeley DB
configure.in:
Adjusted Netware support
basic.t.c:
Change for Netware
Makefile.am:
Use thread safe libmysqlclient_r if it was built
valgrind.supp:
Hide report about strlen/_dl_init_paths
ha_tina.cc:
Temporarely disable CSV engine on Netware,
as the engine depends on mmap()
net_serv.cc:
Include <sys/select.h> for Netware
sql/net_serv.cc:
Include <sys/select.h> for Netware
storage/csv/ha_tina.cc:
Temporarely disable CSV engine on Netware,
as the engine depends on mmap()
mysql-test/valgrind.supp:
Hide report about strlen/_dl_init_paths
tests/Makefile.am:
Use thread safe libmysqlclient_r if it was built
unittest/mytap/t/basic.t.c:
Change for Netware
configure.in:
Adjusted Netware support
support-files/mysql.spec.sh:
Removed Berkeley DB
Removed Berkeley DB
configure.in:
Adjusted Netware support
basic.t.c:
Change for Netware
Makefile.am:
Use thread safe libmysqlclient_r if it was built
valgrind.supp:
Hide report about strlen/_dl_init_paths
ha_tina.cc:
Temporarely disable CSV engine on Netware,
as the engine depends on mmap()
net_serv.cc:
Include <sys/select.h> for Netware
- Change to use non blocking read to empty channel in case of too large sd number
- Don't check for too large socket number on Windows.
sql/net_serv.cc:
Windows does not need protection from sd >= FD_SETSIZE, it uses an array to store the sd's it should read from.
Change the handler for when "net_data_is_ready" returns -1 to perform nonblocking read to empty the net.
Only include that handler if HAVE_POLL is not defined and not windows
- Use 'poll' if available
- Check that sd <= FD_SETSIZE if using 'select'
- Handle case when 'net_data_is_ready' returns -1, ie. sd > FD_SETSIZE and 'select' is used
sql/net_serv.cc:
Use 'poll' in favor of 'select' if avaliable
This is to avoid the limitation with 'select' only being able to handle fd's with numbers <= 1024 as default.
If 'poll' is not available use 'select' but check that we are not having a number higher than FD_SETSIZE
Handle the case when 'net_data_is_ready' can't check if there is data to read, since the sd number is too high
- Use 'poll' if available
- Check that sd <= FD_SETSIZE if using 'select'
- Handle case when 'net_data_is_ready' returns -1, ie. sd > FD_SETSIZE and 'select' is used
- Detect that connection to server has been broken in "net_clear". Since
net_clear is always called before we send command to server, we can be sure
that server has not received the command.
mysql-test/r/wait_timeout.result:
Update test result
mysql-test/t/wait_timeout-master.opt:
Decrease wait_timeout value to avoid unneccessary sleeps
mysql-test/t/wait_timeout.test:
Test that same error message is returned when disconnected regardless of connection is socket or TCP
Decrease sleep times
sql/net_serv.cc:
Make "net_clear" detect if connection with server has been broken by
performing a select. If the select returns that there are data to read but
no data can be read, that means the connection is broken. Signal disconnected
to "write" functions by setting error to 2.
- Detect that connection to server has been broken in "net_clear". Since
net_clear is always called before we send command to server, we can be sure
that server has not received the command.
into mysql.com:/home/jimw/my/mysql-5.0-clean
include/my_global.h:
Auto merged
include/my_pthread.h:
Auto merged
include/violite.h:
Auto merged
mysql-test/r/ndb_autodiscover.result:
Auto merged
ndb/src/mgmsrv/MgmtSrvr.cpp:
Auto merged
ndb/src/ndbapi/SignalSender.cpp:
Auto merged
sql-common/client.c:
Auto merged
sql/examples/ha_archive.cc:
Auto merged
sql/net_serv.cc:
Auto merged
vio/vio.c:
Auto merged
vio/viosocket.c:
Auto merged
vio/viossl.c:
Auto merged
configure.in:
Resolve conflicts
into selena.:H:/MYSQL/src/#05588-mysql-4.1
BitKeeper/deleted/.del-lib_vio.c~d779731a1e391220:
Auto merged
BitKeeper/deleted/.del-mini_client.cc~8677895ec8169183:
Auto merged
include/violite.h:
Auto merged
sql/net_serv.cc:
Auto merged
vio/vio.c:
Auto merged
vio/viosocket.c:
Auto merged
include/my_global.h:
SCCS merged
read timeout properly on win32.
include/my_global.h:
Added win32 specific socket timeout error code.
include/violite.h:
Added vio_was_interrupted function that returns true if operation was
not completed due to timeout.
sql/mini_client.cc:
added a check that replication read was not completed due to timeout.
sql/net_serv.cc:
net->last_errno should be equal to ER_NET_READ_INTERRUPTED in case if read
operation was not completed due to timeout.
vio/vio.c:
added initialization code for vio_was_interrupted() function.
vio/viosocket.c:
Added vio_was_interrupted function that returns true if operation was
not completed due to timeout.
into mysql.com:/home/bk/mysql-5.0
BitKeeper/etc/config:
Auto merged
include/my_global.h:
Auto merged
sql/des_key_file.cc:
Auto merged
sql/item_strfunc.cc:
Auto merged
sql/mysql_priv.h:
Auto merged
sql/net_serv.cc:
Auto merged
vio/vio.c:
Auto merged
vio/viosocket.c:
Auto merged
sql/log.cc:
Manual merge
sql/slave.cc:
Manual merge
include/my_global.h:
set SOCKET_EWOULDBLOCK to the proper windows def WSAEWOULDBLOCK
sql/net_serv.cc:
fixed typo with using 3 leading underscores instead of 2
vio/vio.c:
fixed typo with using 3 leading underscores instead of 2
vio/viosocket.c:
fixed typo with using 3 leading underscores instead of 2
into bk-internal.mysql.com:/users/rburnett/mysql-5.0
BitKeeper/etc/logging_ok:
auto-union
include/violite.h:
Auto merged
sql/net_serv.cc:
Auto merged
vio/viosocket.c:
Auto merged
vio/viossl.c:
Auto merged
Added an extra parameter to all calls to timeout().
1 means we want to set the write timeout
0 means we wnat to set the read timeout
viossl.c:
Add which parameter to ssl timeout routine
vio_priv.h:
Added which parameter to vio_ignore_timeout and vio_ssl_timeout
violite.h:
Add which parameter to vio_timeout sigs
net_serv.cc:
Use proper which code in call to vio_timeout to set the proper timeout
viosocket.c:
Set the appropriate timeout in vio_timeout
vio/viosocket.c:
Set the appropriate timeout in vio_timeout
sql/net_serv.cc:
Use proper which code in call to vio_timeout to set the proper timeout
include/violite.h:
Add which parameter to vio_timeout sigs
vio/vio_priv.h:
Added which parameter to vio_ignore_timeout and vio_ssl_timeout
vio/viossl.c:
Add which parameter to ssl timeout routine
BitKeeper/etc/logging_ok:
Logging to logging@openlogging.org accepted
Added an extra parameter to all calls to timeout().
1 means we want to set the write timeout
0 means we wnat to set the read timeout
viossl.c:
Add which parameter to ssl timeout routine
vio_priv.h:
Added which parameter to vio_ignore_timeout and vio_ssl_timeout
violite.h:
Add which parameter to vio_timeout sigs
net_serv.cc:
Use proper which code in call to vio_timeout to set the proper timeout
viosocket.c:
Set the appropriate timeout in vio_timeout
Build-tools/Do-compile:
Change already present in 5.0
configure.in:
Do not propagate a 4.0 version number to the 5.0 tree.
include/my_sys.h:
Change already present in 5.0.
mysys/hash.c:
For Sun compilers, 'static inline' is ok.
mysys/my_bitmap.c:
Change already present in 5.0
sql/item_strfunc.cc:
Change already present in 5.0
sql/net_serv.cc:
Change already present in 5.0
to 'libmysql/net.c'.
sql/net_serv.cc:
Even though this is (by name) a C++ file, it is later symlinked to 'libmysql/net.c'
and so the source will be treated as plain C: No C++ comments in here!
include/mysql_com.h:
Flag which prevent sending error after EOF or OK sent
mysql-test/r/kill.result:
test of blocking of sending ERROR after OK or EOF
mysql-test/t/kill.test:
test of blocking of sending ERROR after OK or EOF
sql/item_func.cc:
typo fixed
sql/net_serv.cc:
initialization of flag
sql/protocol.cc:
check and set of flag no_send_error
sql/sql_parse.cc:
droping flag no_send_error before new command/query execution
mysql_admin_table() attempted to write to a vio which was 0. I could have fixed mysql_admin_table()
but fixing my_net_write() looked more future-proof.
sql/net_serv.cc:
If no VIO, no write.