Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
M
MariaDB
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
nexedi
MariaDB
Commits
9d59dfb5
Commit
9d59dfb5
authored
Oct 29, 2009
by
He Zhenxing
Browse files
Options
Browse Files
Download
Plain Diff
Auto merge from 5.1-rep+2
parents
ea9efb5b
ea84da10
Changes
16
Hide whitespace changes
Inline
Side-by-side
Showing
16 changed files
with
279 additions
and
65 deletions
+279
-65
CMakeLists.txt
CMakeLists.txt
+4
-0
mysql-test/include/have_semisync_plugin.inc
mysql-test/include/have_semisync_plugin.inc
+7
-0
mysql-test/include/wait_show_condition.inc
mysql-test/include/wait_show_condition.inc
+53
-21
mysql-test/mysql-test-run.pl
mysql-test/mysql-test-run.pl
+33
-19
mysql-test/suite/rpl/r/rpl_mixed_ddl_dml.result
mysql-test/suite/rpl/r/rpl_mixed_ddl_dml.result
+2
-2
mysql-test/suite/rpl/r/rpl_semi_sync.result
mysql-test/suite/rpl/r/rpl_semi_sync.result
+2
-2
mysql-test/suite/rpl/r/rpl_show_slave_hosts.result
mysql-test/suite/rpl/r/rpl_show_slave_hosts.result
+17
-0
mysql-test/suite/rpl/t/rpl_semi_sync.test
mysql-test/suite/rpl/t/rpl_semi_sync.test
+6
-5
mysql-test/suite/rpl/t/rpl_show_slave_hosts.cnf
mysql-test/suite/rpl/t/rpl_show_slave_hosts.cnf
+20
-0
mysql-test/suite/rpl/t/rpl_show_slave_hosts.test
mysql-test/suite/rpl/t/rpl_show_slave_hosts.test
+47
-0
plugin/semisync/CMakeLists.txt
plugin/semisync/CMakeLists.txt
+35
-0
plugin/semisync/Makefile.am
plugin/semisync/Makefile.am
+2
-0
plugin/semisync/semisync_master.cc
plugin/semisync/semisync_master.cc
+18
-0
plugin/semisync/semisync_master_plugin.cc
plugin/semisync/semisync_master_plugin.cc
+3
-2
sql/repl_failsafe.cc
sql/repl_failsafe.cc
+2
-6
sql/slave.cc
sql/slave.cc
+28
-8
No files found.
CMakeLists.txt
View file @
9d59dfb5
...
@@ -276,6 +276,10 @@ FOREACH(DIR ${DYNAMIC_ENGINE_DIRECTORIES})
...
@@ -276,6 +276,10 @@ FOREACH(DIR ${DYNAMIC_ENGINE_DIRECTORIES})
ADD_SUBDIRECTORY
(
${
DIR
}
)
ADD_SUBDIRECTORY
(
${
DIR
}
)
ENDFOREACH
(
DIR
${
DYNAMIC_ENGINE_DIRECTORIES
}
)
ENDFOREACH
(
DIR
${
DYNAMIC_ENGINE_DIRECTORIES
}
)
# Add subdirectories for semisync plugin
IF
(
NOT WITHOUT_DYNAMIC_PLUGINS
)
ADD_SUBDIRECTORY
(
plugin/semisync
)
ENDIF
(
NOT WITHOUT_DYNAMIC_PLUGINS
)
# FIXME "debug" only needed if build type is "Debug", but
# FIXME "debug" only needed if build type is "Debug", but
# CMAKE_BUILD_TYPE is not set during configure time.
# CMAKE_BUILD_TYPE is not set during configure time.
...
...
mysql-test/include/have_semisync_plugin.inc
View file @
9d59dfb5
...
@@ -12,3 +12,10 @@ if (`select LENGTH('$SEMISYNC_MASTER_PLUGIN') = 0`)
...
@@ -12,3 +12,10 @@ if (`select LENGTH('$SEMISYNC_MASTER_PLUGIN') = 0`)
{
{
skip
Need
semisync
plugins
;
skip
Need
semisync
plugins
;
}
}
#
# Check if --plugin-dir was setup for semisync
#
if
(
`SELECT CONCAT('--plugin-dir=', @@plugin_dir) != '$SEMISYNC_PLUGIN_OPT'`
)
{
--
skip
SEMISYNC
plugin
requires
that
--
plugin
-
dir
is
set
to
the
semisync
plugin
dir
(
either
the
.
opt
file
does
not
contain
\
$SEMISYNC_PLUGIN_OPT
or
another
plugin
is
in
use
)
}
mysql-test/include/wait_show_condition.inc
View file @
9d59dfb5
...
@@ -2,13 +2,16 @@
...
@@ -2,13 +2,16 @@
#
#
# SUMMARY
# SUMMARY
#
#
# Waits until the show statement ($show_statement) has
at least within one of
# Waits until the show statement ($show_statement) has
one or all of the
#
the
rows of the result set for the field ($field) a value which fulfils
# rows of the result set for the field ($field) a value which fulfils
# a condition ($condition), or the operation times out.
# a condition ($condition), or the operation times out.
#
#
#
#
# USAGE
# USAGE
#
#
# All rows of the result must fulfil the condition if $all_rows_fulfil is 1
# else at least one of the result must fulfil the condition.
# let $wait_for_all= 1;
# let $show_statement= SHOW PROCESSLIST;
# let $show_statement= SHOW PROCESSLIST;
# let $field= State;
# let $field= State;
# let $condition= = 'Updating';
# let $condition= = 'Updating';
...
@@ -46,27 +49,56 @@ inc $max_run_time;
...
@@ -46,27 +49,56 @@ inc $max_run_time;
let
$found
=
0
;
let
$found
=
0
;
let
$max_end_time
=
`SELECT UNIX_TIMESTAMP() + $max_run_time`
;
let
$max_end_time
=
`SELECT UNIX_TIMESTAMP() + $max_run_time`
;
while
(
`SELECT UNIX_TIMESTAMP() <= $max_end_time AND $found = 0`
)
if
(
`SELECT '$wait_for_all' != '1'`
)
{
{
# Sleep a bit to avoid too heavy load.
while
(
`SELECT UNIX_TIMESTAMP() <= $max_end_time AND $found = 0`
)
real_sleep
0.2
;
{
let
$rowno
=
1
;
# Sleep a bit to avoid too heavy load.
let
$process_result
=
1
;
real_sleep
0.2
;
while
(
`SELECT $process_result = 1 AND $found = 0`
)
let
$rowno
=
1
;
{
let
$process_result
=
1
;
let
$field_value
=
query_get_value
(
$show_statement
,
$field
,
$rowno
);
while
(
`SELECT $process_result = 1 AND $found = 0`
)
if
(
`SELECT '$field_value' $condition`
)
{
{
let
$field_value
=
query_get_value
(
$show_statement
,
$field
,
$rowno
);
let
$found
=
1
;
if
(
`SELECT '$field_value' $condition`
)
}
{
if
(
`SELECT '$field_value' = 'No such row'`
)
let
$found
=
1
;
{
}
# We are behind the last row of the result set.
if
(
`SELECT '$field_value' = 'No such row'`
)
let
$process_result
=
0
;
{
}
# We are behind the last row of the result set.
inc
$rowno
;
let
$process_result
=
0
;
}
}
inc
$rowno
;
}
}
}
}
if
(
`SELECT '$wait_for_all' = '1'`
)
{
while
(
`SELECT UNIX_TIMESTAMP() <= $max_end_time AND $found = 0`
)
{
# Sleep a bit to avoid too heavy load.
real_sleep
0.2
;
let
$rowno
=
1
;
let
$process_result
=
1
;
while
(
`SELECT $process_result = 1 AND $found = 0`
)
{
let
$field_value
=
query_get_value
(
$show_statement
,
$field
,
$rowno
);
if
(
`SELECT '$field_value' = 'No such row'`
)
{
let
$found
=
1
;
}
if
(
`SELECT $found = 0 AND NOT '$field_value' $condition`
)
{
let
process_result
=
0
;
}
inc
$rowno
;
}
}
}
if
(
!
$found
)
if
(
!
$found
)
{
{
echo
# Timeout in include/wait_show_condition.inc for $wait_condition;
echo
# Timeout in include/wait_show_condition.inc for $wait_condition;
...
...
mysql-test/mysql-test-run.pl
View file @
9d59dfb5
...
@@ -1818,25 +1818,39 @@ sub environment_setup {
...
@@ -1818,25 +1818,39 @@ sub environment_setup {
# --------------------------------------------------------------------------
# --------------------------------------------------------------------------
# Add the path where mysqld will find semisync plugins
# Add the path where mysqld will find semisync plugins
# --------------------------------------------------------------------------
# --------------------------------------------------------------------------
my
$lib_semisync_master_plugin
=
if
(
!
$opt_embedded_server
)
{
mtr_file_exists
(
vs_config_dirs
('
plugin/semisync
',"
libsemisync_master.so
"),
my
$semisync_master_filename
;
"
$basedir
/plugin/semisync/.libs/libsemisync_master.so
",
my
$semisync_slave_filename
;
"
$basedir
/lib/mysql/plugin/libsemisync_master.so
");
if
(
IS_WINDOWS
)
my
$lib_semisync_slave_plugin
=
{
mtr_file_exists
(
vs_config_dirs
('
plugin/semisync
',"
libsemisync_slave.so
"),
$semisync_master_filename
=
"
semisync_master.dll
";
"
$basedir
/plugin/semisync/.libs/libsemisync_slave.so
",
$semisync_slave_filename
=
"
semisync_slave.dll
";
"
$basedir
/lib/mysql/plugin/libsemisync_slave.so
");
}
if
(
$lib_semisync_master_plugin
&&
$lib_semisync_slave_plugin
)
else
{
{
$ENV
{'
SEMISYNC_MASTER_PLUGIN
'}
=
basename
(
$lib_semisync_master_plugin
);
$semisync_master_filename
=
"
libsemisync_master.so
";
$ENV
{'
SEMISYNC_SLAVE_PLUGIN
'}
=
basename
(
$lib_semisync_slave_plugin
);
$semisync_slave_filename
=
"
libsemisync_slave.so
";
$ENV
{'
SEMISYNC_PLUGIN_OPT
'}
=
"
--plugin-dir=
"
.
dirname
(
$lib_semisync_master_plugin
);
}
}
my
$lib_semisync_master_plugin
=
else
mtr_file_exists
(
vs_config_dirs
('
plugin/semisync
',
$semisync_master_filename
),
{
"
$basedir
/plugin/semisync/.libs/
"
.
$semisync_master_filename
,
$ENV
{'
SEMISYNC_MASTER_PLUGIN
'}
=
"";
"
$basedir
/lib/mysql/plugin/
"
.
$semisync_master_filename
);
$ENV
{'
SEMISYNC_SLAVE_PLUGIN
'}
=
"";
my
$lib_semisync_slave_plugin
=
$ENV
{'
SEMISYNC_PLUGIN_OPT
'}
=
"
--plugin-dir=
";
mtr_file_exists
(
vs_config_dirs
('
plugin/semisync
',
$semisync_slave_filename
),
"
$basedir
/plugin/semisync/.libs/
"
.
$semisync_slave_filename
,
"
$basedir
/lib/mysql/plugin/
"
.
$semisync_slave_filename
);
if
(
$lib_semisync_master_plugin
&&
$lib_semisync_slave_plugin
)
{
$ENV
{'
SEMISYNC_MASTER_PLUGIN
'}
=
basename
(
$lib_semisync_master_plugin
);
$ENV
{'
SEMISYNC_SLAVE_PLUGIN
'}
=
basename
(
$lib_semisync_slave_plugin
);
$ENV
{'
SEMISYNC_PLUGIN_OPT
'}
=
"
--plugin-dir=
"
.
dirname
(
$lib_semisync_master_plugin
);
}
else
{
$ENV
{'
SEMISYNC_MASTER_PLUGIN
'}
=
"";
$ENV
{'
SEMISYNC_SLAVE_PLUGIN
'}
=
"";
$ENV
{'
SEMISYNC_PLUGIN_OPT
'}
=
"
--plugin-dir=
";
}
}
}
# ----------------------------------------------------
# ----------------------------------------------------
...
...
mysql-test/suite/rpl/r/rpl_mixed_ddl_dml.result
View file @
9d59dfb5
...
@@ -13,8 +13,8 @@ n
...
@@ -13,8 +13,8 @@ n
2001
2001
2002
2002
show slave hosts;
show slave hosts;
Server_id Host Port
Rpl_recovery_rank
Master_id
Server_id Host Port Master_id
2 127.0.0.1 9999
0
1
2 127.0.0.1 9999 1
drop table t1;
drop table t1;
stop slave;
stop slave;
create table t2(id int auto_increment primary key, created datetime);
create table t2(id int auto_increment primary key, created datetime);
...
...
mysql-test/suite/rpl/r/rpl_semi_sync.result
View file @
9d59dfb5
...
@@ -397,7 +397,7 @@ Rpl_semi_sync_slave_status OFF
...
@@ -397,7 +397,7 @@ Rpl_semi_sync_slave_status OFF
# Test non-semi-sync slave connect to semi-sync master
# Test non-semi-sync slave connect to semi-sync master
#
#
set sql_log_bin=0;
set sql_log_bin=0;
INSTALL PLUGIN rpl_semi_sync_master SONAME '
libsemisync_master.so
';
INSTALL PLUGIN rpl_semi_sync_master SONAME '
SEMISYNC_MASTER_PLUGIN
';
set global rpl_semi_sync_master_timeout= 5000;
set global rpl_semi_sync_master_timeout= 5000;
/* 5s */
/* 5s */
set sql_log_bin=1;
set sql_log_bin=1;
...
@@ -416,7 +416,7 @@ SHOW STATUS LIKE 'Rpl_semi_sync_slave_status';
...
@@ -416,7 +416,7 @@ SHOW STATUS LIKE 'Rpl_semi_sync_slave_status';
Variable_name Value
Variable_name Value
include/stop_slave.inc
include/stop_slave.inc
[ reinstall semi-sync slave plugin and disable semi-sync ]
[ reinstall semi-sync slave plugin and disable semi-sync ]
INSTALL PLUGIN rpl_semi_sync_slave SONAME '
libsemisync_slave.so
';
INSTALL PLUGIN rpl_semi_sync_slave SONAME '
SEMISYNC_SLAVE_PLUGIN
';
set global rpl_semi_sync_slave_enabled= 0;
set global rpl_semi_sync_slave_enabled= 0;
SHOW VARIABLES LIKE 'rpl_semi_sync_slave_enabled';
SHOW VARIABLES LIKE 'rpl_semi_sync_slave_enabled';
Variable_name Value
Variable_name Value
...
...
mysql-test/suite/rpl/r/rpl_show_slave_hosts.result
0 → 100644
View file @
9d59dfb5
stop slave;
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
reset master;
reset slave;
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
start slave;
RESET SLAVE;
CHANGE MASTER TO master_host='127.0.0.1',master_port=MASTER_PORT,master_user='root';
START SLAVE IO_THREAD;
SHOW SLAVE HOSTS;
Server_id Host Port Master_id
3 slave2 DEFAULT_PORT 1
2 SLAVE_PORT 1
STOP SLAVE IO_THREAD;
SHOW SLAVE HOSTS;
Server_id Host Port Master_id
2 SLAVE_PORT 1
mysql-test/suite/rpl/t/rpl_semi_sync.test
View file @
9d59dfb5
source
include
/
have_semisync_plugin
.
inc
;
source
include
/
have_semisync_plugin
.
inc
;
source
include
/
not_embedded
.
inc
;
source
include
/
not_embedded
.
inc
;
source
include
/
not_windows
.
inc
;
source
include
/
have_innodb
.
inc
;
source
include
/
have_innodb
.
inc
;
source
include
/
master
-
slave
.
inc
;
source
include
/
master
-
slave
.
inc
;
...
@@ -61,7 +60,7 @@ let $value = query_get_value(show variables like 'rpl_semi_sync_master_enabled',
...
@@ -61,7 +60,7 @@ let $value = query_get_value(show variables like 'rpl_semi_sync_master_enabled',
if
(
`select '$value' = 'No such row'`
)
if
(
`select '$value' = 'No such row'`
)
{
{
set
sql_log_bin
=
0
;
set
sql_log_bin
=
0
;
INSTALL
PLUGIN
rpl_semi_sync_master
SONAME
'libsemisync_master.so
'
;
eval
INSTALL
PLUGIN
rpl_semi_sync_master
SONAME
'$SEMISYNC_MASTER_PLUGIN
'
;
set
global
rpl_semi_sync_master_timeout
=
5000
;
/* 5s */
set
global
rpl_semi_sync_master_timeout
=
5000
;
/* 5s */
set
sql_log_bin
=
1
;
set
sql_log_bin
=
1
;
}
}
...
@@ -126,7 +125,7 @@ let $value= query_get_value(show variables like 'rpl_semi_sync_slave_enabled', V
...
@@ -126,7 +125,7 @@ let $value= query_get_value(show variables like 'rpl_semi_sync_slave_enabled', V
if
(
`select '$value' = 'No such row'`
)
if
(
`select '$value' = 'No such row'`
)
{
{
set
sql_log_bin
=
0
;
set
sql_log_bin
=
0
;
INSTALL
PLUGIN
rpl_semi_sync_slave
SONAME
'libsemisync_slave.so
'
;
eval
INSTALL
PLUGIN
rpl_semi_sync_slave
SONAME
'$SEMISYNC_SLAVE_PLUGIN
'
;
set
sql_log_bin
=
1
;
set
sql_log_bin
=
1
;
}
}
enable_query_log
;
enable_query_log
;
...
@@ -536,7 +535,8 @@ SHOW STATUS LIKE 'Rpl_semi_sync_slave_status';
...
@@ -536,7 +535,8 @@ SHOW STATUS LIKE 'Rpl_semi_sync_slave_status';
connection
master
;
connection
master
;
set
sql_log_bin
=
0
;
set
sql_log_bin
=
0
;
INSTALL
PLUGIN
rpl_semi_sync_master
SONAME
'libsemisync_master.so'
;
replace_result
$SEMISYNC_MASTER_PLUGIN
SEMISYNC_MASTER_PLUGIN
;
eval
INSTALL
PLUGIN
rpl_semi_sync_master
SONAME
'$SEMISYNC_MASTER_PLUGIN'
;
set
global
rpl_semi_sync_master_timeout
=
5000
;
/* 5s */
set
global
rpl_semi_sync_master_timeout
=
5000
;
/* 5s */
set
sql_log_bin
=
1
;
set
sql_log_bin
=
1
;
set
global
rpl_semi_sync_master_enabled
=
1
;
set
global
rpl_semi_sync_master_enabled
=
1
;
...
@@ -554,7 +554,8 @@ SHOW STATUS LIKE 'Rpl_semi_sync_slave_status';
...
@@ -554,7 +554,8 @@ SHOW STATUS LIKE 'Rpl_semi_sync_slave_status';
source
include
/
stop_slave
.
inc
;
source
include
/
stop_slave
.
inc
;
echo
[
reinstall
semi
-
sync
slave
plugin
and
disable
semi
-
sync
];
echo
[
reinstall
semi
-
sync
slave
plugin
and
disable
semi
-
sync
];
INSTALL
PLUGIN
rpl_semi_sync_slave
SONAME
'libsemisync_slave.so'
;
replace_result
$SEMISYNC_SLAVE_PLUGIN
SEMISYNC_SLAVE_PLUGIN
;
eval
INSTALL
PLUGIN
rpl_semi_sync_slave
SONAME
'$SEMISYNC_SLAVE_PLUGIN'
;
set
global
rpl_semi_sync_slave_enabled
=
0
;
set
global
rpl_semi_sync_slave_enabled
=
0
;
SHOW
VARIABLES
LIKE
'rpl_semi_sync_slave_enabled'
;
SHOW
VARIABLES
LIKE
'rpl_semi_sync_slave_enabled'
;
SHOW
STATUS
LIKE
'Rpl_semi_sync_slave_status'
;
SHOW
STATUS
LIKE
'Rpl_semi_sync_slave_status'
;
...
...
mysql-test/suite/rpl/t/rpl_show_slave_hosts.cnf
0 → 100644
View file @
9d59dfb5
!include ../my.cnf
[mysqld.1]
server_id=1
[mysqld.2]
server_id=2
report-host=
report-user=
[mysqld.3]
server_id=3
report-host=slave2
slave-net-timeout=5
[ENV]
SLAVE_MYPORT2= @mysqld.3.port
SLAVE_MYSOCK2= @mysqld.3.socket
mysql-test/suite/rpl/t/rpl_show_slave_hosts.test
0 → 100644
View file @
9d59dfb5
###############################################################################
# Bug#13963 SHOW SLAVE HOSTS is unreliable
#
# Slaves only appear in the output of SHOW SLAVE HOSTS when report-host option
# is set. If an expected slave does not appear in the list, nobody knows
# whether the slave does not connect or has started without the "report-host"
# option.
#
# Remove the "Rpl_recovery_rank" column from SHOW SLAVE HOSTS, It is not
# implemented.
#######################################################################
source
include
/
master
-
slave
.
inc
;
connect
(
slave2
,
127.0
.
0.1
,
root
,,
test
,
$SLAVE_MYPORT2
,);
connection
slave2
;
RESET
SLAVE
;
--
replace_result
$MASTER_MYPORT
MASTER_PORT
--
eval
CHANGE
MASTER
TO
master_host
=
'127.0.0.1'
,
master_port
=
$MASTER_MYPORT
,
master_user
=
'root'
START
SLAVE
IO_THREAD
;
source
include
/
wait_for_slave_io_to_start
.
inc
;
connection
master
;
let
$show_statement
=
SHOW
SLAVE
HOSTS
;
let
$field
=
Server_id
;
# 3 is server_id of slave2.
let
$connection
=
=
'3'
;
source
include
/
wait_show_condition
.
inc
;
--
replace_result
$SLAVE_MYPORT
SLAVE_PORT
$DEFAULT_MASTER_PORT
DEFAULT_PORT
SHOW
SLAVE
HOSTS
;
connection
slave2
;
STOP
SLAVE
IO_THREAD
;
source
include
/
wait_for_slave_io_to_stop
.
inc
;
connection
master
;
let
$show_statement
=
SHOW
SLAVE
HOSTS
;
let
$field
=
Server_id
;
# 3 is server_id of slave2.
let
$condition
=
<>
'3'
;
# All rows of 'SHOW SLAVE HOSTS' are not equal to 3. It mean that master has
# knew the leave of slave2 and has unregistered it.
let
$wait_for_all
=
1
;
source
include
/
wait_show_condition
.
inc
;
--
replace_result
$SLAVE_MYPORT
SLAVE_PORT
SHOW
SLAVE
HOSTS
;
source
include
/
master
-
slave
-
end
.
inc
;
plugin/semisync/CMakeLists.txt
0 → 100644
View file @
9d59dfb5
# Copyright (C) 2006 MySQL AB
#
# 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
# the Free Software Foundation; version 2 of the License.
#
# 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
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
# This is CMakeLists.txt for semi-sync replication plugins
SET
(
CMAKE_CXX_FLAGS_DEBUG
"
${
CMAKE_CXX_FLAGS_DEBUG
}
-DSAFEMALLOC -DSAFE_MUTEX"
)
SET
(
CMAKE_C_FLAGS_DEBUG
"
${
CMAKE_C_FLAGS_DEBUG
}
-DSAFEMALLOC -DSAFE_MUTEX"
)
# Add common include directories
INCLUDE_DIRECTORIES
(
${
CMAKE_SOURCE_DIR
}
/include
${
CMAKE_SOURCE_DIR
}
/zlib
${
CMAKE_SOURCE_DIR
}
/sql
${
CMAKE_SOURCE_DIR
}
/regex
${
CMAKE_SOURCE_DIR
}
/extra/yassl/include
)
SET
(
SEMISYNC_MASTER_SOURCES semisync.cc semisync_master.cc semisync_master_plugin.cc
)
SET
(
SEMISYNC_SLAVE_SOURCES semisync.cc semisync_slave.cc semisync_slave_plugin.cc
)
ADD_DEFINITIONS
(
-DMYSQL_DYNAMIC_PLUGIN
)
ADD_LIBRARY
(
semisync_master SHARED
${
SEMISYNC_MASTER_SOURCES
}
)
TARGET_LINK_LIBRARIES
(
semisync_master mysqld
)
ADD_LIBRARY
(
semisync_slave SHARED
${
SEMISYNC_SLAVE_SOURCES
}
)
TARGET_LINK_LIBRARIES
(
semisync_slave mysqld
)
MESSAGE
(
"build SEMISYNC as DLL"
)
plugin/semisync/Makefile.am
View file @
9d59dfb5
...
@@ -34,3 +34,5 @@ libsemisync_slave_la_LDFLAGS = -module
...
@@ -34,3 +34,5 @@ libsemisync_slave_la_LDFLAGS = -module
libsemisync_slave_la_CXXFLAGS
=
$(AM_CFLAGS)
-DMYSQL_DYNAMIC_PLUGIN
libsemisync_slave_la_CXXFLAGS
=
$(AM_CFLAGS)
-DMYSQL_DYNAMIC_PLUGIN
libsemisync_slave_la_CFLAGS
=
$(AM_CFLAGS)
-DMYSQL_DYNAMIC_PLUGIN
libsemisync_slave_la_CFLAGS
=
$(AM_CFLAGS)
-DMYSQL_DYNAMIC_PLUGIN
libsemisync_slave_la_SOURCES
=
semisync.cc semisync_slave.cc semisync_slave_plugin.cc
libsemisync_slave_la_SOURCES
=
semisync.cc semisync_slave.cc semisync_slave_plugin.cc
EXTRA_DIST
=
CMakeLists.txt plug.in
plugin/semisync/semisync_master.cc
View file @
9d59dfb5
...
@@ -45,6 +45,18 @@ char rpl_semi_sync_master_wait_no_slave = 1;
...
@@ -45,6 +45,18 @@ char rpl_semi_sync_master_wait_no_slave = 1;
static
int
getWaitTime
(
const
struct
timeval
&
start_tv
);
static
int
getWaitTime
(
const
struct
timeval
&
start_tv
);
#ifdef __WIN__
static
int
gettimeofday
(
struct
timeval
*
tv
,
void
*
tz
)
{
unsigned
int
ticks
;
ticks
=
GetTickCount
();
tv
->
tv_usec
=
ticks
*
1000
;
tv
->
tv_sec
=
ticks
/
1000
;
return
0
;
}
#endif
/* __WIN__ */
/*******************************************************************************
/*******************************************************************************
*
*
* <ActiveTranx> class : manage all active transaction nodes
* <ActiveTranx> class : manage all active transaction nodes
...
@@ -728,6 +740,11 @@ int ReplSemiSyncMaster::commitTrx(const char* trx_wait_binlog_name,
...
@@ -728,6 +740,11 @@ int ReplSemiSyncMaster::commitTrx(const char* trx_wait_binlog_name,
int
diff_usecs
=
start_tv
.
tv_usec
+
wait_timeout_
*
TIME_THOUSAND
;
int
diff_usecs
=
start_tv
.
tv_usec
+
wait_timeout_
*
TIME_THOUSAND
;
/* Calcuate the waiting period. */
/* Calcuate the waiting period. */
#ifdef __WIN__
abstime
.
tv
.
i64
=
(
__int64
)
start_tv
.
tv_sec
*
TIME_MILLION
*
10
;
abstime
.
tv
.
i64
+=
(
__int64
)
diff_usecs
*
10
;
abstime
.
max_timeout_msec
=
(
long
)
wait_timeout_
;
#else
abstime
.
tv_sec
=
start_tv
.
tv_sec
;
abstime
.
tv_sec
=
start_tv
.
tv_sec
;
if
(
diff_usecs
<
TIME_MILLION
)
if
(
diff_usecs
<
TIME_MILLION
)
{
{
...
@@ -742,6 +759,7 @@ int ReplSemiSyncMaster::commitTrx(const char* trx_wait_binlog_name,
...
@@ -742,6 +759,7 @@ int ReplSemiSyncMaster::commitTrx(const char* trx_wait_binlog_name,
}
}
abstime
.
tv_nsec
=
diff_usecs
*
TIME_THOUSAND
;
abstime
.
tv_nsec
=
diff_usecs
*
TIME_THOUSAND
;
}
}
#endif
/* __WIN__ */
/* In semi-synchronous replication, we wait until the binlog-dump
/* In semi-synchronous replication, we wait until the binlog-dump
* thread has received the reply on the relevant binlog segment from the
* thread has received the reply on the relevant binlog segment from the
...
...
plugin/semisync/semisync_master_plugin.cc
View file @
9d59dfb5
...
@@ -278,6 +278,7 @@ Binlog_transmit_observer transmit_observer = {
...
@@ -278,6 +278,7 @@ Binlog_transmit_observer transmit_observer = {
DEF_SHOW_FUNC
(
status
,
SHOW_BOOL
)
DEF_SHOW_FUNC
(
status
,
SHOW_BOOL
)
DEF_SHOW_FUNC
(
clients
,
SHOW_LONG
)
DEF_SHOW_FUNC
(
clients
,
SHOW_LONG
)
DEF_SHOW_FUNC
(
wait_sessions
,
SHOW_LONG
)
DEF_SHOW_FUNC
(
trx_wait_time
,
SHOW_LONGLONG
)
DEF_SHOW_FUNC
(
trx_wait_time
,
SHOW_LONGLONG
)
DEF_SHOW_FUNC
(
trx_wait_num
,
SHOW_LONGLONG
)
DEF_SHOW_FUNC
(
trx_wait_num
,
SHOW_LONGLONG
)
DEF_SHOW_FUNC
(
net_wait_time
,
SHOW_LONGLONG
)
DEF_SHOW_FUNC
(
net_wait_time
,
SHOW_LONGLONG
)
...
@@ -301,8 +302,8 @@ static SHOW_VAR semi_sync_master_status_vars[]= {
...
@@ -301,8 +302,8 @@ static SHOW_VAR semi_sync_master_status_vars[]= {
(
char
*
)
&
rpl_semi_sync_master_no_transactions
,
(
char
*
)
&
rpl_semi_sync_master_no_transactions
,
SHOW_LONG
},
SHOW_LONG
},
{
"Rpl_semi_sync_master_wait_sessions"
,
{
"Rpl_semi_sync_master_wait_sessions"
,
(
char
*
)
&
rpl_semi_sync_master_wait_sessions
,
(
char
*
)
&
SHOW_FNAME
(
wait_sessions
)
,
SHOW_
LONG
},
SHOW_
FUNC
},
{
"Rpl_semi_sync_master_no_times"
,
{
"Rpl_semi_sync_master_no_times"
,
(
char
*
)
&
rpl_semi_sync_master_off_times
,
(
char
*
)
&
rpl_semi_sync_master_off_times
,
SHOW_LONG
},
SHOW_LONG
},
...
...
sql/repl_failsafe.cc
View file @
9d59dfb5
...
@@ -183,12 +183,11 @@ int register_slave(THD* thd, uchar* packet, uint packet_length)
...
@@ -183,12 +183,11 @@ int register_slave(THD* thd, uchar* packet, uint packet_length)
get_object
(
p
,
si
->
host
,
"Failed to register slave: too long 'report-host'"
);
get_object
(
p
,
si
->
host
,
"Failed to register slave: too long 'report-host'"
);
get_object
(
p
,
si
->
user
,
"Failed to register slave: too long 'report-user'"
);
get_object
(
p
,
si
->
user
,
"Failed to register slave: too long 'report-user'"
);
get_object
(
p
,
si
->
password
,
"Failed to register slave; too long 'report-password'"
);
get_object
(
p
,
si
->
password
,
"Failed to register slave; too long 'report-password'"
);
if
(
p
+
10
>
p_end
)
/*6 is the total length of port and master_id*/
if
(
p
+
6
!=
p_end
)
goto
err
;
goto
err
;
si
->
port
=
uint2korr
(
p
);
si
->
port
=
uint2korr
(
p
);
p
+=
2
;
p
+=
2
;
si
->
rpl_recovery_rank
=
uint4korr
(
p
);
p
+=
4
;
if
(
!
(
si
->
master_id
=
uint4korr
(
p
)))
if
(
!
(
si
->
master_id
=
uint4korr
(
p
)))
si
->
master_id
=
server_id
;
si
->
master_id
=
server_id
;
si
->
thd
=
thd
;
si
->
thd
=
thd
;
...
@@ -669,8 +668,6 @@ bool show_slave_hosts(THD* thd)
...
@@ -669,8 +668,6 @@ bool show_slave_hosts(THD* thd)
field_list
.
push_back
(
new
Item_empty_string
(
"Password"
,
20
));
field_list
.
push_back
(
new
Item_empty_string
(
"Password"
,
20
));
}
}
field_list
.
push_back
(
new
Item_return_int
(
"Port"
,
7
,
MYSQL_TYPE_LONG
));
field_list
.
push_back
(
new
Item_return_int
(
"Port"
,
7
,
MYSQL_TYPE_LONG
));
field_list
.
push_back
(
new
Item_return_int
(
"Rpl_recovery_rank"
,
7
,
MYSQL_TYPE_LONG
));
field_list
.
push_back
(
new
Item_return_int
(
"Master_id"
,
10
,
field_list
.
push_back
(
new
Item_return_int
(
"Master_id"
,
10
,
MYSQL_TYPE_LONG
));
MYSQL_TYPE_LONG
));
...
@@ -692,7 +689,6 @@ bool show_slave_hosts(THD* thd)
...
@@ -692,7 +689,6 @@ bool show_slave_hosts(THD* thd)
protocol
->
store
(
si
->
password
,
&
my_charset_bin
);
protocol
->
store
(
si
->
password
,
&
my_charset_bin
);
}
}
protocol
->
store
((
uint32
)
si
->
port
);
protocol
->
store
((
uint32
)
si
->
port
);
protocol
->
store
((
uint32
)
si
->
rpl_recovery_rank
);
protocol
->
store
((
uint32
)
si
->
master_id
);
protocol
->
store
((
uint32
)
si
->
master_id
);
if
(
protocol
->
write
())
if
(
protocol
->
write
())
{
{
...
...
sql/slave.cc
View file @
9d59dfb5
...
@@ -1745,28 +1745,48 @@ int register_slave_on_master(MYSQL* mysql, Master_info *mi,
...
@@ -1745,28 +1745,48 @@ int register_slave_on_master(MYSQL* mysql, Master_info *mi,
bool
*
suppress_warnings
)
bool
*
suppress_warnings
)
{
{
uchar
buf
[
1024
],
*
pos
=
buf
;
uchar
buf
[
1024
],
*
pos
=
buf
;
uint
report_host_len
,
report_user_len
=
0
,
report_password_len
=
0
;
uint
report_host_len
=
0
,
report_user_len
=
0
,
report_password_len
=
0
;
DBUG_ENTER
(
"register_slave_on_master"
);
DBUG_ENTER
(
"register_slave_on_master"
);
*
suppress_warnings
=
FALSE
;
*
suppress_warnings
=
FALSE
;
if
(
!
report_host
)
if
(
report_host
)
report_host_len
=
strlen
(
report_host
);
if
(
report_host_len
>
HOSTNAME_LENGTH
)
{
sql_print_warning
(
"The length of report_host is %d. "
"It is larger than the max length(%d), so this "
"slave cannot be registered to the master."
,
report_host_len
,
HOSTNAME_LENGTH
);
DBUG_RETURN
(
0
);
DBUG_RETURN
(
0
);
report_host_len
=
strlen
(
report_host
);
}
if
(
report_user
)
if
(
report_user
)
report_user_len
=
strlen
(
report_user
);
report_user_len
=
strlen
(
report_user
);
if
(
report_user_len
>
USERNAME_LENGTH
)
{
sql_print_warning
(
"The length of report_user is %d. "
"It is larger than the max length(%d), so this "
"slave cannot be registered to the master."
,
report_user_len
,
USERNAME_LENGTH
);
DBUG_RETURN
(
0
);
}
if
(
report_password
)
if
(
report_password
)
report_password_len
=
strlen
(
report_password
);
report_password_len
=
strlen
(
report_password
);
/* 30 is a good safety margin */
if
(
report_password_len
>
MAX_PASSWORD_LENGTH
)
if
(
report_host_len
+
report_user_len
+
report_password_len
+
30
>
{
sizeof
(
buf
))
sql_print_warning
(
"The length of report_password is %d. "
DBUG_RETURN
(
0
);
// safety
"It is larger than the max length(%d), so this "
"slave cannot be registered to the master."
,
report_password_len
,
MAX_PASSWORD_LENGTH
);
DBUG_RETURN
(
0
);
}
int4store
(
pos
,
server_id
);
pos
+=
4
;
int4store
(
pos
,
server_id
);
pos
+=
4
;
pos
=
net_store_data
(
pos
,
(
uchar
*
)
report_host
,
report_host_len
);
pos
=
net_store_data
(
pos
,
(
uchar
*
)
report_host
,
report_host_len
);
pos
=
net_store_data
(
pos
,
(
uchar
*
)
report_user
,
report_user_len
);
pos
=
net_store_data
(
pos
,
(
uchar
*
)
report_user
,
report_user_len
);
pos
=
net_store_data
(
pos
,
(
uchar
*
)
report_password
,
report_password_len
);
pos
=
net_store_data
(
pos
,
(
uchar
*
)
report_password
,
report_password_len
);
int2store
(
pos
,
(
uint16
)
report_port
);
pos
+=
2
;
int2store
(
pos
,
(
uint16
)
report_port
);
pos
+=
2
;
int4store
(
pos
,
rpl_recovery_rank
);
pos
+=
4
;
/* The master will fill in master_id */
/* The master will fill in master_id */
int4store
(
pos
,
0
);
pos
+=
4
;
int4store
(
pos
,
0
);
pos
+=
4
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment