summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <knielsen@knielsen-hq.org>2013-01-22 15:18:36 +0100
committerunknown <knielsen@knielsen-hq.org>2013-01-22 15:18:36 +0100
commit0b36233acd53299f8721d9229698e97b72c90d93 (patch)
tree643a5e4b7f5269c012dea853c54d732af18ba3fa
parentbdbce30dee9bf550cf09e5d9098bc2a7e0ad940e (diff)
downloadmariadb-git-0b36233acd53299f8721d9229698e97b72c90d93.tar.gz
MDEV-26. Intermediate commit.
Implement CHANGE MASTER TO MASTER_GTID_POS=xxx.
-rw-r--r--sql/lex.h2
-rw-r--r--sql/log_event.cc29
-rw-r--r--sql/log_event.h1
-rw-r--r--sql/rpl_mi.cc49
-rw-r--r--sql/rpl_mi.h2
-rw-r--r--sql/slave.cc6
-rw-r--r--sql/sql_lex.h3
-rw-r--r--sql/sql_repl.cc7
-rw-r--r--sql/sql_yacc.yy22
9 files changed, 106 insertions, 15 deletions
diff --git a/sql/lex.h b/sql/lex.h
index e1dc6150cc3..9883dfaf94d 100644
--- a/sql/lex.h
+++ b/sql/lex.h
@@ -77,6 +77,7 @@ static SYMBOL symbols[] = {
{ "AUTHORS", SYM(AUTHORS_SYM)},
{ "AUTO_INCREMENT", SYM(AUTO_INC)},
{ "AUTOEXTEND_SIZE", SYM(AUTOEXTEND_SIZE_SYM)},
+ { "AUTO", SYM(AUTO_SYM)},
{ "AVG", SYM(AVG_SYM)},
{ "AVG_ROW_LENGTH", SYM(AVG_ROW_LENGTH)},
{ "BACKUP", SYM(BACKUP_SYM)},
@@ -329,6 +330,7 @@ static SYMBOL symbols[] = {
{ "LOW_PRIORITY", SYM(LOW_PRIORITY)},
{ "MASTER", SYM(MASTER_SYM)},
{ "MASTER_CONNECT_RETRY", SYM(MASTER_CONNECT_RETRY_SYM)},
+ { "MASTER_GTID_POS", SYM(MASTER_GTID_POS_SYM)},
{ "MASTER_HOST", SYM(MASTER_HOST_SYM)},
{ "MASTER_LOG_FILE", SYM(MASTER_LOG_FILE_SYM)},
{ "MASTER_LOG_POS", SYM(MASTER_LOG_POS_SYM)},
diff --git a/sql/log_event.cc b/sql/log_event.cc
index 7a32a812214..3f008b30aa7 100644
--- a/sql/log_event.cc
+++ b/sql/log_event.cc
@@ -6292,7 +6292,6 @@ rpl_slave_state::tostring(String *dest)
{
bool first= true;
uint32 i;
- int err= 1;
lock();
@@ -6303,9 +6302,8 @@ rpl_slave_state::tostring(String *dest)
element *e= (element *)my_hash_element(&hash, i);
list_element *l= e->list;
- DBUG_ASSERT(l /* We should never have empty list in element. */);
if (!l)
- goto err;
+ continue; /* Nothing here */
best_gtid.domain_id= e->domain_id;
best_gtid.server_id= l->server_id;
@@ -6332,11 +6330,30 @@ rpl_slave_state::tostring(String *dest)
dest->append_ulonglong(best_gtid.seq_no);
}
- err= 0;
+ unlock();
+ return 0;
+}
+
-err:
+bool
+rpl_slave_state::is_empty()
+{
+ uint32 i;
+ bool result= true;
+
+ lock();
+ for (i= 0; i < hash.records; ++i)
+ {
+ element *e= (element *)my_hash_element(&hash, i);
+ if (e->list)
+ {
+ result= false;
+ break;
+ }
+ }
unlock();
- return err;
+
+ return result;
}
diff --git a/sql/log_event.h b/sql/log_event.h
index 3b0988faef4..6d9b4172858 100644
--- a/sql/log_event.h
+++ b/sql/log_event.h
@@ -3009,6 +3009,7 @@ struct rpl_slave_state
bool in_transaction);
uint64 next_subid(uint32 domain_id);
int tostring(String *dest);
+ bool is_empty();
void lock() { DBUG_ASSERT(inited); mysql_mutex_lock(&LOCK_slave_state); }
void unlock() { DBUG_ASSERT(inited); mysql_mutex_unlock(&LOCK_slave_state); }
diff --git a/sql/rpl_mi.cc b/sql/rpl_mi.cc
index ae9927c1204..608a30448aa 100644
--- a/sql/rpl_mi.cc
+++ b/sql/rpl_mi.cc
@@ -37,7 +37,7 @@ Master_info::Master_info(LEX_STRING *connection_name_arg,
checksum_alg_before_fd(BINLOG_CHECKSUM_ALG_UNDEF),
connect_retry(DEFAULT_CONNECT_RETRY), inited(0), abort_slave(0),
slave_running(0), slave_run_id(0), sync_counter(0),
- heartbeat_period(0), received_heartbeats(0), master_id(0)
+ heartbeat_period(0), received_heartbeats(0), master_id(0), gtid_pos_auto(0)
{
host[0] = 0; user[0] = 0; password[0] = 0;
ssl_ca[0]= 0; ssl_capath[0]= 0; ssl_cert[0]= 0;
@@ -172,8 +172,13 @@ enum {
LINE_FOR_MASTER_BIND = 17,
/* 6.0 added value of master_ignore_server_id */
LINE_FOR_REPLICATE_IGNORE_SERVER_IDS= 18,
- /* Number of lines currently used when saving master info file */
- LINES_IN_MASTER_INFO= LINE_FOR_REPLICATE_IGNORE_SERVER_IDS
+ /* MySQL 5.6 fixed-position lines. */
+ LINE_FOR_FIRST_MYSQL_5_6=19,
+ LINE_FOR_LAST_MYSQL_5_6=23,
+ /* Reserved lines for MySQL future versions. */
+ LINE_FOR_LAST_MYSQL_FUTURE=33,
+ /* Number of (fixed-position) lines used when saving master info file */
+ LINES_IN_MASTER_INFO= LINE_FOR_LAST_MYSQL_FUTURE
};
int init_master_info(Master_info* mi, const char* master_info_fname,
@@ -301,7 +306,7 @@ file '%s')", fname);
int ssl= 0, ssl_verify_server_cert= 0;
float master_heartbeat_period= 0.0;
char *first_non_digit;
- char dummy_buf[HOSTNAME_LENGTH+1];
+ char buf[HOSTNAME_LENGTH+1];
/*
Starting from 4.1.x master.info has new format. Now its
@@ -395,7 +400,7 @@ file '%s')", fname);
(this is just a reservation to avoid future upgrade problems)
*/
if (lines >= LINE_FOR_MASTER_BIND &&
- init_strvar_from_file(dummy_buf, sizeof(dummy_buf), &mi->file, ""))
+ init_strvar_from_file(buf, sizeof(buf), &mi->file, ""))
goto errwithmsg;
/*
Starting from 6.0 list of server_id of ignorable servers might be
@@ -407,6 +412,34 @@ file '%s')", fname);
sql_print_error("Failed to initialize master info ignore_server_ids");
goto errwithmsg;
}
+
+ /*
+ Starting with MariaDB 10.0, we use a key=value syntax, which is nicer
+ in several ways. But we leave a bunch of empty lines to accomodate
+ any future old-style additions in MySQL (this will make it easier for
+ users moving from MariaDB to MySQL, to not have MySQL try to
+ interpret a MariaDB key=value line.)
+ */
+ if (lines >= LINE_FOR_LAST_MYSQL_FUTURE)
+ {
+ uint i;
+ /* Skip lines used by / reserved for MySQL >= 5.6. */
+ for (i= LINE_FOR_FIRST_MYSQL_5_6; i <= LINE_FOR_LAST_MYSQL_FUTURE; ++i)
+ {
+ if (init_strvar_from_file(buf, sizeof(buf), &mi->file, ""))
+ goto errwithmsg;
+ }
+
+ /*
+ Parse any extra key=value lines.
+ Ignore unknown lines, to facilitate downgrades.
+ */
+ while (!init_strvar_from_file(buf, sizeof(buf), &mi->file, 0))
+ {
+ if (0 == strncmp(buf, STRING_WITH_LEN("gtid_pos_auto=")))
+ mi->gtid_pos_auto= (0 != atoi(buf + sizeof("gtid_pos_auto")));
+ }
+ }
}
#ifndef HAVE_OPENSSL
@@ -546,14 +579,16 @@ int flush_master_info(Master_info* mi,
sprintf(heartbeat_buf, "%.3f", mi->heartbeat_period);
my_b_seek(file, 0L);
my_b_printf(file,
- "%u\n%s\n%s\n%s\n%s\n%s\n%d\n%d\n%d\n%s\n%s\n%s\n%s\n%s\n%d\n%s\n%s\n%s\n",
+ "%u\n%s\n%s\n%s\n%s\n%s\n%d\n%d\n%d\n%s\n%s\n%s\n%s\n%s\n%d\n%s\n%s\n%s\n"
+ "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
+ "gtid_pos_auto=%d\n",
LINES_IN_MASTER_INFO,
mi->master_log_name, llstr(mi->master_log_pos, lbuf),
mi->host, mi->user,
mi->password, mi->port, mi->connect_retry,
(int)(mi->ssl), mi->ssl_ca, mi->ssl_capath, mi->ssl_cert,
mi->ssl_cipher, mi->ssl_key, mi->ssl_verify_server_cert,
- heartbeat_buf, "", ignore_server_ids_buf);
+ heartbeat_buf, "", ignore_server_ids_buf, mi->gtid_pos_auto);
my_free(ignore_server_ids_buf);
err= flush_io_cache(file);
if (sync_masterinfo_period && !err &&
diff --git a/sql/rpl_mi.h b/sql/rpl_mi.h
index adede7935c6..61ee5227693 100644
--- a/sql/rpl_mi.h
+++ b/sql/rpl_mi.h
@@ -126,6 +126,8 @@ class Master_info : public Slave_reporting_capability
ulonglong received_heartbeats; // counter of received heartbeat events
DYNAMIC_ARRAY ignore_server_ids;
ulong master_id;
+ /* If last CHANGE MASTER was MASTER_GTID_POS=AUTO. */
+ bool gtid_pos_auto;
};
int init_master_info(Master_info* mi, const char* master_info_fname,
const char* slave_info_fname,
diff --git a/sql/slave.cc b/sql/slave.cc
index 66913f3ccf0..a16c56053f4 100644
--- a/sql/slave.cc
+++ b/sql/slave.cc
@@ -1786,8 +1786,7 @@ after_set_capability:
/* Request dump start from slave replication GTID state. */
- /* ToDo: This needs to be configurable somehow in a useful way ... */
- if (rpl_global_gtid_slave_state.count())
+ if (mi->gtid_pos_auto)
{
int rc;
char str_buf[256];
@@ -2162,6 +2161,8 @@ static bool send_show_master_info_header(THD *thd, bool full)
10, MYSQL_TYPE_LONG));
field_list.push_back(new Item_float("Slave_heartbeat_period",
0.0, 3, 10));
+ field_list.push_back(new Item_return_int("Gtid_Pos_Auto", sizeof(ulong),
+ MYSQL_TYPE_LONG));
}
if (protocol->send_result_set_metadata(&field_list,
Protocol::SEND_NUM_ROWS | Protocol::SEND_EOF))
@@ -2332,6 +2333,7 @@ static bool send_show_master_info_data(THD *thd, Master_info *mi, bool full)
protocol->store((uint32) mi->rli.executed_entries);
protocol->store((uint32) mi->received_heartbeats);
protocol->store((double) mi->heartbeat_period, 3, &tmp);
+ protocol->store((uint32) (mi->gtid_pos_auto != 0));
}
mysql_mutex_unlock(&mi->rli.err_lock);
diff --git a/sql/sql_lex.h b/sql/sql_lex.h
index ec229144b36..426fb497c39 100644
--- a/sql/sql_lex.h
+++ b/sql/sql_lex.h
@@ -290,6 +290,8 @@ struct LEX_MASTER_INFO
char *relay_log_name;
LEX_STRING connection_name;
ulonglong pos;
+ LEX_STRING gtid_pos_str;
+ bool gtid_pos_auto;
ulong relay_log_pos;
ulong server_id;
uint port, connect_retry;
@@ -313,6 +315,7 @@ struct LEX_MASTER_INFO
host= user= password= log_file_name= ssl_key= ssl_cert= ssl_ca=
ssl_capath= ssl_cipher= relay_log_name= 0;
pos= relay_log_pos= server_id= port= connect_retry= 0;
+ gtid_pos_auto= FALSE;
heartbeat_period= 0;
ssl= ssl_verify_server_cert= heartbeat_opt=
repl_ignore_server_ids_opt= LEX_MI_UNCHANGED;
diff --git a/sql/sql_repl.cc b/sql/sql_repl.cc
index cd32dd7148a..886ef79067b 100644
--- a/sql/sql_repl.cc
+++ b/sql/sql_repl.cc
@@ -2236,6 +2236,13 @@ bool change_master(THD* thd, Master_info* mi, bool *master_info_added)
mi->rli.group_relay_log_pos= mi->rli.event_relay_log_pos= lex_mi->relay_log_pos;
}
+ if (lex_mi->gtid_pos_auto)
+ mi->gtid_pos_auto= true;
+ else if (lex_mi->gtid_pos_str.str ||
+ lex_mi->log_file_name || lex_mi->pos ||
+ lex_mi->relay_log_name || lex_mi->relay_log_pos)
+ mi->gtid_pos_auto= false;
+
/*
If user did specify neither host nor port nor any log name nor any log
pos, i.e. he specified only user/password/master_connect_retry, he probably
diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy
index 9664aad1e19..5bd02c39231 100644
--- a/sql/sql_yacc.yy
+++ b/sql/sql_yacc.yy
@@ -835,6 +835,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize);
%token AUTHORS_SYM
%token AUTOEXTEND_SIZE_SYM
%token AUTO_INC
+%token AUTO_SYM
%token AVG_ROW_LENGTH
%token AVG_SYM /* SQL-2003-N */
%token BACKUP_SYM
@@ -1094,6 +1095,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize);
%token LOW_PRIORITY
%token LT /* OPERATOR */
%token MASTER_CONNECT_RETRY_SYM
+%token MASTER_GTID_POS_SYM
%token MASTER_HOST_SYM
%token MASTER_LOG_FILE_SYM
%token MASTER_LOG_POS_SYM
@@ -2058,6 +2060,24 @@ master_file_def:
/* Adjust if < BIN_LOG_HEADER_SIZE (same comment as Lex->mi.pos) */
Lex->mi.relay_log_pos = max(BIN_LOG_HEADER_SIZE, Lex->mi.relay_log_pos);
}
+ | MASTER_GTID_POS_SYM EQ TEXT_STRING_sys
+ {
+ if (Lex->mi.gtid_pos_str.str || Lex->mi.gtid_pos_auto)
+ {
+ my_error(ER_DUP_ARGUMENT, MYF(0), "MASTER_GTID_POS");
+ MYSQL_YYABORT;
+ }
+ Lex->mi.gtid_pos_str = $3;
+ }
+ | MASTER_GTID_POS_SYM EQ AUTO_SYM
+ {
+ if (Lex->mi.gtid_pos_str.str || Lex->mi.gtid_pos_auto)
+ {
+ my_error(ER_DUP_ARGUMENT, MYF(0), "MASTER_GTID_POS");
+ MYSQL_YYABORT;
+ }
+ Lex->mi.gtid_pos_auto = true;
+ }
;
optional_connection_name:
@@ -13182,6 +13202,7 @@ keyword_sp:
| AUTHORS_SYM {}
| AUTO_INC {}
| AUTOEXTEND_SIZE_SYM {}
+ | AUTO_SYM {}
| AVG_ROW_LENGTH {}
| AVG_SYM {}
| BINLOG_SYM {}
@@ -13292,6 +13313,7 @@ keyword_sp:
| MAX_ROWS {}
| MASTER_SYM {}
| MASTER_HEARTBEAT_PERIOD_SYM {}
+ | MASTER_GTID_POS_SYM {}
| MASTER_HOST_SYM {}
| MASTER_PORT_SYM {}
| MASTER_LOG_FILE_SYM {}