diff options
author | He Zhenxing <zhenxing.he@sun.com> | 2009-10-23 12:56:30 +0800 |
---|---|---|
committer | He Zhenxing <zhenxing.he@sun.com> | 2009-10-23 12:56:30 +0800 |
commit | e9acb9f0212f31e9fc5e8a09ee2932f37faed13a (patch) | |
tree | 9a5b1366ff418440003a17f8eb21baa18ede113e | |
parent | d8dee8cb32a8acc23a95f5288b30f7c488815fa1 (diff) | |
download | mariadb-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-x | CMakeLists.txt | 4 | ||||
-rwxr-xr-x | mysql-test/mysql-test-run.pl | 52 | ||||
-rw-r--r-- | mysql-test/suite/rpl/r/rpl_semi_sync.result | 4 | ||||
-rw-r--r-- | mysql-test/suite/rpl/t/rpl_semi_sync.test | 11 | ||||
-rw-r--r-- | plugin/semisync/Makefile.am | 2 | ||||
-rw-r--r-- | plugin/semisync/semisync_master.cc | 18 |
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 |