summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorMonty <monty@mariadb.org>2015-02-01 22:39:59 +0200
committerMonty <monty@mariadb.org>2015-02-01 22:39:59 +0200
commitcd9e69ec709ad960e40633f09dc9660fa5866929 (patch)
tree19d80890d545bfde61fe1fd2f3c957a2f5a10557 /sql
parent0ee879ff8ac1b80cd9a963015344f5698a81f309 (diff)
downloadmariadb-git-cd9e69ec709ad960e40633f09dc9660fa5866929.tar.gz
Cleaned up code for setting slave_parallel_mode
Now this works the same way as all other multi source variables.
Diffstat (limited to 'sql')
-rw-r--r--sql/mysqld.cc32
-rw-r--r--sql/mysqld.h10
-rw-r--r--sql/rpl_filter.cc4
-rw-r--r--sql/rpl_filter.h13
-rw-r--r--sql/rpl_mi.cc173
-rw-r--r--sql/rpl_mi.h21
6 files changed, 46 insertions, 207 deletions
diff --git a/sql/mysqld.cc b/sql/mysqld.cc
index 6597552a8c2..a94b696281b 100644
--- a/sql/mysqld.cc
+++ b/sql/mysqld.cc
@@ -2120,7 +2120,6 @@ void clean_up(bool print_message)
free_all_rpl_filters();
#ifdef HAVE_REPLICATION
end_slave_list();
- mi_cmdline_destroy();
#endif
my_uuid_end();
delete binlog_filter;
@@ -8849,6 +8848,12 @@ mysqld_get_one_option(int optid, const struct my_option *opt, char *argument)
cur_rpl_filter->add_db_rewrite(key, val);
break;
}
+ case (int)OPT_SLAVE_PARALLEL_MODE:
+ {
+ /* Store latest mode for Master::Info */
+ cur_rpl_filter->set_parallel_mode(opt_slave_parallel_mode);
+ break;
+ }
case (int)OPT_BINLOG_IGNORE_DB:
{
@@ -9094,6 +9099,7 @@ mysql_getopt_value(const char *name, uint length,
return (uchar**) &key_cache->changed_blocks_hash_size;
}
}
+#ifdef HAVE_REPLICATION
case OPT_REPLICATE_DO_DB:
case OPT_REPLICATE_DO_TABLE:
case OPT_REPLICATE_IGNORE_DB:
@@ -9101,6 +9107,7 @@ mysql_getopt_value(const char *name, uint length,
case OPT_REPLICATE_WILD_DO_TABLE:
case OPT_REPLICATE_WILD_IGNORE_TABLE:
case OPT_REPLICATE_REWRITE_DB:
+ case OPT_SLAVE_PARALLEL_MODE:
{
/* Store current filter for mysqld_get_one_option() */
if (!(cur_rpl_filter= get_or_create_rpl_filter(name, length)))
@@ -9108,24 +9115,15 @@ mysql_getopt_value(const char *name, uint length,
if (error)
*error= EXIT_OUT_OF_MEMORY;
}
- return 0;
- }
-#ifdef HAVE_REPLICATION
- case OPT_SLAVE_PARALLEL_MODE:
- {
- ulonglong *ptr;
- LEX_STRING connection_name;
- if (!length)
- return &opt_slave_parallel_mode;
- connection_name.str= const_cast<char *>(name);
- connection_name.length= length;
- if (mi_slave_parallel_mode_ptr(&connection_name, &ptr, true))
+ if (option->id == OPT_SLAVE_PARALLEL_MODE)
{
- if (error)
- *error= EXIT_OUT_OF_MEMORY;
- return NULL;
+ /*
+ Ensure parallel_mode variable is shown in --help. The other
+ variables are not easily printable here.
+ */
+ return (char**) &opt_slave_parallel_mode;
}
- return ptr;
+ return 0;
}
#endif
}
diff --git a/sql/mysqld.h b/sql/mysqld.h
index 5d331fa4809..f89f2e99188 100644
--- a/sql/mysqld.h
+++ b/sql/mysqld.h
@@ -60,6 +60,16 @@ typedef Bitmap<((MAX_INDEXES+7)/8*8)> key_map; /* Used for finding keys */
#define OPT_SESSION SHOW_OPT_SESSION
#define OPT_GLOBAL SHOW_OPT_GLOBAL
+/*
+ Bit masks for the values in --slave-parallel-mode.
+ Note that these values cannot be changed - they are stored in master.info,
+ so need to be possible to read back in a different version of the server.
+*/
+#define SLAVE_PARALLEL_DOMAIN (1ULL << 0)
+#define SLAVE_PARALLEL_FOLLOW_MASTER_COMMIT (1ULL << 1)
+#define SLAVE_PARALLEL_TRX (1ULL << 2)
+#define SLAVE_PARALLEL_WAITING (1ULL << 3)
+
/* Function prototypes */
void kill_mysql(void);
void close_connection(THD *thd, uint sql_errno= 0);
diff --git a/sql/rpl_filter.cc b/sql/rpl_filter.cc
index 28859c2eb85..e3ebd329cc4 100644
--- a/sql/rpl_filter.cc
+++ b/sql/rpl_filter.cc
@@ -24,7 +24,9 @@
#define TABLE_RULE_ARR_SIZE 16
Rpl_filter::Rpl_filter() :
- table_rules_on(0), do_table_inited(0), ignore_table_inited(0),
+ parallel_mode(SLAVE_PARALLEL_DOMAIN | SLAVE_PARALLEL_FOLLOW_MASTER_COMMIT),
+ table_rules_on(0),
+ do_table_inited(0), ignore_table_inited(0),
wild_do_table_inited(0), wild_ignore_table_inited(0)
{
do_db.empty();
diff --git a/sql/rpl_filter.h b/sql/rpl_filter.h
index 65d11cfb6e6..f08971a9ac1 100644
--- a/sql/rpl_filter.h
+++ b/sql/rpl_filter.h
@@ -76,6 +76,16 @@ public:
int set_do_db(const char* db_spec);
int set_ignore_db(const char* db_spec);
+ void set_parallel_mode(ulonglong mode)
+ {
+ parallel_mode= mode;
+ }
+ /* Return given parallel mode or if one is not given, the default mode */
+ int get_parallel_mode()
+ {
+ return parallel_mode;
+ }
+
void add_db_rewrite(const char* from_db, const char* to_db);
/* Getters - to get information about current rules */
@@ -97,7 +107,6 @@ public:
void get_ignore_db(String* str);
private:
- bool table_rules_on;
void init_table_rule_hash(HASH* h, bool* h_inited);
void init_table_rule_array(DYNAMIC_ARRAY* a, bool* a_inited);
@@ -128,7 +137,9 @@ private:
HASH ignore_table;
DYNAMIC_ARRAY wild_do_table;
DYNAMIC_ARRAY wild_ignore_table;
+ ulonglong parallel_mode;
+ bool table_rules_on;
bool do_table_inited;
bool ignore_table_inited;
bool wild_do_table_inited;
diff --git a/sql/rpl_mi.cc b/sql/rpl_mi.cc
index b61b2bf3586..e97b5ecc8fe 100644
--- a/sql/rpl_mi.cc
+++ b/sql/rpl_mi.cc
@@ -64,15 +64,16 @@ Master_info::Master_info(LEX_STRING *connection_name_arg,
connection_name.length+1);
my_casedn_str(system_charset_info, cmp_connection_name.str);
}
- /* When MySQL restarted, all Rpl_filter settings which aren't in the my.cnf
- * will lose. So if you want a setting will not lose after restarting, you
- * should add them into my.cnf
- * */
+ /*
+ When MySQL restarted, all Rpl_filter settings which aren't in the my.cnf
+ will be lost. If you want to lose a setting after restart, you
+ should add them into my.cnf
+ */
rpl_filter= get_or_create_rpl_filter(connection_name.str,
connection_name.length);
copy_filter_setting(rpl_filter, global_rpl_filter);
- mi_slave_parallel_mode_lookup(&connection_name, &parallel_mode);
+ parallel_mode= rpl_filter->get_parallel_mode();
my_init_dynamic_array(&ignore_server_ids,
sizeof(global_system_variables.server_id), 16, 16,
@@ -178,7 +179,6 @@ void init_master_log_pos(Master_info* mi)
mi->events_queued_since_last_gtid= 0;
mi->gtid_reconnect_event_skip_count= 0;
mi->gtid_event_seen= false;
- mi_slave_parallel_mode_lookup(&mi->connection_name, &mi->parallel_mode);
/* Intentionally init ssl_verify_server_cert to 0, no option available */
mi->ssl_verify_server_cert= 0;
@@ -1716,165 +1716,4 @@ void prot_store_ids(THD *thd, DYNAMIC_ARRAY *ids)
return;
}
-/*
- We need to handle per-Master_info command line options special.
- Because when command line options are parsed, we do not yet have any
- Master_info objects.
-*/
-static HASH mi_cmdline_hash;
-static bool mi_cmdline_hash_inited= false;
-struct mi_cmdline_entry {
- LEX_STRING cmp_connection_name;
- ulonglong parallel_mode;
-};
-
-
-static uchar *
-get_key_cmdline(const uchar *ptr, size_t *length_p,
- my_bool unused __attribute__((unused)))
-{
- mi_cmdline_entry *entry= (mi_cmdline_entry *)ptr;
- *length_p= entry->cmp_connection_name.length;
- return (uchar *)entry->cmp_connection_name.str;
-}
-
-
-static void
-free_key_cmdline(void *ptr)
-{
- mi_cmdline_entry *entry= (mi_cmdline_entry *)ptr;
- my_free(entry->cmp_connection_name.str);
- my_free(entry);
-}
-
-
-int
-mi_cmdline_init()
-{
- if (mi_cmdline_hash_inited)
- return 0;
- if (my_hash_init(&mi_cmdline_hash, system_charset_info,
- MAX_REPLICATION_THREAD, 0, 0, get_key_cmdline,
- free_key_cmdline, HASH_UNIQUE))
- {
- sql_print_error("Initializing Master_info command line option hash table failed");
- return 1;
- }
- mi_cmdline_hash_inited= true;
- return 0;
-}
-
-
-void
-mi_cmdline_destroy()
-{
- if (mi_cmdline_hash_inited)
- my_hash_free(&mi_cmdline_hash);
- mi_cmdline_hash_inited= false;
-}
-
-
-static mi_cmdline_entry *
-mi_cmdline_entry_get(LEX_STRING *connection_name, bool create_if_missing)
-{
- LEX_STRING cmp_connection_name;
- mi_cmdline_entry *entry;
-
- if (!mi_cmdline_hash_inited &&
- (!create_if_missing || mi_cmdline_init()))
- return NULL;
-
- /* Create a lowercase key for hash lookup. */
- cmp_connection_name.length= connection_name->length;
- if (!(cmp_connection_name.str= (char *)my_malloc(connection_name->length+1,
- MYF(MY_WME))))
- {
- if (create_if_missing)
- my_error(ER_OUTOFMEMORY, MYF(0), connection_name->length+1);
- return NULL;
- }
- memcpy(cmp_connection_name.str, connection_name->str,
- connection_name->length + 1);
- my_casedn_str(system_charset_info, cmp_connection_name.str);
-
- if ((entry= (mi_cmdline_entry *)
- my_hash_search(&mi_cmdline_hash, (uchar *)cmp_connection_name.str,
- cmp_connection_name.length)) ||
- !create_if_missing)
- {
- my_free(cmp_connection_name.str);
- return entry;
- }
-
- if (!(entry= (mi_cmdline_entry *)my_malloc(sizeof(*entry), MYF(MY_WME))))
- {
- my_error(ER_OUTOFMEMORY, MYF(0), sizeof(*entry));
- my_free(cmp_connection_name.str);
- return NULL;
- }
- entry->cmp_connection_name= cmp_connection_name;
- entry->parallel_mode= opt_slave_parallel_mode;
- if (my_hash_insert(&mi_cmdline_hash, (uchar *)entry))
- {
- my_error(ER_OUT_OF_RESOURCES, MYF(0));
- my_free(entry);
- my_free(cmp_connection_name.str);
- return NULL;
- }
- return entry;
-}
-
-
-/*
- Look up a command line value for slave_parallel_mode. The value is returned
- in *out_mode. If no command line value was given for this particular
- connection name, the default value in opt_slave_parallel_mode is used.
-*/
-void
-mi_slave_parallel_mode_lookup(LEX_STRING *connection_name, ulonglong *out_mode)
-{
- mi_cmdline_entry *entry;
-
- if (!mi_cmdline_hash_inited ||
- !(entry= mi_cmdline_entry_get(connection_name, false)))
- *out_mode= opt_slave_parallel_mode;
- else
- *out_mode= entry->parallel_mode;
-}
-
-
-/*
- Get a pointer to the location holding the value of the slave_parallel_mode
- command line option for the given connection name. The pointer is returned
- in *out_mode_ptr
-
- If create_if_missing is true, then a new entry will be created if one did
- not already exists. If false, then NULL will be returned in *out_mode_ptr if
- an entry does not exist.
-
- Returns 1 on error, 0 if ok.
-*/
-int
-mi_slave_parallel_mode_ptr(LEX_STRING *connection_name,
- ulonglong **out_mode_ptr, bool create_if_missing)
-{
- mi_cmdline_entry *entry;
-
- *out_mode_ptr= NULL;
- if (!create_if_missing && !mi_cmdline_hash_inited)
- return 0;
-
- entry= mi_cmdline_entry_get(connection_name, create_if_missing);
- if (!entry)
- {
- if (create_if_missing)
- return 1;
- else
- return 0;
- }
- *out_mode_ptr= &entry->parallel_mode;
- return 0;
-}
-
-
#endif /* HAVE_REPLICATION */
diff --git a/sql/rpl_mi.h b/sql/rpl_mi.h
index 6c970de608b..87ac0a5a46b 100644
--- a/sql/rpl_mi.h
+++ b/sql/rpl_mi.h
@@ -16,18 +16,6 @@
#ifndef RPL_MI_H
#define RPL_MI_H
-
-/*
- Bit masks for the values in --slave-parallel-mode.
- Note that these values cannot be changed - they are stored in master.info,
- so need to be possible to read back in a different version of the server.
-*/
-#define SLAVE_PARALLEL_DOMAIN (1ULL << 0)
-#define SLAVE_PARALLEL_FOLLOW_MASTER_COMMIT (1ULL << 1)
-#define SLAVE_PARALLEL_TRX (1ULL << 2)
-#define SLAVE_PARALLEL_WAITING (1ULL << 3)
-
-
#ifdef HAVE_REPLICATION
#include "rpl_rli.h"
@@ -383,14 +371,5 @@ void create_logfile_name_with_suffix(char *res_file_name, size_t length,
uchar *get_key_master_info(Master_info *mi, size_t *length,
my_bool not_used __attribute__((unused)));
void free_key_master_info(Master_info *mi);
-int mi_cmdline_init();
-void mi_cmdline_destroy();
-void mi_slave_parallel_mode_lookup(LEX_STRING *connection_name,
- ulonglong *out_mode);
-int mi_slave_parallel_mode_ptr(LEX_STRING *connection_name,
- ulonglong **out_mode_ptr,
- bool create_if_missing);
-
-
#endif /* HAVE_REPLICATION */
#endif /* RPL_MI_H */