summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHe Zhenxing <zhenxing.he@sun.com>2009-10-23 12:56:30 +0800
committerHe Zhenxing <zhenxing.he@sun.com>2009-10-23 12:56:30 +0800
commite9acb9f0212f31e9fc5e8a09ee2932f37faed13a (patch)
tree9a5b1366ff418440003a17f8eb21baa18ede113e
parentd8dee8cb32a8acc23a95f5288b30f7c488815fa1 (diff)
downloadmariadb-git-e9acb9f0212f31e9fc5e8a09ee2932f37faed13a.tar.gz
Add semi-sync support for Windows
CMakeLists.txt: Add plugin/semisync subdirectory mysql-test/mysql-test-run.pl: Check for semisync dll for Windows mysql-test/suite/rpl/r/rpl_semi_sync.result: Update result file mysql-test/suite/rpl/t/rpl_semi_sync.test: Test semi-sync on Windows plugin/semisync/semisync_master.cc: Define gettimeofday for Windows
-rwxr-xr-xCMakeLists.txt4
-rwxr-xr-xmysql-test/mysql-test-run.pl52
-rw-r--r--mysql-test/suite/rpl/r/rpl_semi_sync.result4
-rw-r--r--mysql-test/suite/rpl/t/rpl_semi_sync.test11
-rw-r--r--plugin/semisync/Makefile.am2
-rw-r--r--plugin/semisync/semisync_master.cc18
6 files changed, 65 insertions, 26 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 7d91e39eb6d..e7d05f33ffa 100755
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -276,6 +276,10 @@ FOREACH(DIR ${DYNAMIC_ENGINE_DIRECTORIES})
ADD_SUBDIRECTORY(${DIR})
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
# CMAKE_BUILD_TYPE is not set during configure time.
diff --git a/mysql-test/mysql-test-run.pl b/mysql-test/mysql-test-run.pl
index 1c14104957d..6f3822cfd85 100755
--- a/mysql-test/mysql-test-run.pl
+++ b/mysql-test/mysql-test-run.pl
@@ -1818,25 +1818,39 @@ sub environment_setup {
# --------------------------------------------------------------------------
# Add the path where mysqld will find semisync plugins
# --------------------------------------------------------------------------
- my $lib_semisync_master_plugin=
- mtr_file_exists(vs_config_dirs('plugin/semisync',"libsemisync_master.so"),
- "$basedir/plugin/semisync/.libs/libsemisync_master.so",
- "$basedir/lib/mysql/plugin/libsemisync_master.so");
- my $lib_semisync_slave_plugin=
- mtr_file_exists(vs_config_dirs('plugin/semisync',"libsemisync_slave.so"),
- "$basedir/plugin/semisync/.libs/libsemisync_slave.so",
- "$basedir/lib/mysql/plugin/libsemisync_slave.so");
- 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=";
+ if (!$opt_embedded_server) {
+ my $semisync_master_filename;
+ my $semisync_slave_filename;
+ if (IS_WINDOWS)
+ {
+ $semisync_master_filename = "semisync_master.dll";
+ $semisync_slave_filename = "semisync_slave.dll";
+ }
+ else
+ {
+ $semisync_master_filename = "libsemisync_master.so";
+ $semisync_slave_filename = "libsemisync_slave.so";
+ }
+ my $lib_semisync_master_plugin=
+ mtr_file_exists(vs_config_dirs('plugin/semisync',$semisync_master_filename),
+ "$basedir/plugin/semisync/.libs/" . $semisync_master_filename,
+ "$basedir/lib/mysql/plugin/" . $semisync_master_filename);
+ my $lib_semisync_slave_plugin=
+ 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=";
+ }
}
# ----------------------------------------------------
diff --git a/mysql-test/suite/rpl/r/rpl_semi_sync.result b/mysql-test/suite/rpl/r/rpl_semi_sync.result
index 607b77fbd04..1e220b28d78 100644
--- a/mysql-test/suite/rpl/r/rpl_semi_sync.result
+++ b/mysql-test/suite/rpl/r/rpl_semi_sync.result
@@ -397,7 +397,7 @@ Rpl_semi_sync_slave_status OFF
# Test non-semi-sync slave connect to semi-sync master
#
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;
/* 5s */
set sql_log_bin=1;
@@ -416,7 +416,7 @@ SHOW STATUS LIKE 'Rpl_semi_sync_slave_status';
Variable_name Value
include/stop_slave.inc
[ 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;
SHOW VARIABLES LIKE 'rpl_semi_sync_slave_enabled';
Variable_name Value
diff --git a/mysql-test/suite/rpl/t/rpl_semi_sync.test b/mysql-test/suite/rpl/t/rpl_semi_sync.test
index faf961bb580..4900acc1e91 100644
--- a/mysql-test/suite/rpl/t/rpl_semi_sync.test
+++ b/mysql-test/suite/rpl/t/rpl_semi_sync.test
@@ -1,6 +1,5 @@
source include/have_semisync_plugin.inc;
source include/not_embedded.inc;
-source include/not_windows.inc;
source include/have_innodb.inc;
source include/master-slave.inc;
@@ -61,7 +60,7 @@ let $value = query_get_value(show variables like 'rpl_semi_sync_master_enabled',
if (`select '$value' = 'No such row'`)
{
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 sql_log_bin=1;
}
@@ -126,7 +125,7 @@ let $value= query_get_value(show variables like 'rpl_semi_sync_slave_enabled', V
if (`select '$value' = 'No such row'`)
{
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;
}
enable_query_log;
@@ -536,7 +535,8 @@ SHOW STATUS LIKE 'Rpl_semi_sync_slave_status';
connection master;
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 sql_log_bin=1;
set global rpl_semi_sync_master_enabled= 1;
@@ -554,7 +554,8 @@ SHOW STATUS LIKE 'Rpl_semi_sync_slave_status';
source include/stop_slave.inc;
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;
SHOW VARIABLES LIKE 'rpl_semi_sync_slave_enabled';
SHOW STATUS LIKE 'Rpl_semi_sync_slave_status';
diff --git a/plugin/semisync/Makefile.am b/plugin/semisync/Makefile.am
index dfe539b8386..25949485987 100644
--- a/plugin/semisync/Makefile.am
+++ b/plugin/semisync/Makefile.am
@@ -34,3 +34,5 @@ libsemisync_slave_la_LDFLAGS = -module
libsemisync_slave_la_CXXFLAGS= $(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
+
+EXTRA_DIST= CMakeLists.txt plug.in
diff --git a/plugin/semisync/semisync_master.cc b/plugin/semisync/semisync_master.cc
index 1a7106621a4..cc83978ad4e 100644
--- a/plugin/semisync/semisync_master.cc
+++ b/plugin/semisync/semisync_master.cc
@@ -45,6 +45,18 @@ char rpl_semi_sync_master_wait_no_slave = 1;
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
@@ -728,6 +740,11 @@ int ReplSemiSyncMaster::commitTrx(const char* trx_wait_binlog_name,
int diff_usecs = start_tv.tv_usec + wait_timeout_ * TIME_THOUSAND;
/* 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;
if (diff_usecs < TIME_MILLION)
{
@@ -742,6 +759,7 @@ int ReplSemiSyncMaster::commitTrx(const char* trx_wait_binlog_name,
}
abstime.tv_nsec = diff_usecs * TIME_THOUSAND;
}
+#endif /* __WIN__ */
/* In semi-synchronous replication, we wait until the binlog-dump
* thread has received the reply on the relevant binlog segment from the