2012-03-28 01:04:46 +02:00
|
|
|
/* Copyright (c) 2005, 2012, Oracle and/or its affiliates.
|
2005-12-22 06:39:02 +01:00
|
|
|
|
|
|
|
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
|
2006-12-27 02:23:51 +01:00
|
|
|
the Free Software Foundation; version 2 of the License.
|
2005-12-22 06:39:02 +01:00
|
|
|
|
|
|
|
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; if not, write to the Free Software
|
2011-06-30 17:46:53 +02:00
|
|
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
|
2005-12-22 06:39:02 +01:00
|
|
|
|
|
|
|
#ifndef RPL_RLI_H
|
|
|
|
#define RPL_RLI_H
|
|
|
|
|
|
|
|
#include "rpl_tblmap.h"
|
2007-06-09 07:19:37 +02:00
|
|
|
#include "rpl_reporting.h"
|
2007-07-30 00:10:42 +02:00
|
|
|
#include "rpl_utility.h"
|
2010-03-31 16:05:33 +02:00
|
|
|
#include "log.h" /* LOG_INFO, MYSQL_BIN_LOG */
|
|
|
|
#include "sql_class.h" /* THD */
|
2011-10-19 21:45:18 +02:00
|
|
|
#include "log_event.h"
|
2013-06-24 10:50:25 +02:00
|
|
|
#include "rpl_parallel.h"
|
2005-12-22 06:39:02 +01:00
|
|
|
|
2007-02-26 17:44:55 +01:00
|
|
|
struct RPL_TABLE_LIST;
|
2007-08-17 13:22:31 +02:00
|
|
|
class Master_info;
|
2006-10-31 12:23:14 +01:00
|
|
|
|
2005-12-22 06:39:02 +01:00
|
|
|
/****************************************************************************
|
|
|
|
|
|
|
|
Replication SQL Thread
|
|
|
|
|
2007-08-16 07:37:50 +02:00
|
|
|
Relay_log_info contains:
|
2005-12-22 06:39:02 +01:00
|
|
|
- the current relay log
|
|
|
|
- the current relay log offset
|
|
|
|
- master log name
|
|
|
|
- master log sequence corresponding to the last update
|
|
|
|
- misc information specific to the SQL thread
|
|
|
|
|
2007-08-16 07:37:50 +02:00
|
|
|
Relay_log_info is initialized from the slave.info file if such
|
|
|
|
exists. Otherwise, data members are intialized with defaults. The
|
|
|
|
initialization is done with init_relay_log_info() call.
|
2005-12-22 06:39:02 +01:00
|
|
|
|
|
|
|
The format of slave.info file:
|
|
|
|
|
|
|
|
relay_log_name
|
|
|
|
relay_log_pos
|
|
|
|
master_log_name
|
|
|
|
master_log_pos
|
|
|
|
|
|
|
|
To clean up, call end_relay_log_info()
|
|
|
|
|
|
|
|
*****************************************************************************/
|
|
|
|
|
2013-06-28 15:19:30 +02:00
|
|
|
struct rpl_group_info;
|
|
|
|
|
2007-08-16 07:37:50 +02:00
|
|
|
class Relay_log_info : public Slave_reporting_capability
|
2005-12-22 06:39:02 +01:00
|
|
|
{
|
2007-08-16 07:37:50 +02:00
|
|
|
public:
|
2007-04-12 08:58:04 +02:00
|
|
|
/**
|
|
|
|
Flags for the state of the replication.
|
|
|
|
*/
|
|
|
|
enum enum_state_flag {
|
|
|
|
/** The replication thread is inside a statement */
|
|
|
|
IN_STMT,
|
|
|
|
|
|
|
|
/** Flag counter. Should always be last */
|
|
|
|
STATE_FLAGS_COUNT
|
|
|
|
};
|
|
|
|
|
2005-12-22 06:39:02 +01:00
|
|
|
/*
|
|
|
|
If flag set, then rli does not store its state in any info file.
|
|
|
|
This is the case only when we execute BINLOG SQL commands inside
|
|
|
|
a client, non-replication thread.
|
|
|
|
*/
|
|
|
|
bool no_storage;
|
|
|
|
|
2007-03-22 08:32:41 +01:00
|
|
|
/*
|
|
|
|
If true, events with the same server id should be replicated. This
|
|
|
|
field is set on creation of a relay log info structure by copying
|
|
|
|
the value of ::replicate_same_server_id and can be overridden if
|
|
|
|
necessary. For example of when this is done, check sql_binlog.cc,
|
|
|
|
where the BINLOG statement can be used to execute "raw" events.
|
|
|
|
*/
|
|
|
|
bool replicate_same_server_id;
|
|
|
|
|
2005-12-22 06:39:02 +01:00
|
|
|
/*** The following variables can only be read when protect by data lock ****/
|
|
|
|
|
|
|
|
/*
|
|
|
|
info_fd - file descriptor of the info file. set only during
|
|
|
|
initialization or clean up - safe to read anytime
|
|
|
|
cur_log_fd - file descriptor of the current read relay log
|
|
|
|
*/
|
|
|
|
File info_fd,cur_log_fd;
|
|
|
|
|
|
|
|
/*
|
|
|
|
Protected with internal locks.
|
|
|
|
Must get data_lock when resetting the logs.
|
|
|
|
*/
|
2006-05-05 08:45:58 +02:00
|
|
|
MYSQL_BIN_LOG relay_log;
|
2005-12-22 06:39:02 +01:00
|
|
|
LOG_INFO linfo;
|
BUG#55263: assert in check_binlog_magic
The procedure for setting up a fake binary log, by changing the
relay log files manually, is run twice when we issue mtr with
--repeat=2. However, when setting it up for the second time,
neither the sql thread is reset nor the server is restarted. This
means that previous stale relay log IO_CACHE metadata - from
first run - is left around. As a consequence, when the test is
run for the second time, the IO_CACHE for the relay log has
position in file different than zero, triggering the assertion.
We fix this by deploying a call to my_b_seek before calling
check_binlog_magic in next_event. This prevents the server
from asserting, in the cases that the SQL thread was reads
from a hot log (relay.NNNNN), then is stopped, then is restarted
from a previous cold log (relay.MMMMM), and then it reaches
the hot log relay.NNNNN again, in which case, the read
coordinates are not set to zero, but to the old values.
Additionally, some comments to the source code were added.
2010-09-24 11:44:53 +02:00
|
|
|
|
|
|
|
/*
|
|
|
|
cur_log
|
|
|
|
Pointer that either points at relay_log.get_log_file() or
|
|
|
|
&rli->cache_buf, depending on whether the log is hot or there was
|
|
|
|
the need to open a cold relay_log.
|
|
|
|
|
|
|
|
cache_buf
|
|
|
|
IO_CACHE used when opening cold relay logs.
|
|
|
|
*/
|
2005-12-22 06:39:02 +01:00
|
|
|
IO_CACHE cache_buf,*cur_log;
|
|
|
|
|
BUG#40337 Fsyncing master and relay log to disk after every event is too slow
NOTE: Backporting the patch to next-mr.
The fix proposed in BUG#35542 and BUG#31665 introduces a performance issue
when fsyncing the master.info, relay.info and relay-log.bin* after #th events.
Although such solution has been proposed to reduce the probability of corrupted
files due to a slave-crash, the performance penalty introduced by it has
made the approach impractical for highly intensive workloads.
In a nutshell, the option --syn-relay-log proposed in BUG#35542 and BUG#31665
simultaneously fsyncs master.info, relay-log.info and relay-log.bin* and
this is the main source of performance issues.
This patch introduces new options that give more control to the user on
what should be fsynced and how often:
1) (--sync-master-info, integer) which syncs the master.info after #th event;
2) (--sync-relay-log, integer) which syncs the relay-log.bin* after #th
events.
3) (--sync-relay-log-info, integer) which syncs the relay.info after #th
transactions.
To provide both performance and increased reliability, we recommend the following
setup:
1) --sync-master-info = 0 eventually the operating system will fsync it;
2) --sync-relay-log = 0 eventually the operating system will fsync it;
3) --sync-relay-log-info = 1 fsyncs it after every transaction;
Notice, that the previous setup does not reduce the probability of
corrupted master.info and relay-log.bin*. To overcome the issue, this patch also
introduces a recovery mechanism that right after restart throws away relay-log.bin*
retrieved from a master and updates the master.info based on the relay.info:
4) (--relay-log-recovery, boolean) which enables a recovery mechanism that
throws away relay-log.bin* after a crash.
However, it can only recover the incorrect binlog file and position in master.info,
if other informations (host, port password, etc) are corrupted or incorrect,
then this recovery mechanism will fail to work.
2009-09-29 16:40:52 +02:00
|
|
|
/*
|
|
|
|
Keeps track of the number of transactions that commits
|
|
|
|
before fsyncing. The option --sync-relay-log-info determines
|
|
|
|
how many transactions should commit before fsyncing.
|
|
|
|
*/
|
|
|
|
uint sync_counter;
|
|
|
|
|
|
|
|
/*
|
|
|
|
Identifies when the recovery process is going on.
|
|
|
|
See sql/slave.cc:init_recovery for further details.
|
|
|
|
*/
|
|
|
|
bool is_relay_log_recovery;
|
|
|
|
|
2005-12-22 06:39:02 +01:00
|
|
|
/* The following variables are safe to read any time */
|
|
|
|
|
|
|
|
/* IO_CACHE of the info file - set only during init or end */
|
|
|
|
IO_CACHE info_file;
|
|
|
|
|
|
|
|
/*
|
|
|
|
When we restart slave thread we need to have access to the previously
|
|
|
|
created temporary tables. Modified only on init/end and by the SQL
|
|
|
|
thread, read only by SQL thread.
|
|
|
|
*/
|
|
|
|
TABLE *save_temporary_tables;
|
|
|
|
|
|
|
|
/*
|
2010-01-07 06:42:07 +01:00
|
|
|
standard lock acquisition order to avoid deadlocks:
|
2005-12-22 06:39:02 +01:00
|
|
|
run_lock, data_lock, relay_log.LOCK_log, relay_log.LOCK_index
|
|
|
|
*/
|
2012-01-23 13:09:37 +01:00
|
|
|
mysql_mutex_t data_lock, run_lock, sleep_lock;
|
2005-12-22 06:39:02 +01:00
|
|
|
/*
|
|
|
|
start_cond is broadcast when SQL thread is started
|
|
|
|
stop_cond - when stopped
|
|
|
|
data_cond - when data protected by data_lock changes
|
|
|
|
*/
|
2012-01-23 13:09:37 +01:00
|
|
|
mysql_cond_t start_cond, stop_cond, data_cond, sleep_cond;
|
2007-08-16 08:52:50 +02:00
|
|
|
/* parent Master_info structure */
|
2007-08-16 11:43:03 +02:00
|
|
|
Master_info *mi;
|
2005-12-22 06:39:02 +01:00
|
|
|
|
|
|
|
/*
|
|
|
|
Needed to deal properly with cur_log getting closed and re-opened with
|
|
|
|
a different log under our feet
|
|
|
|
*/
|
|
|
|
uint32 cur_log_old_open_count;
|
|
|
|
|
|
|
|
/*
|
|
|
|
Let's call a group (of events) :
|
|
|
|
- a transaction
|
|
|
|
or
|
|
|
|
- an autocommiting query + its associated events (INSERT_ID,
|
|
|
|
TIMESTAMP...)
|
|
|
|
We need these rli coordinates :
|
|
|
|
- relay log name and position of the beginning of the group we currently are
|
|
|
|
executing. Needed to know where we have to restart when replication has
|
|
|
|
stopped in the middle of a group (which has been rolled back by the slave).
|
|
|
|
- relay log name and position just after the event we have just
|
|
|
|
executed. This event is part of the current group.
|
|
|
|
Formerly we only had the immediately above coordinates, plus a 'pending'
|
|
|
|
variable, but this dealt wrong with the case of a transaction starting on a
|
|
|
|
relay log and finishing (commiting) on another relay log. Case which can
|
|
|
|
happen when, for example, the relay log gets rotated because of
|
|
|
|
max_binlog_size.
|
|
|
|
*/
|
|
|
|
char group_relay_log_name[FN_REFLEN];
|
|
|
|
ulonglong group_relay_log_pos;
|
|
|
|
char event_relay_log_name[FN_REFLEN];
|
|
|
|
ulonglong event_relay_log_pos;
|
|
|
|
ulonglong future_event_relay_log_pos;
|
|
|
|
|
2009-05-06 14:03:24 +02:00
|
|
|
#ifdef HAVE_valgrind
|
2008-02-11 12:04:30 +01:00
|
|
|
bool is_fake; /* Mark that this is a fake relay log info structure */
|
|
|
|
#endif
|
|
|
|
|
2005-12-22 06:39:02 +01:00
|
|
|
/*
|
|
|
|
Original log name and position of the group we're currently executing
|
|
|
|
(whose coordinates are group_relay_log_name/pos in the relay log)
|
|
|
|
in the master's binlog. These concern the *group*, because in the master's
|
|
|
|
binlog the log_pos that comes with each event is the position of the
|
|
|
|
beginning of the group.
|
|
|
|
*/
|
|
|
|
char group_master_log_name[FN_REFLEN];
|
|
|
|
volatile my_off_t group_master_log_pos;
|
|
|
|
|
|
|
|
/*
|
|
|
|
Handling of the relay_log_space_limit optional constraint.
|
|
|
|
ignore_log_space_limit is used to resolve a deadlock between I/O and SQL
|
|
|
|
threads, the SQL thread sets it to unblock the I/O thread and make it
|
|
|
|
temporarily forget about the constraint.
|
|
|
|
*/
|
|
|
|
ulonglong log_space_limit,log_space_total;
|
|
|
|
bool ignore_log_space_limit;
|
|
|
|
|
BUG#12400313 RELAY_LOG_SPACE_LIMIT IS NOT WORKING IN MANY CASES
BUG#64503: mysql frequently ignores --relay-log-space-limit
When the SQL thread goes to sleep, waiting for more events, it sets
the flag ignore_log_space_limit to true. This gives the IO thread a
chance to queue some more events and ultimately the SQL thread will be
able to purge the log once it is rotated. By then the SQL thread
resets the ignore_log_space_limit to false. However, between the time
the SQL thread has set the ignore flag and the time it resets it, the
IO thread will be queuing events in the relay log, possibly going way
over the limit.
This patch makes the IO and SQL thread to synchronize when they reach
the space limit and only ask for one event at a time. Thus the SQL
thread sets ignore_log_space_limit flag and the IO thread resets it to
false everytime it processes one more event. In addition, everytime
the SQL thread processes the next event, and the limit has been
reached, it checks if the IO thread should rotate. If it should, it
instructs the IO thread to rotate, giving the SQL thread a chance to
purge the logs (freeing space). Finally, this patch removes the
resetting of the ignore_log_space_limit flag from purge_first_log,
because this is now reset by the IO thread every time it processes the
next event when the limit has been reached.
If the SQL thread is in a transaction, it cannot purge so, there is no
point in asking the IO thread to rotate. The only thing it can do is
to ask for more events until the transaction is over (then it can ask
the IO to rotate and purge the log right away). Otherwise, there would
be a deadlock (SQL would not be able to purge and IO thread would not
be able to queue events so that the SQL would finish the transaction).
2012-03-12 13:28:27 +01:00
|
|
|
/*
|
|
|
|
Used by the SQL thread to instructs the IO thread to rotate
|
|
|
|
the logs when the SQL thread needs to purge to release some
|
|
|
|
disk space.
|
|
|
|
*/
|
|
|
|
bool sql_force_rotate_relay;
|
|
|
|
|
2005-12-22 06:39:02 +01:00
|
|
|
/*
|
|
|
|
When it commits, InnoDB internally stores the master log position it has
|
|
|
|
processed so far; the position to store is the one of the end of the
|
|
|
|
committing event (the COMMIT query event, or the event if in autocommit
|
|
|
|
mode).
|
|
|
|
*/
|
|
|
|
#if MYSQL_VERSION_ID < 40100
|
|
|
|
ulonglong future_master_log_pos;
|
|
|
|
#else
|
|
|
|
ulonglong future_group_master_log_pos;
|
|
|
|
#endif
|
|
|
|
|
2007-04-13 19:19:10 +02:00
|
|
|
time_t last_master_timestamp;
|
2005-12-22 06:39:02 +01:00
|
|
|
|
2006-10-31 12:23:14 +01:00
|
|
|
void clear_until_condition();
|
|
|
|
|
2005-12-22 06:39:02 +01:00
|
|
|
/*
|
|
|
|
Needed for problems when slave stops and we want to restart it
|
|
|
|
skipping one or more events in the master log that have caused
|
|
|
|
errors, and have been manually applied by DBA already.
|
2012-10-03 00:44:54 +02:00
|
|
|
Must be ulong as it's refered to from set_var.cc
|
2005-12-22 06:39:02 +01:00
|
|
|
*/
|
2012-10-03 00:44:54 +02:00
|
|
|
volatile ulong slave_skip_counter;
|
2005-12-22 06:39:02 +01:00
|
|
|
volatile ulong abort_pos_wait; /* Incremented on change master */
|
|
|
|
volatile ulong slave_run_id; /* Incremented on slave start */
|
2012-10-01 01:30:44 +02:00
|
|
|
ulong max_relay_log_size;
|
2010-01-07 06:42:07 +01:00
|
|
|
mysql_mutex_t log_space_lock;
|
|
|
|
mysql_cond_t log_space_cond;
|
2005-12-22 06:39:02 +01:00
|
|
|
THD * sql_thd;
|
|
|
|
#ifndef DBUG_OFF
|
|
|
|
int events_till_abort;
|
|
|
|
#endif
|
|
|
|
|
2009-11-20 14:30:35 +01:00
|
|
|
/*
|
|
|
|
inited changes its value within LOCK_active_mi-guarded critical
|
|
|
|
sections at times of start_slave_threads() (0->1) and end_slave() (1->0).
|
|
|
|
Readers may not acquire the mutex while they realize potential concurrency
|
|
|
|
issue.
|
|
|
|
If not set, the value of other members of the structure are undefined.
|
|
|
|
*/
|
|
|
|
volatile bool inited;
|
2005-12-22 06:39:02 +01:00
|
|
|
volatile bool abort_slave;
|
|
|
|
volatile uint slave_running;
|
|
|
|
|
|
|
|
/*
|
|
|
|
Condition and its parameters from START SLAVE UNTIL clause.
|
|
|
|
|
|
|
|
UNTIL condition is tested with is_until_satisfied() method that is
|
|
|
|
called by exec_relay_log_event(). is_until_satisfied() caches the result
|
|
|
|
of the comparison of log names because log names don't change very often;
|
|
|
|
this cache is invalidated by parts of code which change log names with
|
|
|
|
notify_*_log_name_updated() methods. (They need to be called only if SQL
|
|
|
|
thread is running).
|
|
|
|
*/
|
|
|
|
|
2013-05-15 19:52:21 +02:00
|
|
|
enum {
|
|
|
|
UNTIL_NONE= 0, UNTIL_MASTER_POS, UNTIL_RELAY_POS, UNTIL_GTID
|
|
|
|
} until_condition;
|
2005-12-22 06:39:02 +01:00
|
|
|
char until_log_name[FN_REFLEN];
|
|
|
|
ulonglong until_log_pos;
|
|
|
|
/* extension extracted from log_name and converted to int */
|
|
|
|
ulong until_log_name_extension;
|
|
|
|
/*
|
|
|
|
Cached result of comparison of until_log_name and current log name
|
|
|
|
-2 means unitialised, -1,0,1 are comarison results
|
|
|
|
*/
|
|
|
|
enum
|
|
|
|
{
|
|
|
|
UNTIL_LOG_NAMES_CMP_UNKNOWN= -2, UNTIL_LOG_NAMES_CMP_LESS= -1,
|
|
|
|
UNTIL_LOG_NAMES_CMP_EQUAL= 0, UNTIL_LOG_NAMES_CMP_GREATER= 1
|
|
|
|
} until_log_names_cmp_result;
|
2013-05-15 19:52:21 +02:00
|
|
|
/* Condition for UNTIL master_gtid_pos. */
|
|
|
|
slave_connection_state until_gtid_pos;
|
2005-12-22 06:39:02 +01:00
|
|
|
|
|
|
|
char cached_charset[6];
|
|
|
|
/*
|
|
|
|
trans_retries varies between 0 to slave_transaction_retries and counts how
|
|
|
|
many times the slave has retried the present transaction; gets reset to 0
|
|
|
|
when the transaction finally succeeds. retried_trans is a cumulative
|
|
|
|
counter: how many times the slave has retried a transaction (any) since
|
|
|
|
slave started.
|
|
|
|
*/
|
|
|
|
ulong trans_retries, retried_trans;
|
2012-10-03 00:44:54 +02:00
|
|
|
ulong executed_entries; /* For SLAVE STATUS */
|
2005-12-22 06:39:02 +01:00
|
|
|
|
|
|
|
/*
|
|
|
|
If the end of the hot relay log is made of master's events ignored by the
|
|
|
|
slave I/O thread, these two keep track of the coords (in the master's
|
|
|
|
binlog) of the last of these events seen by the slave I/O thread. If not,
|
|
|
|
ign_master_log_name_end[0] == 0.
|
|
|
|
As they are like a Rotate event read/written from/to the relay log, they
|
|
|
|
are both protected by rli->relay_log.LOCK_log.
|
|
|
|
*/
|
|
|
|
char ign_master_log_name_end[FN_REFLEN];
|
|
|
|
ulonglong ign_master_log_pos_end;
|
|
|
|
|
2009-02-21 10:36:07 +01:00
|
|
|
/*
|
|
|
|
Indentifies where the SQL Thread should create temporary files for the
|
|
|
|
LOAD DATA INFILE. This is used for security reasons.
|
|
|
|
*/
|
|
|
|
char slave_patternload_file[FN_REFLEN];
|
|
|
|
size_t slave_patternload_file_size;
|
|
|
|
|
2013-07-03 13:46:33 +02:00
|
|
|
/* ToDo: We need to remove this, always use the per-transaction one to work with parallel replication. */
|
2013-06-28 15:19:30 +02:00
|
|
|
struct rpl_group_info *group_info;
|
2013-06-24 10:50:25 +02:00
|
|
|
rpl_parallel parallel;
|
2012-11-05 15:01:49 +01:00
|
|
|
|
BUG#40337 Fsyncing master and relay log to disk after every event is too slow
NOTE: Backporting the patch to next-mr.
The fix proposed in BUG#35542 and BUG#31665 introduces a performance issue
when fsyncing the master.info, relay.info and relay-log.bin* after #th events.
Although such solution has been proposed to reduce the probability of corrupted
files due to a slave-crash, the performance penalty introduced by it has
made the approach impractical for highly intensive workloads.
In a nutshell, the option --syn-relay-log proposed in BUG#35542 and BUG#31665
simultaneously fsyncs master.info, relay-log.info and relay-log.bin* and
this is the main source of performance issues.
This patch introduces new options that give more control to the user on
what should be fsynced and how often:
1) (--sync-master-info, integer) which syncs the master.info after #th event;
2) (--sync-relay-log, integer) which syncs the relay-log.bin* after #th
events.
3) (--sync-relay-log-info, integer) which syncs the relay.info after #th
transactions.
To provide both performance and increased reliability, we recommend the following
setup:
1) --sync-master-info = 0 eventually the operating system will fsync it;
2) --sync-relay-log = 0 eventually the operating system will fsync it;
3) --sync-relay-log-info = 1 fsyncs it after every transaction;
Notice, that the previous setup does not reduce the probability of
corrupted master.info and relay-log.bin*. To overcome the issue, this patch also
introduces a recovery mechanism that right after restart throws away relay-log.bin*
retrieved from a master and updates the master.info based on the relay.info:
4) (--relay-log-recovery, boolean) which enables a recovery mechanism that
throws away relay-log.bin* after a crash.
However, it can only recover the incorrect binlog file and position in master.info,
if other informations (host, port password, etc) are corrupted or incorrect,
then this recovery mechanism will fail to work.
2009-09-29 16:40:52 +02:00
|
|
|
Relay_log_info(bool is_slave_recovery);
|
2007-08-16 07:37:50 +02:00
|
|
|
~Relay_log_info();
|
2005-12-22 06:39:02 +01:00
|
|
|
|
|
|
|
/*
|
|
|
|
Invalidate cached until_log_name and group_relay_log_name comparison
|
|
|
|
result. Should be called after any update of group_realy_log_name if
|
|
|
|
there chances that sql_thread is running.
|
|
|
|
*/
|
|
|
|
inline void notify_group_relay_log_name_update()
|
|
|
|
{
|
|
|
|
if (until_condition==UNTIL_RELAY_POS)
|
|
|
|
until_log_names_cmp_result= UNTIL_LOG_NAMES_CMP_UNKNOWN;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
The same as previous but for group_master_log_name.
|
|
|
|
*/
|
|
|
|
inline void notify_group_master_log_name_update()
|
|
|
|
{
|
|
|
|
if (until_condition==UNTIL_MASTER_POS)
|
|
|
|
until_log_names_cmp_result= UNTIL_LOG_NAMES_CMP_UNKNOWN;
|
|
|
|
}
|
|
|
|
|
|
|
|
inline void inc_event_relay_log_pos()
|
|
|
|
{
|
|
|
|
event_relay_log_pos= future_event_relay_log_pos;
|
|
|
|
}
|
|
|
|
|
|
|
|
void inc_group_relay_log_pos(ulonglong log_pos,
|
|
|
|
bool skip_lock=0);
|
|
|
|
|
|
|
|
int wait_for_pos(THD* thd, String* log_name, longlong log_pos,
|
|
|
|
longlong timeout);
|
|
|
|
void close_temporary_tables();
|
|
|
|
|
|
|
|
/* Check if UNTIL condition is satisfied. See slave.cc for more. */
|
2009-12-14 17:32:22 +01:00
|
|
|
bool is_until_satisfied(THD *thd, Log_event *ev);
|
2005-12-22 06:39:02 +01:00
|
|
|
inline ulonglong until_pos()
|
|
|
|
{
|
2013-05-15 19:52:21 +02:00
|
|
|
DBUG_ASSERT(until_condition == UNTIL_MASTER_POS ||
|
|
|
|
until_condition == UNTIL_RELAY_POS);
|
2005-12-22 06:39:02 +01:00
|
|
|
return ((until_condition == UNTIL_MASTER_POS) ? group_master_log_pos :
|
|
|
|
group_relay_log_pos);
|
|
|
|
}
|
|
|
|
|
2007-02-26 17:44:55 +01:00
|
|
|
RPL_TABLE_LIST *tables_to_lock; /* RBR: Tables to lock */
|
2006-02-16 08:30:53 +01:00
|
|
|
uint tables_to_lock_count; /* RBR: Count of tables to lock */
|
|
|
|
table_mapping m_table_map; /* RBR: Mapping table-id to table */
|
2005-12-22 06:39:02 +01:00
|
|
|
|
WL#5151: Conversion between different types when replicating
Row-based replication requires the types of columns on the
master and slave to be approximately the same (some safe
conversions between strings are allowed), but does not
allow safe conversions between fields of similar types such
as TINYINT and INT.
This patch implement type conversions between similar fields
on the master and slave.
The conversions are controlled using a new variable
SLAVE_TYPE_CONVERSIONS of type SET('ALL_LOSSY','ALL_NON_LOSSY').
Non-lossy conversions are any conversions that do not run the
risk of losing any information, while lossy conversions can
potentially truncate the value. The column definitions are
checked to decide if the conversion is acceptable.
If neither conversion is enabled, it is required that the
definitions of the columns are identical on master and slave.
Conversion is done by creating an internal conversion table,
unpacking the master data into it, and then copy the data to
the real table on the slave.
.bzrignore:
New files added
client/Makefile.am:
New files added
client/mysqlbinlog.cc:
Functions in rpl_utility.cc is now needed by mysqlbinlog.cc.
libmysqld/Makefile.am:
New files added
mysql-test/extra/rpl_tests/check_type.inc:
Test include file to check a single type conversion.
mysql-test/extra/rpl_tests/rpl_extraSlave_Col.test:
Switching to use INT instead of TEXT for column that should not have matching types.
mysql-test/extra/rpl_tests/rpl_row_basic.test:
Adding code to enable type conversions for BIT tests since InnoDB
cannot handle them properly due to incorrect information stored as
metadata.
mysql-test/extra/rpl_tests/type_conversions.test:
Test file to check a set of type conversions
with current settings of slave_type_conversions.
mysql-test/suite/rpl/t/rpl_typeconv.test:
Test file to test conversions from master to slave with
all possible values for slave_type_conversions.
The test also checks that the slave_type_conversions
variable works as expected.
sql/field.cc:
Changing definition of compatible_field_size to both check if
two field with identical base types are compatible and give an
order between them if they are compatible.
This only implement checking on the slave, so it will not affect
replication from an old master to a new slave.
sql/field.h:
Changing prototypes for functions:
- compatible_field_size()
- init_for_tmp_table()
- row_pack_length()
sql/log_event.cc:
Changing compability checks to build a conversion table if the fields
are compatible, but does not have the same base type.
sql/log_event_old.cc:
Changing compability checks to build a conversion table if the fields
are compatible, but does not have the same base type.
sql/mysql_priv.h:
Adding global option variable for SLAVE_TYPE_CONVERSIONS
sql/mysqld.cc:
Adding SLAVE_TYPE_CONVERSIONS global server variable.
sql/rpl_record.cc:
Changing unpack_row to use the conversion table if present.
sql/rpl_rli.h:
Removing function get_tabledef and replacing it with get_table_data().
This function retrieve data for table opened for replication, not just
table definition.
sql/rpl_utility.cc:
Function table_def::compatible_with is changed to compare table on master
and slave for compatibility and generate a conversions table if they are
compatible.
Computing real type of fields from metadata for ENUM and SET types.
Computing pack_length correctly for ENUM, SET, and BLOB types.
Adding optimization to not check compatibility if no
slave type conversions are enabled.
sql/rpl_utility.h:
Changing prototypes since implementation has changed.
Modifying table_def::type() to return real type instead of stored type.
sql/set_var.cc:
Adding SLAVE_TYPE_CONVERSIONS variable.
sql/set_var.h:
Adding SLAVE_TYPE_CONVERSIONS variable.
sql/share/errmsg.txt:
Adding error messages for slave type conversions.
sql/sql_class.h:
Adding SLAVE_TYPE_CONVERSIONS variable.
sql/sql_select.cc:
Correcting create_virtual_tmp_table() to compute null bit positions
correctly in the presence of bit fields.
2009-12-14 12:04:55 +01:00
|
|
|
bool get_table_data(TABLE *table_arg, table_def **tabledef_var, TABLE **conv_table_var) const
|
2007-07-30 00:10:42 +02:00
|
|
|
{
|
WL#5151: Conversion between different types when replicating
Row-based replication requires the types of columns on the
master and slave to be approximately the same (some safe
conversions between strings are allowed), but does not
allow safe conversions between fields of similar types such
as TINYINT and INT.
This patch implement type conversions between similar fields
on the master and slave.
The conversions are controlled using a new variable
SLAVE_TYPE_CONVERSIONS of type SET('ALL_LOSSY','ALL_NON_LOSSY').
Non-lossy conversions are any conversions that do not run the
risk of losing any information, while lossy conversions can
potentially truncate the value. The column definitions are
checked to decide if the conversion is acceptable.
If neither conversion is enabled, it is required that the
definitions of the columns are identical on master and slave.
Conversion is done by creating an internal conversion table,
unpacking the master data into it, and then copy the data to
the real table on the slave.
.bzrignore:
New files added
client/Makefile.am:
New files added
client/mysqlbinlog.cc:
Functions in rpl_utility.cc is now needed by mysqlbinlog.cc.
libmysqld/Makefile.am:
New files added
mysql-test/extra/rpl_tests/check_type.inc:
Test include file to check a single type conversion.
mysql-test/extra/rpl_tests/rpl_extraSlave_Col.test:
Switching to use INT instead of TEXT for column that should not have matching types.
mysql-test/extra/rpl_tests/rpl_row_basic.test:
Adding code to enable type conversions for BIT tests since InnoDB
cannot handle them properly due to incorrect information stored as
metadata.
mysql-test/extra/rpl_tests/type_conversions.test:
Test file to check a set of type conversions
with current settings of slave_type_conversions.
mysql-test/suite/rpl/t/rpl_typeconv.test:
Test file to test conversions from master to slave with
all possible values for slave_type_conversions.
The test also checks that the slave_type_conversions
variable works as expected.
sql/field.cc:
Changing definition of compatible_field_size to both check if
two field with identical base types are compatible and give an
order between them if they are compatible.
This only implement checking on the slave, so it will not affect
replication from an old master to a new slave.
sql/field.h:
Changing prototypes for functions:
- compatible_field_size()
- init_for_tmp_table()
- row_pack_length()
sql/log_event.cc:
Changing compability checks to build a conversion table if the fields
are compatible, but does not have the same base type.
sql/log_event_old.cc:
Changing compability checks to build a conversion table if the fields
are compatible, but does not have the same base type.
sql/mysql_priv.h:
Adding global option variable for SLAVE_TYPE_CONVERSIONS
sql/mysqld.cc:
Adding SLAVE_TYPE_CONVERSIONS global server variable.
sql/rpl_record.cc:
Changing unpack_row to use the conversion table if present.
sql/rpl_rli.h:
Removing function get_tabledef and replacing it with get_table_data().
This function retrieve data for table opened for replication, not just
table definition.
sql/rpl_utility.cc:
Function table_def::compatible_with is changed to compare table on master
and slave for compatibility and generate a conversions table if they are
compatible.
Computing real type of fields from metadata for ENUM and SET types.
Computing pack_length correctly for ENUM, SET, and BLOB types.
Adding optimization to not check compatibility if no
slave type conversions are enabled.
sql/rpl_utility.h:
Changing prototypes since implementation has changed.
Modifying table_def::type() to return real type instead of stored type.
sql/set_var.cc:
Adding SLAVE_TYPE_CONVERSIONS variable.
sql/set_var.h:
Adding SLAVE_TYPE_CONVERSIONS variable.
sql/share/errmsg.txt:
Adding error messages for slave type conversions.
sql/sql_class.h:
Adding SLAVE_TYPE_CONVERSIONS variable.
sql/sql_select.cc:
Correcting create_virtual_tmp_table() to compute null bit positions
correctly in the presence of bit fields.
2009-12-14 12:04:55 +01:00
|
|
|
DBUG_ASSERT(tabledef_var && conv_table_var);
|
|
|
|
for (TABLE_LIST *ptr= tables_to_lock ; ptr != NULL ; ptr= ptr->next_global)
|
|
|
|
if (ptr->table == table_arg)
|
|
|
|
{
|
|
|
|
*tabledef_var= &static_cast<RPL_TABLE_LIST*>(ptr)->m_tabledef;
|
|
|
|
*conv_table_var= static_cast<RPL_TABLE_LIST*>(ptr)->m_conv_table;
|
|
|
|
DBUG_PRINT("debug", ("Fetching table data for table %s.%s:"
|
|
|
|
" tabledef: %p, conv_table: %p",
|
|
|
|
table_arg->s->db.str, table_arg->s->table_name.str,
|
|
|
|
*tabledef_var, *conv_table_var));
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return false;
|
2007-07-30 00:10:42 +02:00
|
|
|
}
|
|
|
|
|
2005-12-22 06:39:02 +01:00
|
|
|
/*
|
|
|
|
Last charset (6 bytes) seen by slave SQL thread is cached here; it helps
|
|
|
|
the thread save 3 get_charset() per Query_log_event if the charset is not
|
|
|
|
changing from event to event (common situation).
|
|
|
|
When the 6 bytes are equal to 0 is used to mean "cache is invalidated".
|
|
|
|
*/
|
|
|
|
void cached_charset_invalidate();
|
2006-11-10 15:10:41 +01:00
|
|
|
bool cached_charset_compare(char *charset) const;
|
2005-12-22 06:39:02 +01:00
|
|
|
|
|
|
|
void cleanup_context(THD *, bool);
|
Initial import of WL#3726 "DDL locking for all metadata objects".
Backport of:
------------------------------------------------------------
revno: 2630.4.1
committer: Dmitry Lenev <dlenev@mysql.com>
branch nick: mysql-6.0-3726-w
timestamp: Fri 2008-05-23 17:54:03 +0400
message:
WL#3726 "DDL locking for all metadata objects".
After review fixes in progress.
------------------------------------------------------------
This is the first patch in series. It transforms the metadata
locking subsystem to use a dedicated module (mdl.h,cc). No
significant changes in the locking protocol.
The import passes the test suite with the exception of
deprecated/removed 6.0 features, and MERGE tables. The latter
are subject to a fix by WL#4144.
Unfortunately, the original changeset comments got lost in a merge,
thus this import has its own (largely insufficient) comments.
This patch fixes Bug#25144 "replication / binlog with view breaks".
Warning: this patch introduces an incompatible change:
Under LOCK TABLES, it's no longer possible to FLUSH a table that
was not locked for WRITE.
Under LOCK TABLES, it's no longer possible to DROP a table or
VIEW that was not locked for WRITE.
******
Backport of:
------------------------------------------------------------
revno: 2630.4.2
committer: Dmitry Lenev <dlenev@mysql.com>
branch nick: mysql-6.0-3726-w
timestamp: Sat 2008-05-24 14:03:45 +0400
message:
WL#3726 "DDL locking for all metadata objects".
After review fixes in progress.
******
Backport of:
------------------------------------------------------------
revno: 2630.4.3
committer: Dmitry Lenev <dlenev@mysql.com>
branch nick: mysql-6.0-3726-w
timestamp: Sat 2008-05-24 14:08:51 +0400
message:
WL#3726 "DDL locking for all metadata objects"
Fixed failing Windows builds by adding mdl.cc to the lists
of files needed to build server/libmysqld on Windows.
******
Backport of:
------------------------------------------------------------
revno: 2630.4.4
committer: Dmitry Lenev <dlenev@mysql.com>
branch nick: mysql-6.0-3726-w
timestamp: Sat 2008-05-24 21:57:58 +0400
message:
WL#3726 "DDL locking for all metadata objects".
Fix for assert failures in kill.test which occured when one
tried to kill ALTER TABLE statement on merge table while it
was waiting in wait_while_table_is_used() for other connections
to close this table.
These assert failures stemmed from the fact that cleanup code
in this case assumed that temporary table representing new
version of table was open with adding to THD::temporary_tables
list while code which were opening this temporary table wasn't
always fulfilling this.
This patch changes code that opens new version of table to
always do this linking in. It also streamlines cleanup process
for cases when error occurs while we have new version of table
open.
******
WL#3726 "DDL locking for all metadata objects"
Add libmysqld/mdl.cc to .bzrignore.
******
Backport of:
------------------------------------------------------------
revno: 2630.4.6
committer: Dmitry Lenev <dlenev@mysql.com>
branch nick: mysql-6.0-3726-w
timestamp: Sun 2008-05-25 00:33:22 +0400
message:
WL#3726 "DDL locking for all metadata objects".
Addition to the fix of assert failures in kill.test caused by
changes for this worklog.
Make sure we close the new table only once.
.bzrignore:
Add libmysqld/mdl.cc
libmysqld/CMakeLists.txt:
Added mdl.cc to the list of files needed for building of libmysqld.
libmysqld/Makefile.am:
Added files implementing new meta-data locking subsystem to the server.
mysql-test/include/handler.inc:
Use separate connection for waiting while threads performing DDL
operations conflicting with open HANDLER tables reach blocked
state. This is required because now we check and close tables open
by HANDLER statements in this connection conflicting with DDL in
another each time open_tables() is called and thus select from I_S
which is used for waiting will unblock DDL operations if issued
from connection with open HANDLERs.
mysql-test/r/create.result:
Adjusted test case after change in implementation of CREATE TABLE
... SELECT. We no longer have special check in open_table() which
catches the case when we select from the table created. Instead we
rely on unique_table() call which happens after opening and
locking all tables.
mysql-test/r/flush.result:
FLUSH TABLES WITH READ LOCK can no longer happen under LOCK
TABLES. Updated test accordingly.
mysql-test/r/flush_table.result:
Under LOCK TABLES we no longer allow to do FLUSH TABLES for tables
locked for read. Updated test accordingly.
mysql-test/r/handler_innodb.result:
Use separate connection for waiting while threads performing DDL
operations conflicting with open HANDLER tables reach blocked
state. This is required because now we check and close tables open
by HANDLER statements in this connection conflicting with DDL in
another each time open_tables() is called and thus select from I_S
which is used for waiting will unblock DDL operations if issued
from connection with open HANDLERs.
mysql-test/r/handler_myisam.result:
Use separate connection for waiting while threads performing DDL
operations conflicting with open HANDLER tables reach blocked
state. This is required because now we check and close tables open
by HANDLER statements in this connection conflicting with DDL in
another each time open_tables() is called and thus select from I_S
which is used for waiting will unblock DDL operations if issued
from connection with open HANDLERs.
mysql-test/r/information_schema.result:
Additional test for WL#3726 "DDL locking for all metadata
objects". Check that we use high-priority metadata lock requests
when filling I_S tables.
Rearrange tests to match 6.0 better (fewer merge conflicts).
mysql-test/r/kill.result:
Added tests checking that DDL and DML statements waiting for
metadata locks can be interrupted by KILL command.
mysql-test/r/lock.result:
One no longer is allowed to do DROP VIEW under LOCK TABLES even if
this view is locked by LOCK TABLES. The problem is that in such
situation write locks on view are not mutually exclusive so
upgrading metadata lock which is required for dropping of view
will lead to deadlock.
mysql-test/r/partition_column_prune.result:
Update results (same results in 6.0), WL#3726
mysql-test/r/partition_pruning.result:
Update results (same results in 6.0), WL#3726
mysql-test/r/ps_ddl.result:
We no longer invalidate prepared CREATE TABLE ... SELECT statement
if target table changes. This is OK since it is not strictly
necessary.
The first change is wrong, is caused by FLUSH TABLE
now flushing all unused tables. This is a regression that
Dmitri fixed in 6.0 in a follow up patch.
mysql-test/r/sp.result:
Under LOCK TABLES we no longer allow accessing views which were
not explicitly locked. To access view we need to obtain metadata
lock on it and doing this under LOCK TABLES may lead to deadlocks.
mysql-test/r/view.result:
One no longer is allowed to do DROP VIEW under LOCK TABLES even if
this view is locked by LOCK TABLES. The problem is that in such
situation even "write locks" on view are not mutually exclusive so
upgrading metadata lock which is required for dropping of view
will lead to deadlock
mysql-test/r/view_grant.result:
ALTER VIEW implementation was changed to open a view only after
checking that user which does alter has appropriate privileges on
it. This means that in case when user's privileges are
insufficient for this we won't check that new view definer is the
same as original one or user performing alter has SUPER privilege.
Adjusted test case accordingly.
mysql-test/r/view_multi.result:
Added test case for bug#25144 "replication / binlog with view
breaks".
mysql-test/suite/rpl/t/disabled.def:
Disable test for deprecated features (they don't work with new MDL).
mysql-test/t/create.test:
Adjusted test case after change in implementation of CREATE TABLE
... SELECT. We no longer have special check in open_table() which
catches the case when we select from the table created. Instead we
rely on unique_table() call which happens after opening and
locking all tables.
mysql-test/t/disabled.def:
Disable merge.test, subject of WL#4144
mysql-test/t/flush.test:
FLUSH TABLES WITH READ LOCK can no longer happen under LOCK
TABLES. Updated test accordingly.
mysql-test/t/flush_table.test:
Under LOCK TABLES we no longer allow to do FLUSH TABLES for tables
locked for read. Updated test accordingly.
mysql-test/t/information_schema.test:
Additional test for WL#3726 "DDL locking for all metadata
objects". Check that we use high-priority metadata lock requests
when filling I_S tables.
Rearrange the results for easier merges with 6.0.
mysql-test/t/kill.test:
Added tests checking that DDL and DML statements waiting for
metadata locks can be interrupted by KILL command.
mysql-test/t/lock.test:
One no longer is allowed to do DROP VIEW under LOCK TABLES even if
this view is locked by LOCK TABLES. The problem is that in such
situation write locks on view are not mutually exclusive so
upgrading metadata lock which is required for dropping of view
will lead to deadlock.
mysql-test/t/lock_multi.test:
Adjusted test case to the changes of status in various places
caused by change in implementation FLUSH TABLES WITH READ LOCK,
which is now takes global metadata lock before flushing tables and
therefore waits on at these places.
mysql-test/t/ps_ddl.test:
We no longer invalidate prepared CREATE TABLE ... SELECT statement
if target table changes. This is OK since it is not strictly
necessary.
The first change is wrong, is caused by FLUSH TABLE
now flushing all unused tables. This is a regression that
Dmitri fixed in 6.0 in a follow up patch.
mysql-test/t/sp.test:
Under LOCK TABLES we no longer allow accessing views which were
not explicitly locked. To access view we need to obtain metadata
lock on it and doing this under LOCK TABLES may lead to deadlocks.
mysql-test/t/trigger_notembedded.test:
Adjusted test case to the changes of status in various places
caused by change in implementation FLUSH TABLES WITH READ LOCK,
which is now takes global metadata lock before flushing tables and
therefore waits on at these places.
mysql-test/t/view.test:
One no longer is allowed to do DROP VIEW under LOCK TABLES even if
this view is locked by LOCK TABLES. The problem is that in such
situation even "write locks" on view are not mutually exclusive so
upgrading metadata lock which is required for dropping of view
will lead to deadlock.
mysql-test/t/view_grant.test:
ALTER VIEW implementation was changed to open a view only after
checking that user which does alter has appropriate privileges on
it. This means that in case when user's privileges are
insufficient for this we won't check that new view definer is the
same as original one or user performing alter has SUPER privilege.
Adjusted test case accordingly.
mysql-test/t/view_multi.test:
Added test case for bug#25144 "replication / binlog with view
breaks".
sql/CMakeLists.txt:
Added mdl.cc to the list of files needed for building of server.
sql/Makefile.am:
Added files implementing new meta-data locking subsystem to the
server.
sql/event_db_repository.cc:
Allocate metadata lock requests objects (MDL_LOCK) on execution
memory root in cases when TABLE_LIST objects is also allocated
there or on stack.
sql/ha_ndbcluster.cc:
Adjusted code to work nicely with new metadata locking subsystem.
close_cached_tables() no longer has wait_for_placeholder argument.
Instead of relying on this parameter and related behavior FLUSH
TABLES WITH READ LOCK now takes global shared metadata lock.
sql/ha_ndbcluster_binlog.cc:
Adjusted code to work with new metadata locking subsystem.
close_cached_tables() no longer has wait_for_placeholder argument.
Instead of relying on this parameter and related behavior FLUSH
TABLES WITH READ LOCK now takes global shared metadata lock.
sql/handler.cc:
update_frm_version():
Directly update TABLE_SHARE::mysql_version member instead of
going through all TABLE instances for this table (old code was a
legacy from pre-table-definition-cache days).
sql/lock.cc:
Use new metadata locking subsystem. Threw away most of functions
related to name locking as now one is supposed to use metadata
locking API instead. In lock_global_read_lock() and
unlock_global_read_lock() in order to avoid problems with global
read lock sneaking in at the moment when we perform FLUSH TABLES
or ALTER TABLE under LOCK TABLES and when tables being reopened
are protected only by metadata locks we also have to take global
shared meta data lock.
sql/log_event.cc:
Adjusted code to work with new metadata locking subsystem. For
tables open by slave thread for applying RBR events allocate
memory for lock request object in the same chunk of memory as
TABLE_LIST objects for them. In order to ensure that we keep these
objects around until tables are open always close tables before
calling Relay_log_info::clear_tables_to_lock(). Use new auxiliary
Relay_log_info::slave_close_thread_tables() method to enforce
this.
sql/log_event_old.cc:
Adjusted code to work with new metadata locking subsystem. Since
for tables open by slave thread for applying RBR events memory for
lock request object is allocated in the same chunk of memory as
TABLE_LIST objects for them we have to ensure that we keep these
objects around until tables are open. To ensure this we always
close tables before calling
Relay_log_info::clear_tables_to_lock(). To enfore this we use
new auxiliary Relay_log_info::slave_close_thread_tables()
method.
sql/mdl.cc:
Implemented new metadata locking subsystem and API described in
WL3726 "DDL locking for all metadata objects".
sql/mdl.h:
Implemented new metadata locking subsystem and API described in
WL3726 "DDL locking for all metadata objects".
sql/mysql_priv.h:
- close_thread_tables()/close_tables_for_reopen() now has one more
argument which indicates that metadata locks should be released
but not removed from the context in order to be used later in
mdl_wait_for_locks() and tdc_wait_for_old_version().
- close_cached_table() routine is no longer public.
- Thread waiting in wait_while_table_is_used() can be now killed
so this function returns boolean to make caller aware of such
situation.
- We no longer have table cache as separate entity instead used
and unused TABLE instances are linked to TABLE_SHARE objects in
table definition cache.
- Now third argument of open_table() is also used for requesting
table repair or auto-discovery of table's new definition. So its
type was changed from bool to enum.
- Added tdc_open_view() function for opening view by getting its
definition from disk (and table cache in future).
- reopen_name_locked_table() no longer needs "link_in" argument as
now we have exclusive metadata locks instead of dummy TABLE
instances when this function is called.
- find_locked_table() now takes head of list of TABLE instances
instead of always scanning through THD::open_tables list. Also
added find_write_locked_table() auxiliary.
- reopen_tables(), close_cached_tables() no longer have
mark_share_as_old and wait_for_placeholder arguments. Instead of
relying on this parameters and related behavior FLUSH TABLES
WITH READ LOCK now takes global shared metadata lock.
- We no longer need drop_locked_tables() and
abort_locked_tables().
- mysql_ha_rm_tables() now always assume that LOCK_open is not
acquired by caller.
- Added notify_thread_having_shared_lock() callback invoked by
metadata locking subsystem when acquiring an exclusive lock, for
each thread that has a conflicting shared metadata lock.
- Introduced expel_table_from_cache() as replacement for
remove_table_from_cache() (the main difference is that this new
function assumes that caller follows metadata locking protocol
and never waits).
- Threw away most of functions related to name locking. One should
use new metadata locking subsystem and API instead.
sql/mysqld.cc:
Got rid of call initializing/deinitializing table cache since now
it is embedded into table definition cache. Added calls for
initializing/ deinitializing metadata locking subsystem.
sql/rpl_rli.cc:
Introduced auxiliary Relay_log_info::slave_close_thread_tables()
method which is used for enforcing that we always close tables
open for RBR before deallocating TABLE_LIST elements and MDL_LOCK
objects for them.
sql/rpl_rli.h:
Introduced auxiliary Relay_log_info::slave_close_thread_tables()
method which is used for enforcing that we always close tables
open for RBR before deallocating TABLE_LIST elements and MDL_LOCK
objects for them.
sql/set_var.cc:
close_cached_tables() no longer has wait_for_placeholder argument.
Instead of relying on this parameter and related behavior FLUSH
TABLES WITH READ LOCK now takes global shared metadata lock.
sql/sp_head.cc:
For tables added to the statement's table list by prelocking
algorithm we allocate these objects either on the same memory as
corresponding table list elements or on THD::locked_tables_root
(if we are building table list for LOCK TABLES).
sql/sql_acl.cc:
Allocate metadata lock requests objects (MDL_LOCK) on execution
memory root in cases when we use stack TABLE_LIST objects to open
tables. Got rid of redundant code by using unlock_locked_tables()
function.
sql/sql_base.cc:
Changed code to use new MDL subsystem. Got rid of separate table
cache. Now used and unused TABLE instances are linked to the
TABLE_SHAREs in table definition cache.
check_unused():
Adjusted code to the fact that we no longer have separate table
cache. Removed dead code.
table_def_free():
Free TABLE instances referenced from TABLE_SHARE objects before
destroying table definition cache.
get_table_share():
Added assert which ensures that noone will be able to access
table (and its share) without acquiring some kind of metadata
lock first.
close_handle_and_leave_table_as_lock():
Adjusted code to the fact that TABLE instances now are linked to
list in TABLE_SHARE.
list_open_tables():
Changed this function to use table definition cache instead of
table cache.
free_cache_entry():
Unlink freed TABLE elements from the list of all TABLE instances
for the table in TABLE_SHARE.
kill_delayed_thread_for_table():
Added auxiliary for killing delayed insert threads for
particular table.
close_cached_tables():
Got rid of wait_for_refresh argument as we now rely on global
shared metadata lock to prevent FLUSH WITH READ LOCK sneaking in
when we are reopening tables. Heavily reworked this function to
use new MDL code and not to rely on separate table cache entity.
close_open_tables():
We no longer have separate table cache.
close_thread_tables():
Release metadata locks after closing all tables. Added skip_mdl
argument which allows us not to remove metadata lock requests
from the context in case when we are going to use this requests
later in mdl_wait_for_locks() and tdc_wait_for_old_versions().
close_thread_table()/close_table_for_reopen():
Since we no longer have separate table cache and all TABLE
instances are linked to TABLE_SHARE objects in table definition
cache we have to link/unlink TABLE object to/from appropriate
lists in the share.
name_lock_locked_table():
Moved redundant code to find_write_locked_table() function and
adjusted code to the fact that wait_while_table_is_used() can
now return with an error if our thread is killed.
reopen_table_entry():
We no longer need "link_in" argument as with MDL we no longer
call this function with dummy TABLE object pre-allocated and
added to the THD::open_tables. Also now we add newly-open TABLE
instance to the list of share's used TABLE instances.
table_cache_insert_placeholder():
Got rid of name-locking legacy.
lock_table_name_if_not_cached():
Moved to sql_table.cc the only place where it is used. It was
also reimplemented using new MDL API.
open_table():
- Reworked this function to use new MDL subsystem.
- Changed code to deal with table definition cache directly
instead of going through separate table cache.
- Now third argument is also used for requesting table repair
or auto-discovery of table's new definition. So its type was
changed from bool to enum.
find_locked_table()/find_write_locked_table():
Accept head of list of TABLE objects as first argument and use
this list instead of always searching in THD::open_tables list.
Also added auxiliary for finding write-locked locked tables.
reopen_table():
Adjusted function to work with new MDL subsystem and to properly
manuipulate with lists of used/unused TABLE instaces in
TABLE_SHARE.
reopen_tables():
Removed mark_share_as_old parameter. Instead of relying on it
and related behavior FLUSH TABLES WITH READ LOCK now takes
global shared metadata lock. Changed code after removing
separate table cache.
drop_locked_tables()/abort_locked_tables():
Got rid of functions which are no longer needed.
unlock_locked_tables():
Moved this function from sql_parse.cc and changed it to release
memory which was used for allocating metadata lock requests for
tables open and locked by LOCK TABLES.
tdc_open_view():
Intoduced function for opening a view by getting its definition
from disk (and table cache in future).
reopen_table_entry():
Introduced function for opening table definitions while holding
exclusive metatadata lock on it.
open_unireg_entry():
Got rid of this function. Most of its functionality is relocated
to open_table() and open_table_fini() functions, and some of it
to reopen_table_entry() and tdc_open_view(). Also code
resposible for auto-repair and auto-discovery of tables was
moved to separate function.
open_table_entry_fini():
Introduced function which contains common actions which finalize
process of TABLE object creation.
auto_repair_table():
Moved code responsible for auto-repair of table being opened
here.
handle_failed_open_table_attempt()
Moved code responsible for handling failing attempt to open
table to one place (retry due to lock conflict/old version,
auto-discovery and repair).
open_tables():
- Flush open HANDLER tables if they have old version of if there
is conflicting metadata lock against them (before this moment
we had this code in open_table()).
- When we open view which should be processed via derived table
on the second execution of prepared statement or stored
routine we still should call open_table() for it in order to
obtain metadata lock on it and prepare its security context.
- In cases when we discover that some special handling of
failure to open table is needed call
handle_failed_open_table_attempt() which handles all such
scenarios.
open_ltable():
Handling of various special scenarios of failure to open a table
was moved to separate handle_failed_open_table_attempt()
function.
remove_db_from_cache():
Removed this function as it is no longer used.
notify_thread_having_shared_lock():
Added callback which is invoked by MDL subsystem when acquiring
an exclusive lock, for each thread that has a conflicting shared
metadata lock.
expel_table_from_cache():
Introduced function for removing unused TABLE instances. Unlike
remove_table_from_cache() it relies on caller following MDL
protocol and having appropriate locks when calling it and thus
does not do any waiting if table is still in use.
tdc_wait_for_old_version():
Added function which allows open_tables() to wait in cases when
we discover that we should back-off due to presence of old
version of table.
abort_and_upgrade_lock():
Use new MDL calls.
mysql_wait_completed_table():
Got rid of unused function.
open_system_tables_for_read/for_update()/performance_schema_table():
Allocate MDL_LOCK objects on execution memory root in cases when
TABLE_LIST objects for corresponding tables is allocated on
stack.
close_performance_schema_table():
Release metadata locks after closing tables.
******
Use I_P_List for free/used tables list in the table share.
sql/sql_binlog.cc:
Use Relay_log_info::slave_close_thread_tables() method to enforce
that we always close tables open for RBR before deallocating
TABLE_LIST elements and MDL_LOCK objects for them.
sql/sql_class.cc:
Added meta-data locking contexts as part of Open_tables_state
context. Also introduced THD::locked_tables_root memory root
which is to be used for allocating MDL_LOCK objects for tables in
LOCK TABLES statement (end of lifetime for such objects is UNLOCK
TABLES so we can't use statement or execution root for them).
sql/sql_class.h:
Added meta-data locking contexts as part of Open_tables_state
context. Also introduced THD::locked_tables_root memory root
which is to be used for allocating MDL_LOCK objects for tables in
LOCK TABLES statement (end of lifetime for such objects is UNLOCK
TABLES so we can't use statement or execution root for them).
Note: handler_mdl_context and locked_tables_root and
mdl_el_root will be removed by subsequent patches.
sql/sql_db.cc:
mysql_rm_db() does not really need to call remove_db_from_cache()
as it drops each table in the database using
mysql_rm_table_part2(), which performs all necessary operations on
table (definition) cache.
sql/sql_delete.cc:
Use the new metadata locking API for TRUNCATE.
sql/sql_handler.cc:
Changed HANDLER implementation to use new metadata locking
subsystem. Note that MDL_LOCK objects for HANDLER tables are
allocated in the same chunk of heap memory as TABLE_LIST object
for those tables.
sql/sql_insert.cc:
mysql_insert():
find_locked_table() now takes head of list of TABLE object as
its argument instead of always scanning through THD::open_tables
list.
handle_delayed_insert():
Allocate metadata lock request object for table open by delayed
insert thread on execution memroot. create_table_from_items():
We no longer allocate dummy TABLE objects for tables being
created if they don't exist. As consequence
reopen_name_locked_table() no longer has link_in argument.
open_table() now has one more argument which is not relevant for
temporary tables.
sql/sql_parse.cc:
- Moved unlock_locked_tables() routine to sql_base.cc and made
available it in other files. Got rid of some redundant code by
using this function.
- Replaced boolean TABLE_LIST::create member with enum
open_table_type member.
- Use special memory root for allocating MDL_LOCK objects for
tables open and locked by LOCK TABLES (these object should live
till UNLOCK TABLES so we can't allocate them on statement nor
execution memory root). Also properly set metadata lock
upgradability attribure for those tables.
- Under LOCK TABLES it is no longer allowed to flush tables which
are not write-locked as this breaks metadata locking protocol
and thus potentially might lead to deadlock.
- Added auxiliary adjust_mdl_locks_upgradability() function.
sql/sql_partition.cc:
Adjusted code to the fact that reopen_tables() no longer has
"mark_share_as_old" argument. Got rid of comments which are no
longer true.
sql/sql_plist.h:
Added I_P_List template class for parametrized intrusive doubly
linked lists and I_P_List_iterator for corresponding iterator.
Unlike for I_List<> list elements of such list can participate in
several lists. Unlike List<> such lists are doubly-linked and
intrusive.
sql/sql_plugin.cc:
Allocate metadata lock requests objects (MDL_LOCK) on execution
memory root in cases when we use stack TABLE_LIST objects to open
tables.
sql/sql_prepare.cc:
Replaced boolean TABLE_LIST::create member with enum
open_table_type member. This allows easily handle situation in
which instead of opening the table we want only to take exclusive
metadata lock on it.
sql/sql_rename.cc:
Use new metadata locking subsystem in implementation of RENAME
TABLE.
sql/sql_servers.cc:
Allocate metadata lock requests objects (MDL_LOCK) on execution
memory root in cases when we use stack TABLE_LIST objects to open
tables. Got rid of redundant code by using unlock_locked_tables()
function.
sql/sql_show.cc:
Acquire shared metadata lock when we are getting information for
I_S table directly from TABLE_SHARE without doing full-blown table
open. We use high priority lock request in this situation in
order to avoid deadlocks.
Also allocate metadata lock requests objects (MDL_LOCK) on
execution memory root in cases when TABLE_LIST objects are also
allocated there
sql/sql_table.cc:
mysql_rm_table():
Removed comment which is no longer relevant.
mysql_rm_table_part2():
Now caller of mysql_ha_rm_tables() should not own LOCK_open.
Adjusted code to use new metadata locking subsystem instead of
name-locks.
lock_table_name_if_not_cached():
Moved this function from sql_base.cc to this file and
reimplemented it using metadata locking API.
mysql_create_table():
Adjusted code to use new MDL API.
wait_while_table_is_used():
Changed function to use new MDL subsystem. Made thread waiting
in it killable (this also led to introduction of return value so
caller can distinguish successful executions from situations
when waiting was aborted).
close_cached_tables():
Thread waiting in this function is killable now. As result it
has return value for distinguishing between succes and failure.
Got rid of redundant boradcast_refresh() call.
prepare_for_repair():
Use MDL subsystem instead of name-locks.
mysql_admin_table():
mysql_ha_rm_tables() now always assumes that caller doesn't own
LOCK_open.
mysql_repair_table():
We should mark all elements of table list as requiring
upgradable metadata locks.
mysql_create_table_like():
Use new MDL subsystem instead of name-locks.
create_temporary_tables():
We don't need to obtain metadata locks when creating temporary
table.
mysql_fast_or_online_alter_table():
Thread waiting in wait_while_table_is_used() is now killable.
mysql_alter_table():
Adjusted code to work with new MDL subsystem and to the fact
that threads waiting in what_while_table_is_used() and
close_cached_table() are now killable.
sql/sql_test.cc:
We no longer have separate table cache. TABLE instances are now
associated with/linked to TABLE_SHARE objects in table definition
cache.
sql/sql_trigger.cc:
Adjusted code to work with new metadata locking subsystem. Also
reopen_tables() no longer has mark_share_as_old argument (Instead
of relying on this parameter and related behavior FLUSH TABLES
WITH READ LOCK now takes global shared metadata lock).
sql/sql_udf.cc:
Allocate metadata lock requests objects (MDL_LOCK) on execution
memory root in cases when we use stack TABLE_LIST objects to open
tables.
sql/sql_update.cc:
Adjusted code to work with new meta-data locking subsystem.
sql/sql_view.cc:
Added proper meta-data locking to implementations of
CREATE/ALTER/DROP VIEW statements. Now we obtain exclusive
meta-data lock on a view before creating/ changing/dropping it.
This ensures that all concurrent statements that use this view
will finish before our statement will proceed and therefore we
will get correct order of statements in the binary log.
Also ensure that TABLE_LIST::mdl_upgradable attribute is properly
propagated for underlying tables of view.
sql/table.cc:
Added auxiliary alloc_mdl_locks() function for allocating metadata
lock request objects for all elements of table list.
sql/table.h:
TABLE_SHARE:
Got rid of unused members. Introduced members for storing lists
of used and unused TABLE objects for this share.
TABLE:
Added members for linking TABLE objects into per-share lists of
used and unused TABLE instances. Added member for holding
pointer to metadata lock for this table.
TABLE_LIST:
Replaced boolean TABLE_LIST::create member with enum
open_table_type member. This allows easily handle situation in
which instead of opening the table we want only to take
exclusive meta-data lock on it (we need this in order to handle
ALTER VIEW and CREATE VIEW statements).
Introduced new mdl_upgradable member for marking elements of
table list for which we need to take upgradable shared metadata
lock instead of plain shared metadata lock. Added pointer for
holding pointer to MDL_LOCK for the table.
Added auxiliary alloc_mdl_locks() function for allocating metadata
lock requests objects for all elements of table list. Added
auxiliary set_all_mdl_upgradable() function for marking all
elements in table list as requiring upgradable metadata locks.
storage/myisammrg/ha_myisammrg.cc:
Allocate MDL_LOCK objects for underlying tables of MERGE table.
To be reworked once Ingo pushes his patch for WL4144.
2009-11-30 16:55:03 +01:00
|
|
|
void slave_close_thread_tables(THD *);
|
2007-02-26 17:44:55 +01:00
|
|
|
void clear_tables_to_lock();
|
2006-02-16 08:30:53 +01:00
|
|
|
|
2007-01-17 15:06:37 +01:00
|
|
|
/*
|
2009-10-09 15:26:37 +02:00
|
|
|
Used to defer stopping the SQL thread to give it a chance
|
|
|
|
to finish up the current group of events.
|
|
|
|
The timestamp is set and reset in @c sql_slave_killed().
|
|
|
|
*/
|
2007-01-17 15:06:37 +01:00
|
|
|
time_t last_event_start_time;
|
2007-04-12 08:58:04 +02:00
|
|
|
|
2012-04-20 18:41:20 +02:00
|
|
|
/*
|
|
|
|
A container to hold on Intvar-, Rand-, Uservar- log-events in case
|
|
|
|
the slave is configured with table filtering rules.
|
|
|
|
The withhold events are executed when their parent Query destiny is
|
|
|
|
determined for execution as well.
|
|
|
|
*/
|
|
|
|
Deferred_log_events *deferred_events;
|
|
|
|
|
|
|
|
/*
|
|
|
|
State of the container: true stands for IRU events gathering,
|
|
|
|
false does for execution, either deferred or direct.
|
|
|
|
*/
|
|
|
|
bool deferred_events_collecting;
|
|
|
|
|
|
|
|
/*
|
|
|
|
Returns true if the argument event resides in the containter;
|
|
|
|
more specifically, the checking is done against the last added event.
|
|
|
|
*/
|
|
|
|
bool is_deferred_event(Log_event * ev)
|
|
|
|
{
|
|
|
|
return deferred_events_collecting ? deferred_events->is_last(ev) : false;
|
|
|
|
};
|
|
|
|
/* The general cleanup that slave applier may need at the end of query. */
|
|
|
|
inline void cleanup_after_query()
|
|
|
|
{
|
|
|
|
if (deferred_events)
|
|
|
|
deferred_events->rewind();
|
|
|
|
};
|
|
|
|
/* The general cleanup that slave applier may need at the end of session. */
|
|
|
|
void cleanup_after_session()
|
|
|
|
{
|
|
|
|
if (deferred_events)
|
|
|
|
delete deferred_events;
|
|
|
|
};
|
|
|
|
|
2007-04-12 08:58:04 +02:00
|
|
|
/**
|
|
|
|
Helper function to do after statement completion.
|
|
|
|
|
|
|
|
This function is called from an event to complete the group by
|
|
|
|
either stepping the group position, if the "statement" is not
|
|
|
|
inside a transaction; or increase the event position, if the
|
|
|
|
"statement" is inside a transaction.
|
|
|
|
|
|
|
|
@param event_log_pos
|
|
|
|
Master log position of the event. The position is recorded in the
|
|
|
|
relay log info and used to produce information for <code>SHOW
|
|
|
|
SLAVE STATUS</code>.
|
|
|
|
|
|
|
|
@param event_creation_time
|
|
|
|
Timestamp for the creation of the event on the master side. The
|
|
|
|
time stamp is recorded in the relay log info and used to compute
|
|
|
|
the <code>Seconds_behind_master</code> field.
|
|
|
|
*/
|
|
|
|
void stmt_done(my_off_t event_log_pos,
|
2013-07-03 19:03:21 +02:00
|
|
|
time_t event_creation_time, THD *thd,
|
|
|
|
struct rpl_group_info *rgi);
|
2007-04-12 08:58:04 +02:00
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
Set the value of a replication state flag.
|
|
|
|
|
|
|
|
@param flag Flag to set
|
|
|
|
*/
|
|
|
|
void set_flag(enum_state_flag flag)
|
|
|
|
{
|
|
|
|
m_flags |= (1UL << flag);
|
|
|
|
}
|
|
|
|
|
BUG#28618 (Skipping into the middle of a group with SQL_SLAVE_SKIP_COUNTER
is possible):
When skipping the beginning of a transaction starting with BEGIN, the OPTION_BEGIN
flag was not set correctly, which caused the slave to not recognize that it was
inside a group. This patch sets the OPTION_BEGIN flag for BEGIN, COMMIT, ROLLBACK,
and XID events. It also adds checks if inside a group before decreasing the
slave skip counter to zero.
Begin_query_log_event was not marked that it could not end a group, which is now
corrected.
mysql-test/extra/rpl_tests/rpl_extraSlave_Col.test:
Correcting slave skip counter to get the correct behaviour.
mysql-test/suite/rpl/r/rpl_slave_skip.result:
Result change.
mysql-test/suite/rpl/t/rpl_slave_skip.test:
Adding tests to check that skipping works for transactions:
- Skipping one group with BEGIN first
- Skipping two groups with BEGIN first
- Skipping one group without BEGIN first but with AUTOCOMMIT=0
- LOAD DATA INFILE under statement-based replication
mysql-test/suite/rpl_ndb/r/rpl_ndb_extraCol.result:
Result change.
sql/log_event.cc:
Adding checks if we're in a group when the slave skip counter is 1.
In that case, we should keep going.
Adding helping member function Log_event::continue_group() denoting
that this event cannot end a group, and if the skip counter indicates
that the group ends after this event, it should not decrease the skip
counter.
Query_log_event will change the OPTION_BEGIN flag for BEGIN, COMMIT, and
ROLLBACK, even when skipping because of a positive skip count, and
Xid_log_event will also affect the OPTION_BEGIN flag, even when being
skipped.
Begin_load_query_log_event cannot end a group, so it is marked to
continue the group.
sql/log_event.h:
Adding helper function Log_event::continue_group().
sql/rpl_rli.h:
Adding Relay_log_info::get_flag() to get the value of a
replication flag.
sql/slave.cc:
Adding debug output and changing debug message.
mysql-test/suite/rpl/data/rpl_bug28618.dat:
New BitKeeper file ``mysql-test/suite/rpl/data/rpl_bug28618.dat''
mysql-test/suite/rpl/t/rpl_slave_skip-slave.opt:
New BitKeeper file ``mysql-test/suite/rpl/t/rpl_slave_skip-slave.opt''
2007-10-19 14:18:41 +02:00
|
|
|
/**
|
|
|
|
Get the value of a replication state flag.
|
|
|
|
|
|
|
|
@param flag Flag to get value of
|
|
|
|
|
|
|
|
@return @c true if the flag was set, @c false otherwise.
|
|
|
|
*/
|
|
|
|
bool get_flag(enum_state_flag flag)
|
|
|
|
{
|
|
|
|
return m_flags & (1UL << flag);
|
|
|
|
}
|
|
|
|
|
2007-04-12 08:58:04 +02:00
|
|
|
/**
|
|
|
|
Clear the value of a replication state flag.
|
|
|
|
|
|
|
|
@param flag Flag to clear
|
|
|
|
*/
|
|
|
|
void clear_flag(enum_state_flag flag)
|
|
|
|
{
|
|
|
|
m_flags &= ~(1UL << flag);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
Is the replication inside a group?
|
|
|
|
|
|
|
|
Replication is inside a group if either:
|
|
|
|
- The OPTION_BEGIN flag is set, meaning we're inside a transaction
|
|
|
|
- The RLI_IN_STMT flag is set, meaning we're inside a statement
|
|
|
|
|
|
|
|
@retval true Replication thread is currently inside a group
|
|
|
|
@retval false Replication thread is currently not inside a group
|
|
|
|
*/
|
|
|
|
bool is_in_group() const {
|
2009-12-22 10:35:56 +01:00
|
|
|
return (sql_thd->variables.option_bits & OPTION_BEGIN) ||
|
2007-04-12 08:58:04 +02:00
|
|
|
(m_flags & (1UL << IN_STMT));
|
|
|
|
}
|
|
|
|
|
2011-01-10 14:53:09 +01:00
|
|
|
/**
|
|
|
|
Save pointer to Annotate_rows event and switch on the
|
2011-09-23 12:00:52 +02:00
|
|
|
binlog_annotate_row_events for this sql thread.
|
2011-01-10 14:53:09 +01:00
|
|
|
To be called when sql thread recieves an Annotate_rows event.
|
|
|
|
*/
|
|
|
|
inline void set_annotate_event(Annotate_rows_log_event *event)
|
|
|
|
{
|
|
|
|
free_annotate_event();
|
|
|
|
m_annotate_event= event;
|
2011-09-23 12:00:52 +02:00
|
|
|
sql_thd->variables.binlog_annotate_row_events= 1;
|
2011-01-10 14:53:09 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
Returns pointer to the saved Annotate_rows event or NULL if there is
|
|
|
|
no saved event.
|
|
|
|
*/
|
|
|
|
inline Annotate_rows_log_event* get_annotate_event()
|
|
|
|
{
|
|
|
|
return m_annotate_event;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
Delete saved Annotate_rows event (if any) and switch off the
|
2011-09-23 12:00:52 +02:00
|
|
|
binlog_annotate_row_events for this sql thread.
|
2011-01-10 14:53:09 +01:00
|
|
|
To be called when sql thread has applied the last (i.e. with
|
|
|
|
STMT_END_F flag) rbr event.
|
|
|
|
*/
|
|
|
|
inline void free_annotate_event()
|
|
|
|
{
|
|
|
|
if (m_annotate_event)
|
|
|
|
{
|
2011-09-23 12:00:52 +02:00
|
|
|
sql_thd->variables.binlog_annotate_row_events= 0;
|
2011-01-10 14:53:09 +01:00
|
|
|
delete m_annotate_event;
|
|
|
|
m_annotate_event= 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-11-11 18:26:56 +01:00
|
|
|
time_t get_row_stmt_start_timestamp()
|
|
|
|
{
|
|
|
|
return row_stmt_start_timestamp;
|
|
|
|
}
|
|
|
|
|
|
|
|
time_t set_row_stmt_start_timestamp()
|
|
|
|
{
|
|
|
|
if (row_stmt_start_timestamp == 0)
|
|
|
|
row_stmt_start_timestamp= my_time(0);
|
|
|
|
|
|
|
|
return row_stmt_start_timestamp;
|
|
|
|
}
|
|
|
|
|
|
|
|
void reset_row_stmt_start_timestamp()
|
|
|
|
{
|
|
|
|
row_stmt_start_timestamp= 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void set_long_find_row_note_printed()
|
|
|
|
{
|
|
|
|
long_find_row_note_printed= true;
|
|
|
|
}
|
|
|
|
|
|
|
|
void unset_long_find_row_note_printed()
|
|
|
|
{
|
|
|
|
long_find_row_note_printed= false;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool is_long_find_row_note_printed()
|
|
|
|
{
|
|
|
|
return long_find_row_note_printed;
|
|
|
|
}
|
|
|
|
|
2007-04-12 08:58:04 +02:00
|
|
|
private:
|
2011-11-11 18:26:56 +01:00
|
|
|
|
2007-04-12 08:58:04 +02:00
|
|
|
uint32 m_flags;
|
2011-11-11 18:26:56 +01:00
|
|
|
|
|
|
|
/*
|
|
|
|
Runtime state for printing a note when slave is taking
|
|
|
|
too long while processing a row event.
|
|
|
|
*/
|
|
|
|
time_t row_stmt_start_timestamp;
|
|
|
|
bool long_find_row_note_printed;
|
2012-01-16 20:16:35 +01:00
|
|
|
|
2011-01-10 14:53:09 +01:00
|
|
|
Annotate_rows_log_event *m_annotate_event;
|
2007-08-16 07:37:50 +02:00
|
|
|
};
|
2005-12-22 06:39:02 +01:00
|
|
|
|
2006-10-31 12:23:14 +01:00
|
|
|
|
2013-06-28 15:19:30 +02:00
|
|
|
/*
|
|
|
|
This is data for various state needed to be kept for the processing of
|
|
|
|
one event group in the SQL thread.
|
|
|
|
|
|
|
|
For single-threaded replication it is linked from the RLI, for parallel
|
|
|
|
replication it is linked into each event group being executed in parallel.
|
|
|
|
*/
|
|
|
|
struct rpl_group_info
|
|
|
|
{
|
|
|
|
Relay_log_info *rli;
|
2013-07-08 16:47:07 +02:00
|
|
|
THD *thd;
|
2013-06-28 15:19:30 +02:00
|
|
|
/*
|
|
|
|
Current GTID being processed.
|
|
|
|
The sub_id gives the binlog order within one domain_id. A zero sub_id
|
|
|
|
means that there is no active GTID.
|
|
|
|
*/
|
|
|
|
uint64 gtid_sub_id;
|
|
|
|
rpl_gtid current_gtid;
|
2013-07-03 13:46:33 +02:00
|
|
|
/*
|
|
|
|
This is used to keep transaction commit order.
|
|
|
|
We will signal this when we commit, and can register it to wait for the
|
|
|
|
commit_orderer of the previous commit to signal us.
|
|
|
|
*/
|
|
|
|
wait_for_commit commit_orderer;
|
|
|
|
/*
|
|
|
|
If non-zero, the sub_id of a prior event group whose commit we have to wait
|
|
|
|
for before committing ourselves. Then wait_commit_group_info points to the
|
|
|
|
event group to wait for.
|
|
|
|
|
|
|
|
Before using this, rpl_parallel_entry::last_committed_sub_id should be
|
|
|
|
compared against wait_commit_sub_id. Only if last_committed_sub_id is
|
|
|
|
smaller than wait_commit_sub_id must the wait be done (otherwise the
|
|
|
|
waited-for transaction is already committed, so we would otherwise wait
|
|
|
|
for the wrong commit).
|
|
|
|
*/
|
|
|
|
uint64 wait_commit_sub_id;
|
|
|
|
struct rpl_group_info *wait_commit_group_info;
|
2013-07-08 16:47:07 +02:00
|
|
|
/*
|
|
|
|
If non-zero, the event group must wait for this sub_id to be committed
|
|
|
|
before the execution of the event group is allowed to start.
|
|
|
|
|
|
|
|
(When we execute in parallel the transactions that group committed
|
|
|
|
together on the master, we still need to wait for any prior transactions
|
|
|
|
to have commtted).
|
|
|
|
*/
|
|
|
|
uint64 wait_start_sub_id;
|
2013-07-03 13:46:33 +02:00
|
|
|
|
|
|
|
struct rpl_parallel_entry *parallel_entry;
|
|
|
|
|
2013-07-08 16:47:07 +02:00
|
|
|
rpl_group_info(Relay_log_info *rli_);
|
2013-07-03 13:46:33 +02:00
|
|
|
~rpl_group_info() { };
|
2013-06-28 15:19:30 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
|
2006-10-31 12:23:14 +01:00
|
|
|
// Defined in rpl_rli.cc
|
2007-08-16 07:37:50 +02:00
|
|
|
int init_relay_log_info(Relay_log_info* rli, const char* info_fname);
|
2006-10-31 12:23:14 +01:00
|
|
|
|
|
|
|
|
2012-11-05 15:01:49 +01:00
|
|
|
extern struct rpl_slave_state rpl_global_gtid_slave_state;
|
|
|
|
|
2013-03-18 15:09:36 +01:00
|
|
|
int rpl_load_gtid_slave_state(THD *thd);
|
2013-07-03 13:46:33 +02:00
|
|
|
int event_group_new_gtid(rpl_group_info *rgi, Gtid_log_event *gev);
|
2013-07-04 13:17:01 +02:00
|
|
|
void delete_or_keep_event_post_apply(Relay_log_info *rli,
|
|
|
|
Log_event_type typ, Log_event *ev);
|
2012-11-05 15:01:49 +01:00
|
|
|
|
2005-12-22 06:39:02 +01:00
|
|
|
#endif /* RPL_RLI_H */
|