"If 2 master threads with same-name temp table, slave makes bad binlog"
and (two birds with one stone) for
BUG#1240 "slave of slave breaks when STOP SLAVE was issud on parent slave
and temp tables".
Here is the design change:
in a slave running with --log-slave-updates, events are now logged with the
thread id they had on the master. So no more id conflicts between master threads,
but introduces id conflicts between one master thread and one normal
client thread connected to the slave. This is solved by storing the server id
in the temp table's name.
New test which requires mysql-test-run to be run with --manager,
otherwise it will be skipped.
Undoing a Monty's change (hum, a chill runs down my spine ;) which was
"Cleanup temporary tables when slave ends" in ChangeSet 1.1572.1.1.
mysql-test/mysql-test-run.sh:
One new test which needs more than one slave so must be hardcoded in mysql-test-run.sh.
sql/log_event.cc:
The event needs to carry a slave_proxy_id (which is set at event's creation
and used at event's logging).
This is used for events created by ::exec_event() in the slave SQL thread:
now we want to log these events with the thread id they had on the master.
This is so that several same-name temp tables simultaneously created on
the master end up with not the same thread id in the slave's binlog.
sql/log_event.h:
Query and Load need to carry a slave_proxy_id, like they carried a thread_id
(to replicate temp tables well).
sql/slave.cc:
Do not free temp tables in the slave SQL thread. Or they will be lost when
one does STOP SLAVE / START SLAVE.
We even save them in rli->save_temporary_tables and set thd->temporary_tables=0
to prevent them to be freed.
sql/sql_base.cc:
Put the server id in the table cache key name for temp tables
(we already put the slave_proxy_id, but we also need the server id
in case normal clients (not slave threads) are using temp tables
on the slave).
sql/unireg.h:
4 more bytes, to store the server id.
mysql --install mysql --defualts-file=path-to-file
(Bug #1643)
include/mysql_com.h:
MySQL should install as default service "mysqld"
sql/mysqld.cc:
Fix for problem of installing MySQL as a service with
mysql --install mysql --defualts-file=path-to-file
max_user_connections is not set - that is no limit - so that when
max_user_connections is set (with SET) old connections are also
taken into account
mutexes are added where appropriate
Backport from 4.1: reduce InnoDB memory consumption if buf pool < 8 MB
sql/ha_innodb.cc:
Backport from 4.1: reduce InnoDB memory consumption if buf pool < 8 MB
innobase/include/os0thread.h:
Backport from 4.1: reduce InnoDB memory consumption if buf pool < 8 MB
innobase/include/srv0srv.h:
Backport from 4.1: reduce InnoDB memory consumption if buf pool < 8 MB
innobase/srv/srv0srv.c:
Backport from 4.1: reduce InnoDB memory consumption if buf pool < 8 MB
innobase/srv/srv0start.c:
Backport from 4.1: reduce InnoDB memory consumption if buf pool < 8 MB
innobase/thr/thr0loc.c:
Backport from 4.1: reduce InnoDB memory consumption if buf pool < 8 MB
while the slave is connected.
mysql-test/t/rpl_trunc_binlog.test:
don't RESET MASTER while the slave is connected; this could confuse the master or slave.
(In replication you don't RESET MASTER while a slave is connected!)
sql/slave.cc:
typo
Portability fix (For Mac OS X)
configure.in:
Added detection of malloc / sys/malloc
include/my_pthread.h:
Safety fix to detect multiple calls to my_thread_end()
libmysqld/lib_sql.cc:
Remove duplicate call to my_thread_end()
mysys/charset.c:
Cleanup indentation
Remove some short variable names
mysys/my_thr_init.c:
Safety fix to detect multiple calls to my_thread_end()
sql/sql_test.cc:
Portability fix (For Mac OS X)
sql/sql_select.cc:
back to the bug #1274:
the following query
EXPLAIN SELECT SQL_CALC_FOUND_ROWS race_name
FROM races WHERE race_name LIKE '%Madison%' ORDER BY race_date DESC LIMIT 0,100
+-------+------+---------------+------+---------+------+--------+-----------------------------+
| table | type | possible_keys | key | key_len | ref | rows | Extra |
+-------+------+---------------+------+---------+------+--------+-----------------------------+
| races | ALL | NULL | NULL | NULL | NULL | 505821 | Using where; Using filesort |
+-------+------+---------------+------+---------+------+--------+-----------------------------+
The query returns no rows.
There are two problems with it:
- wrong access plan is chosed (sequential index scan in reverse order,
which is VERY SLOW in case of MyISAM table + packed keys)
It's wrong, because it doesn't take into account that SQL_CALC_FOUND_ROWS
is present, in other words, is based on assumtion that LIMIT
clause decrease number of rows to access significantly, which is
not true as all rows are accessed.
- the access plan is not shown in the EXPLAIN (bug #1560). I'm not
fixing it here
Fixed chsize() problem on windows
Extend default timeout on windows clients to 1 year (to avoid timeout problems)
include/mysql.h:
Added client timeouts (for TCP/IP)
libmysql/libmysql.c:
Added client timeouts (for TCP/IP)
mysql-test/r/create.result:
More tests for CREATE TABLE IF NOT EXISTS ... SELECT
mysql-test/t/create.test:
More tests for CREATE TABLE IF NOT EXISTS ... SELECT
mysys/my_chsize.c:
Fix for windows
sql/handler.h:
Remove not used field 'if_not_exists'
Ordered fields to be more optimized for new CPU's
Added field 'table_existed'
sql/slave.cc:
Cleanup temporary tables when slave ends
sql/sql_class.h:
Remove not used 'do_not_drop' field
sql/sql_insert.cc:
Better fix for CREATE TABLE IF NOT EXISTS ... SELECT
sql/sql_table.cc:
Better fix for CREATE TABLE IF NOT EXISTS ... SELECT
into mashka.mysql.fi:/home/my/mysql-4.0
sql/mysqld.cc:
Auto merged
sql/set_var.cc:
Auto merged
sql/sql_class.h:
Auto merged
sql/sql_parse.cc:
Auto merged
BitKeeper/etc/ignore:
added scripts/make_sharedlib_distribution
mysql-test/r/variables.result:
Add test for enum_system_variable=NULL
mysql-test/t/variables.test:
Add test for enum_system_variable=NULL
sql/set_var.cc:
Fixed bug in SET enum_system_variable=NULL
Moved some array elements to get result sorted
query_alloc_block_size, query_prealloc_size, range_alloc_block_size,transaction_alloc_block_size and transaction_prealloc_size
Add more checks for "out of memory" detection in range optimization
configure.in:
Added detection of mallinfo
mysql-test/r/variables.result:
Test of new variables
mysql-test/t/variables.test:
Test of new variables
sql/ha_berkeley.cc:
Use init_sql_alloc instead of init_alloc_root for better OOM detection
sql/log_event.cc:
Add new user variables for tuning memory usage
sql/mysql_priv.h:
Add new user variables for tuning memory usage
sql/mysqld.cc:
Add new user variables for tuning memory usage
sql/opt_ft.cc:
Add new user variables for tuning memory usage
sql/opt_ft.h:
Add new user variables for tuning memory usage
sql/opt_range.cc:
Add new user variables for tuning memory usage
Add more checks for out of memory conditions
sql/opt_range.h:
Add new user variables for tuning memory usage
sql/set_var.cc:
Add new user variables for tuning memory usage
sql/sql_acl.cc:
Add new user variables for tuning memory usage
sql/sql_class.h:
Add new user variables for tuning memory usage
sql/sql_delete.cc:
Add new user variables for tuning memory usage
sql/sql_parse.cc:
Add new user variables for tuning memory usage
sql/sql_select.cc:
Add new user variables for tuning memory usage
sql/sql_test.cc:
Add information about memory useage if system supports mallinfo()
sql/sql_udf.cc:
Add new user variables for tuning memory usage
sql/sql_update.cc:
Add new user variables for tuning memory usage
sql/table.cc:
Add new user variables for tuning memory usage
a Format_description_log_event (or maybe it will be named
Description_log_event) which is not recognized by 4.0, so
a 4.0 can't be a slave of 5.0. We detect it early to produce
a helpful message instead of "corrupted relay log" later.
sql/slave.cc:
Make the slave die if master is 5.0.
Rotate_log_event::exec_event() believed that the relay log was corrupted. Fixed it
by moving the test for corruption to Start_log_event::exec_event().
Changed Rotate_log_event::exec_event() to not increment positions when the
event is seen in the middle of a transaction.
I did a separate commit in 4.1 (so this should not be merged to 4.0) because
code is a bit different in 4.1.
A test to see if the slave detects when the master died while writing a
transaction to the binlog (uses a forged truncated binlog I made).
sql/log_event.cc:
When the I/O thread was stopped while copying a long transaction, and restarted,
Rotate_log_event::exec_event() believed that the relay log was corrupted. Fixed it
by moving the test for corruption to Start_log_event::exec_event().
Changed Rotate_log_event::exec_event() to not increment positions when the
event is seen in the middle of a transaction.
Use forced close of socket to make mysqld shutdown faster when used under valgrind
mysql-test/mysql-test-run.sh:
Added --skip-bdb for valgrind
mysql-test/r/user_var.result:
Extended test for user variables
mysql-test/t/user_var.test:
Extended test for user variables
sql/item_func.cc:
Optimized code for setting user variables with := and fixed some bugs in old code
sql/item_func.h:
Optimized code for setting user variables
sql/log.cc:
Fixed comments
sql/mysqld.cc:
Use forced close of socket to make mysqld shutdown faster when used under valgrind
sql/sql_class.h:
Optimized code for setting user variables
from ulong to ulonglong by defining -DBIG_JOINS
sql/mysql_priv.h:
- enable changing the number of table bits for JOINs to be increased
from ulong to ulonglong by defining BIG_JOINS
Add quoting for use `database` for mysqlbinlog
Removed test ins0000001
Add support for --replace for exec in mysqltest
Don't refer to install dir in mysqlbinlog.result
BitKeeper/deleted/.del-ins000001.result~f45c599efdf8352b:
Delete: mysql-test/r/ins000001.result
BitKeeper/deleted/.del-ins000001.test~2428ee5c9b1bc483:
Delete: mysql-test/t/ins000001.test
client/mysqlbinlog.cc:
Removed random chars after filename for LOAD DATA INFILE
client/mysqltest.c:
Add support for --replace for 'exec'
mysql-test/r/drop_temp_table.result:
Updated results after quoting change
mysql-test/r/fulltext_multi.result:
Updated results after quoting change
mysql-test/r/fulltext_order_by.result:
Updated results after quoting change
mysql-test/r/insert.result:
New tests
mysql-test/r/insert_select.result:
Updated results after quoting change
mysql-test/r/mix_innodb_myisam_binlog.result:
Updated results after quoting change
mysql-test/r/mysqlbinlog.result:
Updated results after quoting change
mysql-test/r/rpl_log.result:
Updated results after quoting change
mysql-test/t/fulltext_multi.test:
Remove 'use'
mysql-test/t/fulltext_order_by.test:
Remove 'use'
mysql-test/t/insert.test:
Merge test with ins0000001.test
mysql-test/t/mysqlbinlog.test:
Don't refer to install dir in result
sql/log_event.cc:
Add quoting for use `database` for mysqlbinlog
support-files/mysql.server.sh:
Move pid_file test after arguments have been parsed
it's just backquoting the db's and table's names
when writing DROP TEMPORARY TABLE to the binlog when a connection ends.
A testcase for this.
sql/sql_base.cc:
backquote db and table name when writing DROP TEMPORARY TABLE to the binlog
when a connection ends.