Commit graph

11 commits

Author SHA1 Message Date
unknown
80649ee874 Fix for BUG#1870
"CHANGE MASTER makes SQL thread restart from coordinates of I/O thread".
    So, in CHANGE MASTER:
    when it seems reasonable that the user did not want to discontinue
    its replication (i.e. when he is not specifying host or port or master_log_file
    or master_log_pos; this will be documented), set the coordinates of the
    I/O thread to those of the SQL thread. This way, the SQL thread will see
    no discontinuity in the relay log (i.e. will skip no events), because
    the I/O thread will fill the brand new relay log with the events which
    are just after the position where the SQL thread had stopped
    (before CHANGE MASTER was issued).
    And a new test for this bug.


mysql-test/r/rpl_loaddata.result:
  Now, after CHANGE MASTER the coordinates of the I/O thread are the last ones of the SQL thread, so result update.
sql/sql_repl.cc:
  Fix for BUG#1870
  "CHANGE MASTER makes SQL thread restart from coordinates of I/O thread".
  So, in CHANGE MASTER:
  when it seems reasonable that the user did not want to discontinue
  its replication (i.e. when he is not specifying host or port or master_log_file
  or master_log_pos; this will be documented), set the coordinates of the
  I/O thread to those of the SQL thread. This way, the SQL thread will see
  no discontinuity in the relay log (i.e. will skip no events), because
  the I/O thread will fill the brand new relay log with the events which
  are just after the position where the SQL thread had stopped
  (before CHANGE MASTER was issued).
2003-11-18 17:31:17 +01:00
unknown
dae13b5415 Fix for BUG#1391:
"If LOAD DATA INFILE 'small_file' fails on master, slave leaves temp files"
(the bug is in the master)


mysql-test/r/rpl_loaddata.result:
  result update
mysql-test/std_data/rpl_loaddata2.dat:
  change to introduce a unique key violation
mysql-test/t/rpl_loaddata.test:
  testcase for bug#1391.
sql/sql_load.cc:
  fix for bug#1391:
  for a small file, we had in the binlog only the Create_file, not the Delete_file
  (the Create_file was written when the READ_INFO was destroyed).
2003-09-25 00:14:46 +02:00
unknown
fdfb10f2fb 2 minor edits, plus
fix for BUG#1113 "INSERT into non-trans table SELECT ; ROLLBACK" does not send warning"
and
fix for BUG#873 "In transaction, INSERT to non-trans table is written too early to binlog".
Now we don't always write the non-trans update immediately to the binlog;
if there is something in the binlog cache we write it to the binlog cache
(because the non-trans update could depend on a trans table which was modified
earlier in the transaction); then in case of ROLLBACK, we write the binlog
cache to the binlog, wrapped with BEGIN/ROLLBACK.
This guarantees that the slave does the same updates.
For ROLLBACK TO SAVEPOINT: when we execute a SAVEPOINT command we write it
to the binlog cache. At ROLLBACK TO SAVEPOINT, if some non-trans table was updated,
we write ROLLBACK TO SAVEPOINT to the binlog cache; when the transaction
terminates (COMMIT/ROLLBACK), the binlog cache will be flushed to the binlog
(because of the non-trans update) so we'll have SAVEPOINT and ROLLBACK TO
SAVEPOINT in the binlog.

Apart from this rare case of updates of mixed table types in transaction, the
usual way is still clear the binlog cache at ROLLBACK, or chop it at
ROLLBACK TO SAVEPOINT (meaning the SAVEPOINT command is also chopped, which
is fine).
Note that BUG#873 encompasses subbugs 1) and 2) of BUG#333 "3 binlogging bugs when doing INSERT with mixed InnoDB/MyISAM".


client/mysqldump.c:
  Minor edit: one CHANGE MASTER with 2 arguments instead of 2 CHANGE MASTER with one argument each.
mysql-test/r/rpl_loaddata.result:
  result update
mysql-test/t/rpl_loaddata.test:
  minor edit: simplifying the test.
sql/handler.cc:
  Fix for BUG#873. See comments in code, and the description of the changeset.
sql/log.cc:
  * Previously, if a query updated a non-transactional table we wrote it immediately
  to the real binlog. This causes a bug when the update is done inside a transaction
  and uses the content of an updated transactional table (because this makes
  a wrong order of queries in the binlog). So if the binlog cache is not empty,
  we write the query to the binlog cache; otherwise we can write it to the binlog.
  * Previously, when we flushed the binlog cache to the binlog, we wrapped it
  with BEGIN/COMMIT. Now it's also possible to wrap it with BEGIN/ROLLBACK, to handle
  transactions which update both transactional and non-transactional tables.
sql/log_event.cc:
  The slave thread can leave a transaction if COMMIT or if ROLLBACK.
sql/sql_class.h:
  prototype
sql/sql_insert.cc:
  Fix for BUG#1113:
  this was because the INSERT SELECT code did not set OPTION_STATUS_NO_TRANS_UPDATE.
sql/sql_parse.cc:
  Don't send ER_WARNING_NOT_COMPLETE_ROLLBACK if this is the SQL slave thread (see comments).
2003-08-22 15:39:24 +02:00
unknown
eb1fb90006 Result updates after Dmitri's and my changes to logging with --log-slave-updates.
Since my changes, rpl_log.test, whose result file depends on file_id, became
non-repeatable, i.e. file_id on slave in SHOW BINLOG EVENTS
changed depending on the order of tests (sometimes 1, sometimes 5).
Which is logical: as now the slave does not copy Create_file and Exec_load from
the relay log (i.e from the master's binlog) to the slave's binlog, but
instead lets mysql_load() do the logging, the file_id is now the one whic
was used on the slave. Before it was the one which was used on the master,
and by chance the master was always restarted for this test because there's
a -master.opt file, so file_id on the master is always 1. But now file_id is
from the slave so we need to restart the slave. That's why I add an (empty)
-slave.opt file. I could have used 'server_stop/start slave', but this
would have required the manager, so most of the time mysql-test-run silently
skip the test which makes it useless. And I want this test to be run !


mysql-test/r/rpl_loaddata.result:
  Orig_log_pos is like Pos since Dmitri's good change for BUG#1086
mysql-test/r/rpl_log.result:
  Orig_log_pos is like Pos now, because Exec_load events are not directly copied
  by the slave from the relay log to the slave's binary log (these events
  are written by mysql_load() now).
mysql-test/t/rpl_log.test:
  A comment
2003-08-21 00:23:39 +02:00
unknown
1542fffb34 First commit for fixing BUG#1100
"LOAD DATA INFILE is badly filtered by binlog-*-db rules".
There will probably be a second final one to merge Dmitri's changes
to rpl_log.result and mine.
2 new tests:
rpl_loaddata_rule_m : test of logging of LOAD DATA INFILE when the master has binlog-*-db rules,
rpl_loaddata_rule_s : test of logging of LOAD DATA INFILE when the slave has binlog-*-db rules and --log-slave-updates.


mysql-test/r/rpl_loaddata.result:
  Test that logging of LOAD DATA INFILE is done on the slave
mysql-test/t/rpl_loaddata.test:
  Test that logging of LOAD DATA is done on the slave
sql/log.cc:
  debug info
sql/log_event.cc:
  * Append_block, Exec_load and Delete_file now have a member 'db' like Create_file.
  This member is filled by mysql_load(). It is used for filtering by binlog-*-db rules,
  that's all. It's not written to the binlog, and so can't be read from the binlog.
  In other words, that's temporary info which is stored in the event and lost when
  it is written and deleted.
  * Better error messages in Append_block et al. events.
  * The slave now logs (log-slave-updates) the Create_file et al. events in mysql_load()
  (they are not directly copied from the events in the relay log, because this
  prevented filtering by binlog-*-db rules). Before, mysql_load() in the slave
  did no logging, now it does the logging, as in any regular thread.
sql/log_event.h:
  New member 'db' for Append_block et al. events.
sql/slave.cc:
  Removed useless code. Why was it useless:
  - CREATE_FILE_EVENT is not defined in 3.23. It appeared in 4.0.
  - in queue_old_event(), which is called only if the master is 3.23, we had a
  case CREATE_FILE_EVENT:
  so this case can be removed.
  - this case was the only caller of process_io_create_file() so this function
  can be removed.
sql/sql_load.cc:
  Pass the db to events, so that they can be well filtered.
sql/sql_repl.cc:
  Pass the db to events so that they can be well filtered.
2003-08-20 23:24:45 +02:00
unknown
d8df84aa43 2 bugfixes:
- Bug #985: "Between RESET SLAVE and START SLAVE, SHOW SLAVE STATUS is wrong."
Now RESET SLAVE puts correct info in mi->host etc. A new test rpl_reset_slave
for that.
- Bug #986: "CHANGE MASTER & START SLAVE do not reset error columns in SHOW
SLAVE STATUS". Now these reset the errors.


mysql-test/r/rpl_loaddata.result:
  result update.
mysql-test/t/rpl_loaddata.test:
  Test that RESET SLAVE, START SLAVE and CHANGE MASTER all reset 
  Last_slave_error and Last_slave_errno (columns of SHOW SLAVE STATUS).
  We do it in this test because that's one of tests which have 
  an intentional query error on the slave.
sql/slave.cc:
  As we need TWICE the code to copy command-line options (--master-host etc)
  to mi (we already had it in init_master_info, but we also need it in RESET
  SLAVE to fix bug#985), I make a function of this code.
  And a function to reset Last_slave_error and Last_slave_errno (we need
  it in CHANGE MASTER, RESET SLAVE, and at the start of the SQL thread).
sql/slave.h:
  declarations for new functions.
sql/sql_repl.cc:
  copy --master-host etc to mi in RESET SLAVE, so that SHOW SLAVE STATUS
  shows correct information.
2003-08-04 10:59:44 +02:00
unknown
366fd92e8d Fix for nightly build test failure (test update).
More messages.
Testcase for bug 651.


client/mysqltest.c:
  More explicit error message if MASTER_POS_WAIT() returns NULL.
mysql-test/r/rpl_loaddata.result:
  result update
mysql-test/r/rpl_master_pos_wait.result:
  result update
mysql-test/t/rpl000001.test:
  sync_with_master (=MASTER_POS_WAIT()) was called when we could expect the SQL slave thread had stopped.
  As I yesterday changed code so that "SQL thread stops => MASTER_POS_WAIT() returns NULL immediately" (bugfix),
  sync_with_master received NULL (on build.mysql.com, not on my machine; this is a question of milliseconds,
  if the slave server will process MASTER_POS_WAIT() before or after the slave SQL thread has stopped), and
  in mysqltest.c, sync_with_master complained that it could not sync.
  So I just remove this sync_with_master, which does not make sense anymore: we just wait for the slave SQL
  thread to stop.
mysql-test/t/rpl_loaddata.test:
  Discovered we had wait_for_slave_to_stop, so used it as it automates things.
mysql-test/t/rpl_master_pos_wait.test:
  Discovered we had 'send' to send a query without waiting for the resultn so could had a testcase for bug 651.
  Shorter timeouts as there is no risk the position is reached.
sql/slave.cc:
  A longer DBUG_PRINT.
2003-06-16 15:49:54 +02:00
unknown
ccb398b9ee -- Waiting for Monty's approval before push --
Bug 571: play LOAD DATA INFILE the same way on the slave as it was on the master: 
if it was with IGNORE, do it with IGNORE,
if it was with REPLACE, do it with REPLACE,
and (the change) if it was with nothing, do it with nothing (not with IGNORE !!).
Bug 573: print a proper error message in case of duplicate entry in LOAD DATA INFILE
on the slave, i.e. a message where the keyname and key value appear :
'Duplicate entry '1' for key 1' and not 'Duplicate entry '%-.64s' for key %d'


mysql-test/r/rpl_loaddata.result:
  result update
mysql-test/t/rpl_loaddata.test:
  check if duplicate entries on the slave trigger an error 
  when the slave replicates LOAD DATA INFILE (without IGNORE or REPLACE)
  (bug 571).
sql/log_event.cc:
  Bug 571: play LOAD DATA INFILE the same way on the slave as it was on the master: 
  if it was with IGNORE, do it with IGNORE,
  if it was with REPLACE, do it with REPLACE,
  and (the change) if it was with nothing, do it with nothing (not with IGNORE !!).
  Bug 573: print a proper error message in case of duplicate entry in LOAD DATA INFILE
  on the slave, i.e. a message where the keyname and key value appear :
  'Duplicate entry '1' for key 1' and not 'Duplicate entry '%-.64s' for key %d'
2003-06-03 15:47:29 +02:00
unknown
530accbaae fixed 'STARTING BY' in replication
mysql-test/r/rpl_loaddata.result:
  added test for 'STARTING BY'
mysql-test/std_data/rpl_loaddata2.dat:
  added test for 'STARTING BY'
mysql-test/t/rpl_loaddata.test:
  added test for 'STARTING BY'
sql/log_event.cc:
  fixed 'STARTING BY'
2003-05-21 14:54:02 -04:00
unknown
4a1542d056 added test for replication load data into temporary table with additional options
sql/log_event.cc:
  fix bug #183 (Replication of temporary tables not working)
2003-04-03 12:54:08 -04:00
unknown
ef6c36c0c2 Guard against compiling without -fno-exceptions
Allocate bigger default thread stack because of problems with glibc
Fixed bug in UPDATE ... not_null_field=expression_that_returns_null
Fixed bug in replication when using auto_increment and LOAD DATA INFILE


include/my_global.h:
  Guard against compiling without -fno-exceptions
include/my_pthread.h:
  Allocate bigger default thread stack because of problems with glibc
mysql-test/r/null.result:
  Updated result
mysql-test/t/null.test:
  Test of using UPDATE/INSERT with NULL on not null fields.
sql/field_conv.cc:
  Fixed bug in UPDATE ... not_null_field=expression_that_returns_null
sql/sql_load.cc:
  Fixed bug in replication when using auto_increment and LOAD DATA INFILE
2003-01-14 11:27:26 +02:00