#At file:///home/andrei/MySQL/BZR/2a-23May/WL/mysql-next-mr-wl5569/ based on revid:andrei.elkin@stripped
3238 Andrei Elkin 2010-12-09 [merge]
merge from wl5569 repo to a local branch
added:
mysql-test/include/not_worker_info_table.inc
mysql-test/suite/sys_vars/r/worker_info_repository_basic.result
mysql-test/suite/sys_vars/t/worker_info_repository_basic.test
modified:
mysql-test/r/information_schema.result
mysql-test/r/mysqld--help-notwin.result
mysql-test/r/mysqld--help-win.result
mysql-test/suite/rpl/t/rpl_parallel-slave.opt
sql/rpl_info_dummy.cc
sql/rpl_info_dummy.h
sql/rpl_info_factory.cc
sql/rpl_info_factory.h
sql/rpl_rli_pdb.h
sql/rpl_slave.cc
sql/sys_vars.cc
=== added file 'mysql-test/include/not_worker_info_table.inc'
--- a/mysql-test/include/not_worker_info_table.inc 1970-01-01 00:00:00 +0000
+++ b/mysql-test/include/not_worker_info_table.inc 2010-12-09 13:23:19 +0000
@@ -0,0 +1,4 @@
+if (`SELECT @@GLOBAL.worker_info_repository = 'TABLE'`)
+{
+ skip Test cannot run with worker.info repository table;
+}
=== modified file 'mysql-test/r/information_schema.result'
--- a/mysql-test/r/information_schema.result 2010-12-08 00:33:48 +0000
+++ b/mysql-test/r/information_schema.result 2010-12-08 23:04:43 +0000
@@ -877,7 +877,7 @@ AND table_name not like 'ndb%' AND table
GROUP BY TABLE_SCHEMA;
table_schema count(*)
information_schema 30
-mysql 25
+mysql 26
create table t1 (i int, j int);
create trigger trg1 before insert on t1 for each row
begin
=== modified file 'mysql-test/r/mysqld--help-notwin.result'
--- a/mysql-test/r/mysqld--help-notwin.result 2010-12-08 01:30:32 +0000
+++ b/mysql-test/r/mysqld--help-notwin.result 2010-12-09 13:23:19 +0000
@@ -767,6 +767,9 @@ The following options may be given as th
-V, --version Output version information and exit.
--wait-timeout=# The number of seconds the server waits for activity on a
connection before closing it
+ --worker-info-repository=name
+ Defines the type of the repository for the worker
+ information.
Variables (--variable-name=value)
abort-slave-event-count 0
@@ -1002,6 +1005,7 @@ transaction-prealloc-size 4096
updatable-views-with-limit YES
verbose TRUE
wait-timeout 28800
+worker-info-repository FILE
To see what values a running MySQL server is using, type
'mysqladmin variables' instead of 'mysqld --verbose --help'.
=== modified file 'mysql-test/r/mysqld--help-win.result'
--- a/mysql-test/r/mysqld--help-win.result 2010-12-08 01:30:32 +0000
+++ b/mysql-test/r/mysqld--help-win.result 2010-12-09 13:23:19 +0000
@@ -771,6 +771,9 @@ The following options may be given as th
-V, --version Output version information and exit.
--wait-timeout=# The number of seconds the server waits for activity on a
connection before closing it
+ --worker-info-repository=name
+ Defines the type of the repository for the worker
+ information.
Variables (--variable-name=value)
abort-slave-event-count 0
@@ -1008,6 +1011,7 @@ transaction-prealloc-size 4096
updatable-views-with-limit YES
verbose TRUE
wait-timeout 28800
+worker-info-repository FILE
To see what values a running MySQL server is using, type
'mysqladmin variables' instead of 'mysqld --verbose --help'.
=== modified file 'mysql-test/suite/rpl/t/rpl_parallel-slave.opt'
--- a/mysql-test/suite/rpl/t/rpl_parallel-slave.opt 2010-12-07 03:05:41 +0000
+++ b/mysql-test/suite/rpl/t/rpl_parallel-slave.opt 2010-12-09 16:17:32 +0000
@@ -1 +1 @@
---relay-log-info-repository=TABLE --slave-parallel-workers=4
+--slave-parallel-workers=4
=== added file 'mysql-test/suite/sys_vars/r/worker_info_repository_basic.result'
--- a/mysql-test/suite/sys_vars/r/worker_info_repository_basic.result 1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/sys_vars/r/worker_info_repository_basic.result 2010-12-09 13:23:19 +0000
@@ -0,0 +1,44 @@
+'#---------------------BS_STVARS_002_01----------------------#'
+SELECT @@GLOBAL.worker_info_repository;
+@@GLOBAL.worker_info_repository
+FILE
+SELECT COUNT(@@GLOBAL.worker_info_repository);
+COUNT(@@GLOBAL.worker_info_repository)
+1
+1 Expected
+SELECT COUNT(@@SESSION.worker_info_repository);
+ERROR HY000: Variable 'worker_info_repository' is a GLOBAL variable
+'#---------------------BS_STVARS_002_02----------------------#'
+SET @@GLOBAL.worker_info_repository= "TABLE";
+ERROR HY000: Variable 'worker_info_repository' is a read only variable
+SELECT @@GLOBAL.worker_info_repository;
+@@GLOBAL.worker_info_repository
+FILE
+'#---------------------BS_STVARS_002_03----------------------#'
+SELECT @@GLOBAL.worker_info_repository = VARIABLE_VALUE
+FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES
+WHERE VARIABLE_NAME='worker_info_repository';
+@@GLOBAL.worker_info_repository = VARIABLE_VALUE
+1
+1 Expected
+SELECT COUNT(@@GLOBAL.worker_info_repository);
+COUNT(@@GLOBAL.worker_info_repository)
+1
+1 Expected
+SELECT COUNT(VARIABLE_VALUE)
+FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES
+WHERE VARIABLE_NAME='worker_info_repository';
+COUNT(VARIABLE_VALUE)
+1
+1 Expected
+'#---------------------BS_STVARS_002_05----------------------#'
+SELECT COUNT(@@worker_info_repository);
+COUNT(@@worker_info_repository)
+1
+1 Expected
+SELECT COUNT(@@local.worker_info_repository);
+ERROR HY000: Variable 'worker_info_repository' is a GLOBAL variable
+SELECT COUNT(@@GLOBAL.worker_info_repository);
+COUNT(@@GLOBAL.worker_info_repository)
+1
+1 Expected
=== added file 'mysql-test/suite/sys_vars/t/worker_info_repository_basic.test'
--- a/mysql-test/suite/sys_vars/t/worker_info_repository_basic.test 1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/sys_vars/t/worker_info_repository_basic.test 2010-12-09 13:23:19 +0000
@@ -0,0 +1,76 @@
+############## mysql-test\t\worker_info_repository_basic.test #################
+# #
+# Variable Name: worker_info_repository #
+# Scope: Global #
+# Access Type: Static #
+# Data Type: enumeration #
+# #
+# #
+# Creation Date: 2010-12-09 #
+# Author : Alfranio Correia #
+# #
+# #
+# Description:Test Cases of System Variable worker_info_repository #
+# that checks the behavior of this variable in the following ways #
+# * Value Check #
+# * Scope Check #
+# #
+# Reference: #
+# http://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html #
+# #
+###############################################################################
+--source include/not_worker_info_table.inc
+
+--echo '#---------------------BS_STVARS_002_01----------------------#'
+####################################################################
+# Displaying default value #
+####################################################################
+SELECT @@GLOBAL.worker_info_repository;
+
+SELECT COUNT(@@GLOBAL.worker_info_repository);
+--echo 1 Expected
+
+--error ER_INCORRECT_GLOBAL_LOCAL_VAR
+SELECT COUNT(@@SESSION.worker_info_repository);
+
+--echo '#---------------------BS_STVARS_002_02----------------------#'
+####################################################################
+# Check if Value can set #
+####################################################################
+--error ER_INCORRECT_GLOBAL_LOCAL_VAR
+SET @@GLOBAL.worker_info_repository= "TABLE";
+
+SELECT @@GLOBAL.worker_info_repository;
+
+
+--echo '#---------------------BS_STVARS_002_03----------------------#'
+#################################################################
+# Check if the value in GLOBAL Table matches value in variable #
+#################################################################
+SELECT @@GLOBAL.worker_info_repository = VARIABLE_VALUE
+FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES
+WHERE VARIABLE_NAME='worker_info_repository';
+--echo 1 Expected
+
+SELECT COUNT(@@GLOBAL.worker_info_repository);
+--echo 1 Expected
+
+SELECT COUNT(VARIABLE_VALUE)
+FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES
+WHERE VARIABLE_NAME='worker_info_repository';
+--echo 1 Expected
+
+
+--echo '#---------------------BS_STVARS_002_05----------------------#'
+################################################################################
+# Check if worker_info_repository can be accessed with and without @@ sign #
+################################################################################
+
+SELECT COUNT(@@worker_info_repository);
+--echo 1 Expected
+
+--error ER_INCORRECT_GLOBAL_LOCAL_VAR
+SELECT COUNT(@@local.worker_info_repository);
+
+SELECT COUNT(@@GLOBAL.worker_info_repository);
+--echo 1 Expected
=== modified file 'sql/rpl_info_dummy.cc'
--- a/sql/rpl_info_dummy.cc 2010-12-07 03:05:41 +0000
+++ b/sql/rpl_info_dummy.cc 2010-12-09 16:17:32 +0000
@@ -16,8 +16,8 @@
#include <my_global.h>
#include "rpl_info_dummy.h"
-Rpl_info_dummy::Rpl_info_dummy()
- :Rpl_info_handler(0)
+Rpl_info_dummy::Rpl_info_dummy(const int nparam)
+ :Rpl_info_handler(nparam)
{
}
@@ -31,6 +31,7 @@ int Rpl_info_dummy::do_prepare_info_for_
__attribute__((unused)))
{
if (abort) DBUG_ASSERT(0);
+ cursor= 0;
return 0;
}
@@ -38,6 +39,7 @@ int Rpl_info_dummy::do_prepare_info_for_
__attribute__((unused)))
{
if (abort) DBUG_ASSERT(0);
+ cursor= 0;
return 0;
}
=== modified file 'sql/rpl_info_dummy.h'
--- a/sql/rpl_info_dummy.h 2010-12-07 03:05:41 +0000
+++ b/sql/rpl_info_dummy.h 2010-12-09 16:17:32 +0000
@@ -30,7 +30,7 @@
class Rpl_info_dummy : public Rpl_info_handler
{
public:
- Rpl_info_dummy();
+ Rpl_info_dummy(const int nparam);
virtual ~Rpl_info_dummy() { };
private:
=== modified file 'sql/rpl_info_factory.cc'
--- a/sql/rpl_info_factory.cc 2010-12-08 01:30:32 +0000
+++ b/sql/rpl_info_factory.cc 2010-12-09 16:17:32 +0000
@@ -24,11 +24,11 @@
*/
#define master_info_engine NULL
#define relay_log_info_engine NULL
+#define worker_info_engine NULL
#define NUMBER_OF_FIELDS_TO_IDENTIFY_COORDINATOR 1
#define NUMBER_OF_FIELDS_TO_IDENTIFY_WORKER 2
-
/**
Creates both a Master info and a Relay log info repository whose types are
defined as parameters.
@@ -139,7 +139,8 @@ Master_info *Rpl_info_factory::create_mi
DBUG_RETURN(mi);
}
- if (Rpl_info_factory::create_info_dummy(mi))
+ if (Rpl_info_factory::create_info_dummy(mi,
+ mi->get_number_info_mi_fields()))
goto err;
DBUG_RETURN(mi);
@@ -239,7 +240,8 @@ Relay_log_info *Rpl_info_factory::create
DBUG_RETURN(rli);
}
- if (Rpl_info_factory::create_info_dummy(rli))
+ if (Rpl_info_factory::create_info_dummy(rli,
+ rli->get_number_info_rli_fields()))
goto err;
DBUG_RETURN(rli);
@@ -414,7 +416,7 @@ bool Rpl_info_factory::change_engine(Rpl
DBUG_RETURN(FALSE);
}
-Slave_worker *Rpl_info_factory::create_worker(uint rli_option, Relay_log_info *rli, uint worker_id)
+Slave_worker *Rpl_info_factory::create_worker(uint worker_option, uint worker_id)
{
DBUG_ENTER("Rpl_info_factory::create_worker");
@@ -444,12 +446,12 @@ Slave_worker *Rpl_info_factory::create_w
key_info_idx[1]= worker_id;
worker->set_idx_info(key_info_idx, NUMBER_OF_FIELDS_TO_IDENTIFY_WORKER);
- DBUG_ASSERT(rli_option == RLI_REPOSITORY_FILE ||
- rli_option == RLI_REPOSITORY_TABLE ||
- rli_option == RLI_REPOSITORY_DUMMY);
+ DBUG_ASSERT(worker_option == WORKER_REPOSITORY_FILE ||
+ worker_option == WORKER_REPOSITORY_TABLE ||
+ worker_option == WORKER_REPOSITORY_DUMMY);
- if (rli_option == RLI_REPOSITORY_FILE ||
- rli_option == RLI_REPOSITORY_TABLE)
+ if (worker_option == WORKER_REPOSITORY_FILE ||
+ worker_option == WORKER_REPOSITORY_TABLE)
{
/*
Now we instantiate all info repos and later decide which one to take,
@@ -470,18 +472,19 @@ Slave_worker *Rpl_info_factory::create_w
only TABLES as repositories. /Alfranio
*/
if (decide_repository(worker, &w_table, &w_file,
- rli_option == MI_REPOSITORY_TABLE, &msg))
+ worker_option == MI_REPOSITORY_TABLE, &msg))
goto err;
- if ((rli_option == RLI_REPOSITORY_TABLE) &&
+ if ((worker_option == WORKER_REPOSITORY_TABLE) &&
change_engine(static_cast<Rpl_info_table *>(w_table),
- relay_log_info_engine, &msg))
+ worker_info_engine, &msg))
goto err;
DBUG_RETURN(worker);
}
- if (Rpl_info_factory::create_info_dummy(rli))
+ if (Rpl_info_factory::create_info_dummy(worker,
+ worker->get_number_worker_fields()))
goto err;
DBUG_RETURN(worker);
@@ -507,13 +510,13 @@ err:
DBUG_RETURN(NULL);
}
-bool Rpl_info_factory::create_info_dummy(Rpl_info *rpl)
+bool Rpl_info_factory::create_info_dummy(Rpl_info *rpl, uint nfields)
{
DBUG_ENTER("Rpl_info_factory::create_info_dummy");
Rpl_info_dummy* rpl_dummy= NULL;
- if (!(rpl_dummy= new Rpl_info_dummy()))
+ if (!(rpl_dummy= new Rpl_info_dummy(nfields)))
DBUG_RETURN(TRUE);
rpl->set_rpl_info_handler(rpl_dummy);
=== modified file 'sql/rpl_info_factory.h'
--- a/sql/rpl_info_factory.h 2010-11-30 02:08:01 +0000
+++ b/sql/rpl_info_factory.h 2010-12-09 16:17:32 +0000
@@ -41,6 +41,14 @@ enum enum_rli_repository
};
extern ulong opt_rli_repository_id;
+enum enum_worker_repository
+{
+ WORKER_REPOSITORY_FILE= 0,
+ WORKER_REPOSITORY_TABLE= 1,
+ WORKER_REPOSITORY_DUMMY= 2
+};
+extern ulong opt_worker_repository_id;
+
#define MI_SCHEMA "mysql"
#define MI_TABLE "slave_master_info"
@@ -56,8 +64,7 @@ class Rpl_info_factory
static bool create_coordinators(uint mi_option, Master_info **mi,
uint rli_option, Relay_log_info **rli);
- static Slave_worker *create_worker(uint rli_option, Relay_log_info *rli,
- uint worker_id);
+ static Slave_worker *create_worker(uint rli_option, uint worker_id);
static Master_info *create_mi(uint rli_option);
static Relay_log_info *create_rli(uint rli_option, bool is_slave_recovery);
static bool decide_repository(Rpl_info *info,
@@ -66,6 +73,6 @@ class Rpl_info_factory
const char **msg);
static bool change_engine(Rpl_info_table *table, const char *engine,
const char **msg);
- static bool create_info_dummy(Rpl_info *rpl);
+ static bool create_info_dummy(Rpl_info *rpl, uint nfields);
};
#endif
=== modified file 'sql/rpl_rli_pdb.h'
--- a/sql/rpl_rli_pdb.h 2010-12-09 17:45:02 +0000
+++ b/sql/rpl_rli_pdb.h 2010-12-09 17:46:27 +0000
@@ -121,33 +121,7 @@ typedef struct st_slave_job_group
char* checkpoint_log_name;
} Slave_job_group;
-#define copy_job(from, to) \
- do \
- { \
- to.group_master_log_pos= from.group_master_log_pos; \
- to.group_relay_log_pos= from.group_relay_log_pos; \
- to.group_relay_log_name= from.group_relay_log_name; \
- to.group_master_log_name= from.group_master_log_name; \
- to.db_ids= from.db_ids; \
- to.worker_id= from.worker_id; \
- } while (0)
-
-#define exchange_jobs(j1, j2) \
- do \
- { \
- Slave_job_group tmp; \
- copy_job(j2, tmp); \
- copy_job(j1, j2); \
- copy_job(tmp, j1); \
- } while (0)
-
-#define greater_jobs(j1, j2) \
- (j1.group_relay_log_pos > j2.group_relay_log_pos)
-
-#define lower_jobs(j1, j2) \
- (j1.group_relay_log_pos < j2.group_relay_log_pos)
-
-#define init_job(from, to) \
+#define get_job(from, to) \
do \
{ \
to.worker_id= from->id; \
@@ -168,19 +142,21 @@ typedef struct st_slave_job_group
to.db_ids= from->curr_group_exec_parts; \
} while (0)
-#define debug_jobs(jobs, size) \
+#define debug_jobs(jobs) \
do \
{ \
- for (uint pos= 0; pos < size; pos++) \
+ Slave_job_group job; \
+ for (uint pos= 0; pos < jobs.elements; pos++) \
{ \
+ get_dynamic(&jobs, (uchar *) &job, pos); \
fprintf(stderr, "DEBUGGING Worker-Id %lu, " \
"group_relay_log_name %s, group_relay_log_pos %lu, " \
"group_master_log_name %s, group_master_lo_pos %lu\n", \
- jobs[pos].worker_id, \
- jobs[pos].group_relay_log_name, \
- (ulong) jobs[pos].group_relay_log_pos, \
- jobs[pos].group_master_log_name, \
- (ulong) jobs[pos].group_master_log_pos); \
+ job.worker_id, \
+ job.group_relay_log_name, \
+ (ulong) job.group_relay_log_pos, \
+ job.group_master_log_name, \
+ (ulong) job.group_master_log_pos); \
} \
} while (0)
=== modified file 'sql/rpl_slave.cc'
--- a/sql/rpl_slave.cc 2010-12-09 17:45:02 +0000
+++ b/sql/rpl_slave.cc 2010-12-09 17:46:27 +0000
@@ -3796,67 +3796,40 @@ err:
DBUG_RETURN(0);
}
-int mts_recovery_partition(Slave_job_group *jobs, int p /* pos_ini */, int r /* pos_end */)
+int mts_jobs_cmp(Slave_job_group *id1, Slave_job_group *id2)
{
- Slave_job_group x;
-
- copy_job(jobs[p], x);
-
- int i= p - 1;
- int j= r + 1;
-
- for (;;)
- {
- do
- {
- j= j - 1;
- }
- while (greater_jobs(jobs[j], x));
-
- do
- {
- i= i + 1;
- }
- while (lower_jobs(jobs[i], x));
-
- if (i < j)
- exchange_jobs(jobs[i], jobs[j]);
- else
- return j;
- }
+ return id1->group_relay_log_pos < id2->group_relay_log_pos ? -1 :
+ (id1->group_relay_log_pos > id2->group_relay_log_pos ? 1 : 0);
}
-void mts_recovery_quicksort(Slave_job_group *jobs, int p /* pos_ini */, int r /* pos_end */)
-{
- if (p < r)
- {
- int q= mts_recovery_partition(jobs, p, r);
- mts_recovery_quicksort(jobs, p, q);
- mts_recovery_quicksort(jobs, q + 1, r);
- }
-}
bool mts_recovery_routine(Relay_log_info *rli)
{
- DBUG_ENTER("mts_recovery_routine");
+ DYNAMIC_ARRAY jobs;
+ Slave_job_group job;
+ DBUG_ENTER("mts_recovery_routine");
DBUG_ASSERT(rli->workers.elements > 0);
- Slave_job_group *jobs= new Slave_job_group[rli->workers.elements];
- for (uint i= 0; i < rli->workers.elements; i++)
+ my_init_dynamic_array(&jobs, sizeof(Slave_job_group),
+ rli->workers.elements, rli->workers.elements);
+
+ for (uint pos= 0; pos < rli->workers.elements; pos++)
{
- Slave_worker *w_i;
- get_dynamic(&rli->workers, (uchar *) &w_i, i);
- init_job(w_i, jobs[i]);
+ Slave_worker *worker;
+ get_dynamic(&rli->workers, (uchar *) &worker, pos);
+ get_job(worker, job);
+ insert_dynamic(&jobs, (uchar*) &job);
}
-
- mts_recovery_quicksort(jobs, 0, rli->workers.elements - 1);
-
- debug_jobs(jobs, rli->workers.elements);
+ sort_dynamic(&jobs, (qsort_cmp) change_master_server_id_cmp);
+
+ DBUG_ASSERT(rli->workers.elements == jobs.elements);
+ debug_jobs(jobs);
// TODO -- ALFRANIO CORE OF RECOVERY
- delete []jobs;
+ delete_dynamic(&jobs);
+
DBUG_RETURN(rli->flush_info(TRUE));
}
@@ -3953,7 +3926,7 @@ int slave_start_single_worker(Relay_log_
uint k;
pthread_t th;
Slave_worker *w=
- Rpl_info_factory::create_worker(opt_rli_repository_id, rli, i);
+ Rpl_info_factory::create_worker(opt_worker_repository_id, i);
Slave_job_item empty= {NULL};
w->c_rli= rli;
@@ -3963,7 +3936,7 @@ int slave_start_single_worker(Relay_log_
// fixme: experimenting to make Workers to run ev->update_pos(w->w_rli)
// fixme: a real hack! part of Rpl_info_factory::create_rli(RLI_REPOSITORY_FILE, FALSE);
w->w_rli= new Relay_log_info(FALSE);
- Rpl_info_dummy *dummy_handler= new Rpl_info_dummy();
+ Rpl_info_dummy *dummy_handler= new Rpl_info_dummy(rli->get_number_info_rli_fields());
w->w_rli->set_rpl_info_handler(dummy_handler);
w->init_info();
=== modified file 'sql/sys_vars.cc'
--- a/sql/sys_vars.cc 2010-12-08 00:33:48 +0000
+++ b/sql/sys_vars.cc 2010-12-09 13:23:19 +0000
@@ -416,7 +416,11 @@ static Sys_var_mybool Sys_binlog_direct(
static const char *repository_names[]=
{
- "FILE", "TABLE", 0
+ "FILE", "TABLE",
+#ifndef DBUG_OFF
+ "DUMMY",
+#endif
+ 0
};
ulong opt_mi_repository_id;
@@ -433,6 +437,13 @@ static Sys_var_enum Sys_rli_repository(
, READ_ONLY GLOBAL_VAR(opt_rli_repository_id), CMD_LINE(REQUIRED_ARG),
repository_names, DEFAULT(0));
+ulong opt_worker_repository_id;
+static Sys_var_enum Sys_worker_repository(
+ "worker_info_repository",
+ "Defines the type of the repository for the worker information."
+ , READ_ONLY GLOBAL_VAR(opt_worker_repository_id), CMD_LINE(REQUIRED_ARG),
+ repository_names, DEFAULT(0));
+
static Sys_var_mybool Sys_binlog_rows_query(
"binlog_rows_query_log_events",
"Allow writing of Rows_query_log events into binary log.",
Attachment: [text/bzr-bundle] bzr/andrei.elkin@oracle.com-20101209174627-x1mo1d7paldg00pu.bundle
| Thread |
|---|
| • bzr commit into mysql-next-mr-wl5569 branch (andrei.elkin:3238) | Andrei Elkin | 9 Dec |