transactd 3.4.1 → 3.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CMakeLists.txt +2 -2
- data/bin/common/tdclc_32_3_5.dll +0 -0
- data/bin/common/tdclc_64_3_5.dll +0 -0
- data/build/common/options.cmake +12 -0
- data/build/common/transactd_cl_common.cmake +1 -0
- data/build/common/transactd_required.cmake +5 -0
- data/build/swig/ruby/tdclrb_wrap.cpp +1029 -130
- data/build/swig/tdcl.i +60 -5
- data/build/tdclc/CMakeLists.txt +30 -32
- data/build/tdclc/libtdclcm.map +1 -1
- data/build/tdclc/tdclc.cbproj +1 -1
- data/build/tdclc/tdclc.rc +4 -4
- data/build/tdclcpp/CMakeLists.txt +39 -48
- data/build/tdclcpp/tdclcpp.rc +4 -4
- data/build/tdclcpp/tdclcpp_bc.cbproj +4 -1
- data/build/tdclrb/CMakeLists.txt +5 -4
- data/build/tdclrb/tdclrb.rc +4 -4
- data/source/bzs/db/engine/mysql/database.cpp +45 -35
- data/source/bzs/db/engine/mysql/database.h +6 -8
- data/source/bzs/db/engine/mysql/dbManager.cpp +11 -0
- data/source/bzs/db/engine/mysql/dbManager.h +1 -0
- data/source/bzs/db/engine/mysql/ha.cpp +174 -0
- data/source/bzs/db/engine/mysql/ha.h +50 -0
- data/source/bzs/db/engine/mysql/mysqlInternal.h +18 -1
- data/source/bzs/db/engine/mysql/mysqlProtocol.cpp +222 -9
- data/source/bzs/db/engine/mysql/mysqlProtocol.h +5 -0
- data/source/bzs/db/protocol/tdap/client/client.cpp +23 -9
- data/source/bzs/db/protocol/tdap/client/client.h +125 -94
- data/source/bzs/db/protocol/tdap/client/connMgr.cpp +139 -30
- data/source/bzs/db/protocol/tdap/client/connMgr.h +40 -8
- data/source/bzs/db/protocol/tdap/client/database.cpp +17 -17
- data/source/bzs/db/protocol/tdap/client/database.h +15 -0
- data/source/bzs/db/protocol/tdap/client/dllmain.cpp +10 -4
- data/source/bzs/db/protocol/tdap/client/haNameResolver.cpp +486 -0
- data/source/bzs/db/protocol/tdap/client/haNameResolver.h +74 -0
- data/source/bzs/db/protocol/tdap/client/nsDatabase.cpp +102 -71
- data/source/bzs/db/protocol/tdap/client/nsDatabase.h +15 -3
- data/source/bzs/db/protocol/tdap/client/nsTable.cpp +2 -5
- data/source/bzs/db/protocol/tdap/client/nsTable.h +2 -1
- data/source/bzs/db/protocol/tdap/client/sqlBuilder.cpp +2 -2
- data/source/bzs/db/protocol/tdap/client/table.cpp +1 -2
- data/source/bzs/db/protocol/tdap/client/trdboostapi.h +13 -0
- data/source/bzs/db/protocol/tdap/client/trnsctcl.def +1 -0
- data/source/bzs/db/protocol/tdap/mysql/databaseSchema.cpp +9 -7
- data/source/bzs/db/protocol/tdap/mysql/recordsetReader.h +2 -2
- data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.cpp +328 -117
- data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.h +7 -8
- data/source/bzs/db/protocol/tdap/tdapcapi.h +81 -41
- data/source/bzs/db/transactd/connManager.cpp +118 -93
- data/source/bzs/db/transactd/connManager.h +6 -1
- data/source/bzs/db/transactd/connectionRecord.h +27 -7
- data/source/bzs/db/transactd/transactd.cpp +24 -13
- data/source/bzs/env/crosscompile.h +2 -0
- data/source/bzs/netsvc/client/iconnection.h +2 -0
- data/source/bzs/netsvc/client/tcpClient.cpp +45 -14
- data/source/bzs/netsvc/client/tcpClient.h +21 -4
- data/source/bzs/netsvc/server/IAppModule.h +1 -0
- data/source/bzs/netsvc/server/serverCpt.cpp +1 -1
- data/source/bzs/netsvc/server/serverPipe.cpp +2 -0
- data/source/bzs/netsvc/server/serverTpool.cpp +3 -5
- data/source/bzs/test/tdclatl/test_v3.js +91 -3
- data/source/bzs/test/tdclphp/transactd_v3_Test.php +89 -3
- data/source/bzs/test/tdclrb/transactd_v3_spec.rb +69 -2
- data/source/bzs/test/trdclengn/testField.h +19 -1
- data/source/bzs/test/trdclengn/test_tdclcpp_ha.cpp +388 -0
- data/source/bzs/test/trdclengn/test_tdclcpp_v3.cpp +6 -1
- data/source/bzs/test/trdclengn/test_trdclengn.cpp +1 -0
- data/source/bzs/test/trdclengn/testbase.h +7 -1
- data/source/global/replication/haCommand.cpp +843 -0
- data/source/global/replication/haCommand.h +78 -0
- data/source/global/replication/haMgr.cpp +321 -0
- data/source/global/replication/replCommand.cpp +696 -0
- data/source/global/replication/replCommand.h +161 -0
- data/source/global/tdclatl/BinlogPos.cpp +10 -0
- data/source/global/tdclatl/BinlogPos.h +1 -0
- data/source/global/tdclatl/ConnMgr.cpp +89 -2
- data/source/global/tdclatl/ConnMgr.h +13 -1
- data/source/global/tdclatl/ConnRecord.cpp +8 -2
- data/source/global/tdclatl/ConnRecord.h +4 -3
- data/source/global/tdclatl/Database.cpp +13 -0
- data/source/global/tdclatl/Database.h +2 -0
- data/source/global/tdclatl/HaNameREsolver.cpp +54 -0
- data/source/global/tdclatl/HaNameREsolver.h +68 -0
- data/source/global/tdclatl/resource.h +0 -0
- data/source/global/tdclatl/tdclatl.idl +76 -5
- metadata +16 -6
- data/bin/common/tdclc_32_3_4.dll +0 -0
- data/bin/common/tdclc_64_3_4.dll +0 -0
- data/source/bzs/db/protocol/tdap/mysql/debuglog.cpp +0 -423
- data/source/bzs/db/protocol/tdap/mysql/debuglog.h +0 -116
@@ -123,7 +123,7 @@ class connection : public boost::enable_shared_from_this<connection>,
|
|
123
123
|
|
124
124
|
boost::asio::write(m_socket, m_optionalBuffes,
|
125
125
|
boost::asio::transfer_all(), e);
|
126
|
-
if (e)
|
126
|
+
if (e || ret == EXECUTE_RESULT_SEND_QUIT)
|
127
127
|
return false;
|
128
128
|
}
|
129
129
|
}
|
@@ -153,7 +153,7 @@ class connection : public boost::enable_shared_from_this<connection>,
|
|
153
153
|
|
154
154
|
if (ret == EXECUTE_RESULT_QUIT)
|
155
155
|
return;
|
156
|
-
else if(ret == EXECUTE_RESULT_ACCESS_DNIED)
|
156
|
+
else if(ret == EXECUTE_RESULT_ACCESS_DNIED || ret == EXECUTE_RESULT_SEND_QUIT)
|
157
157
|
{
|
158
158
|
boost::asio::write(m_socket, buffer(&m_result[0], size),
|
159
159
|
boost::asio::transfer_all());
|
@@ -167,9 +167,7 @@ class connection : public boost::enable_shared_from_this<connection>,
|
|
167
167
|
boost::system::error_code ec;
|
168
168
|
boost::asio::write(m_socket, m_optionalBuffes,
|
169
169
|
boost::asio::transfer_all(), ec);
|
170
|
-
if (ec)
|
171
|
-
return;
|
172
|
-
syncReadWrite();
|
170
|
+
if (ec || !syncReadWrite()) return;
|
173
171
|
}
|
174
172
|
DEBUG_PROFILE_START(1)
|
175
173
|
async_write(m_socket, m_optionalBuffes,
|
@@ -316,6 +316,12 @@ function createFieldNames()
|
|
316
316
|
{
|
317
317
|
return new ActiveXObject("transactd.fieldNames");
|
318
318
|
}
|
319
|
+
/*--------------------------------------------------------------------------------*/
|
320
|
+
function createHaNameResolver()
|
321
|
+
{
|
322
|
+
return new ActiveXObject("transactd.haNameResolver");
|
323
|
+
}
|
324
|
+
|
319
325
|
/*--------------------------------------------------------------------------------*/
|
320
326
|
var sep = "-------------------------------------------------------------------------------";
|
321
327
|
var FMT_LEFT = 0;
|
@@ -702,6 +708,9 @@ function testBinlogPos(db)
|
|
702
708
|
checkNotEqual(bpos.filename, "", "bpos.filename");
|
703
709
|
WScript.Echo("\nBinlog pos = " + bpos.filename + ":" + bpos.pos);
|
704
710
|
WScript.Echo("Binlog gtid = " + bpos.gtid);
|
711
|
+
bpos.gtid = "abcd";
|
712
|
+
checkEqual(bpos.gtid, "abcd", "bpos.setGtid");
|
713
|
+
|
705
714
|
}
|
706
715
|
db.endSnapshot();
|
707
716
|
}
|
@@ -727,7 +736,7 @@ function testConnMgr(uri)
|
|
727
736
|
checkEqual(recs.size , 1, "mgr.Connections.size");
|
728
737
|
checkEqual(recs1.size , 1, "mgr.InUseDatabases.size");
|
729
738
|
checkEqual(recs2.size , 4, "mgr.InUseTables.size");
|
730
|
-
|
739
|
+
|
731
740
|
//tables
|
732
741
|
recs = mgr.tables("test_v3");
|
733
742
|
checkEqual(mgr.stat , 0, "mgr.tables");
|
@@ -761,17 +770,96 @@ function testConnMgr(uri)
|
|
761
770
|
recs = mgr.statusvars();
|
762
771
|
checkEqual(mgr.stat , 0, "mgr.statusvars");
|
763
772
|
checkEqual(mgr.statusvarName(0) , "tcp_connections", "mgr.statusvarName");
|
764
|
-
|
765
773
|
//slaveStatus
|
766
|
-
recs = mgr.slaveStatus();
|
774
|
+
recs = mgr.slaveStatus("");
|
767
775
|
checkEqual(mgr.stat , 0, "mgr.slaveStatus");
|
768
776
|
checkEqual(mgr.slaveStatusName(0) , "Slave_IO_State", "mgr.slaveStatusName");
|
769
777
|
var status = "";
|
770
778
|
for (var i = 0; i<recs.size; ++i)
|
771
779
|
status += (mgr.slaveStatusName(i) + "\t:" + recs(i).value + "\n");
|
780
|
+
//Extendedvars
|
781
|
+
recs = mgr.extendedvars();
|
782
|
+
checkEqual(recs.size, 4, "extendedvars size");
|
783
|
+
checkEqual(mgr.extendedVarName(0) , "MySQL_Gtid_Mode", "mgr.extendedVarName");
|
784
|
+
|
785
|
+
//slaveHosts
|
786
|
+
recs = mgr.slaveHosts();
|
787
|
+
checkEqual(mgr.stat , 0, "mgr.slaveHosts");
|
788
|
+
|
789
|
+
//channels
|
790
|
+
recs = mgr.channels();
|
791
|
+
checkEqual(mgr.stat , 0, "mgr.channels");
|
792
|
+
|
793
|
+
//haLock
|
794
|
+
var ret = mgr.haLock();
|
795
|
+
checkEqual(mgr.stat , 0, "mgr.haLock");
|
796
|
+
checkEqual(ret , true, "mgr.haLock");
|
797
|
+
|
798
|
+
//haUnlock
|
799
|
+
mgr.haUnlock();
|
800
|
+
checkEqual(mgr.stat , 0, "mgr.haUnlock");
|
801
|
+
|
802
|
+
//setRole
|
803
|
+
ret = mgr.setRole(0);
|
804
|
+
checkEqual(mgr.stat , 0, "mgr.setRole");
|
805
|
+
checkEqual(ret , true, "mgr.setRole");
|
806
|
+
|
807
|
+
ret = mgr.setRole(1);
|
808
|
+
checkEqual(mgr.stat , 0, "mgr.setRole");
|
809
|
+
checkEqual(ret , true, "mgr.setRole");
|
772
810
|
|
811
|
+
//setEnableFailover
|
812
|
+
ret = mgr.setEnableFailover(false);
|
813
|
+
checkEqual(mgr.stat , 0, "mgr.setEnableFailover");
|
814
|
+
checkEqual(ret , true, "mgr.setEnableFailover");
|
815
|
+
ret = mgr.setEnableFailover(true);
|
816
|
+
checkEqual(mgr.stat , 0, "mgr.setEnableFailover");
|
817
|
+
checkEqual(ret , true, "mgr.setEnableFailover");
|
818
|
+
checkEqual(mgr.isOpen , true, "mgr.isOpen");
|
819
|
+
|
820
|
+
//enableAutoReconnect
|
821
|
+
checkEqual(db.enableAutoReconnect, false, "db.enableAutoReconnect");
|
822
|
+
db.enableAutoReconnect = true;
|
823
|
+
checkEqual(db.enableAutoReconnect, true, "db.enableAutoReconnect2");
|
824
|
+
db.enableAutoReconnect = false;
|
773
825
|
mgr.disconnect();
|
774
826
|
checkEqual(mgr.stat , 0, "mgr.disconnect");
|
827
|
+
checkEqual(mgr.isOpen , false, "mgr.isOpen");
|
828
|
+
|
829
|
+
//haNameReslover
|
830
|
+
var hnr = createHaNameResolver();
|
831
|
+
var host = "localhost";
|
832
|
+
var user = "root";
|
833
|
+
var pwd = "";
|
834
|
+
if (WScript.arguments.length > 1)
|
835
|
+
host = WScript.arguments(1);
|
836
|
+
if (WScript.arguments.length > 2)
|
837
|
+
user = WScript.arguments(2);
|
838
|
+
if (WScript.arguments.length > 3)
|
839
|
+
pwd = WScript.arguments(3);
|
840
|
+
|
841
|
+
var ret = hnr.start("master123", "slave1, slave2", host, 0, user, pwd);
|
842
|
+
checkEqual(ret , 1, "hnr.start");
|
843
|
+
|
844
|
+
//portMap
|
845
|
+
hnr.addPortMap(3307, 8611);
|
846
|
+
hnr.clearPortMap();
|
847
|
+
|
848
|
+
//master slave name
|
849
|
+
checkEqual(hnr.master , host, "hnr.master");
|
850
|
+
checkEqual(hnr.slave , "-", "hnr.slave");
|
851
|
+
|
852
|
+
//connect by master roll
|
853
|
+
mgr.connect("tdap://" + user + "@master123/?pwd=" + pwd);
|
854
|
+
checkEqual(db.stat , 0, "mgr.connect hnr");
|
855
|
+
checkEqual(mgr.isOpen , true, "mgr.isOpen");
|
856
|
+
mgr.disconnect();
|
857
|
+
|
858
|
+
//stop
|
859
|
+
hnr.stop();
|
860
|
+
mgr.connect("tdap://" + user + "@master123/?pwd=" + pwd);
|
861
|
+
checkEqual(db.stat , ERROR_TD_HOSTNAME_NOT_FOUND, "mgr.connect hnr");
|
862
|
+
|
775
863
|
WScript.Echo("\n\n" + status);
|
776
864
|
}
|
777
865
|
|
@@ -768,7 +768,13 @@ class transactdTest extends PHPUnit_Framework_TestCase
|
|
768
768
|
}
|
769
769
|
$this->assertNotEquals($bpos->pos, 0);
|
770
770
|
$this->assertNotEquals($bpos->filename, "");
|
771
|
-
|
771
|
+
echo PHP_EOL.'binlog pos = '.$bpos->filename.':'.$bpos->pos.PHP_EOL;
|
772
|
+
echo 'gtid (set)= '.$bpos->gtid.PHP_EOL;;
|
773
|
+
|
774
|
+
//setGtid
|
775
|
+
$bpos->gtid = "ABCD";
|
776
|
+
$this->assertEquals($bpos->gtid , "ABCD");
|
777
|
+
|
772
778
|
$db->endSnapshot();
|
773
779
|
$db->close();
|
774
780
|
}
|
@@ -861,16 +867,96 @@ class transactdTest extends PHPUnit_Framework_TestCase
|
|
861
867
|
$this->assertEquals($mgr->stat(), 0);
|
862
868
|
$this->assertEquals(bz\connMgr::statusvarName(0), "tcp_connections");
|
863
869
|
//slaveStatus
|
864
|
-
$recs = $mgr->slaveStatus();
|
870
|
+
$recs = $mgr->slaveStatus("");
|
865
871
|
$this->assertEquals($mgr->stat(), 0);
|
866
872
|
$this->assertEquals($mgr->slaveStatusName(0), "Slave_IO_State");
|
867
873
|
for ($i = 0; $i < $recs->size(); $i++)
|
868
874
|
{
|
869
875
|
echo(PHP_EOL . $mgr->slaveStatusName($i) . "\t:" . $recs[$i]->value);
|
870
876
|
}
|
877
|
+
|
878
|
+
//extendedvars
|
879
|
+
$recs = $mgr->extendedvars();
|
880
|
+
$this->assertEquals($recs->size(), 4);
|
881
|
+
$this->assertEquals($mgr->extendedVarName(0) , "MySQL_Gtid_Mode");
|
882
|
+
|
883
|
+
// record port
|
884
|
+
$this->assertEquals($recs[0]->port , 0);
|
885
|
+
|
886
|
+
//slaveHosts
|
887
|
+
$recs = $mgr->slaveHosts();
|
888
|
+
$this->assertEquals($mgr->stat() , 0);
|
889
|
+
//channels
|
890
|
+
$recs = $mgr->channels();
|
891
|
+
$this->assertEquals($mgr->stat() , 0);
|
892
|
+
//haLock
|
893
|
+
$ret = $mgr->haLock();
|
894
|
+
$this->assertEquals($mgr->stat() , 0);
|
895
|
+
$this->assertEquals($ret , true);
|
896
|
+
//haUnlock
|
897
|
+
$mgr->haUnlock();
|
898
|
+
$this->assertEquals($mgr->stat() , 0);
|
899
|
+
//setRole
|
900
|
+
$ret = $mgr->setRole(0);
|
901
|
+
$this->assertEquals($mgr->stat() , 0);
|
902
|
+
$this->assertEquals($ret , true);
|
903
|
+
$ret = $mgr->setRole(1);
|
904
|
+
$this->assertEquals($mgr->stat() , 0);
|
905
|
+
$this->assertEquals($ret , true);
|
906
|
+
//setEnableFailover
|
907
|
+
$ret = $mgr->setEnableFailover(false);
|
908
|
+
$this->assertEquals($mgr->stat() , 0);
|
909
|
+
$this->assertEquals($ret , true);
|
910
|
+
$ret = $mgr->setEnableFailover(true);
|
911
|
+
$this->assertEquals($mgr->stat() , 0);
|
912
|
+
$this->assertEquals($ret , true);
|
913
|
+
$this->assertEquals($mgr->isOpen() , true);
|
914
|
+
//enableAutoReconnect
|
915
|
+
$this->assertEquals($db->enableAutoReconnect(), false);
|
916
|
+
$db->setenableAutoReconnect(true);
|
917
|
+
$this->assertEquals($db->enableAutoReconnect(), true);
|
918
|
+
$db->setenableAutoReconnect(false);
|
871
919
|
$mgr->disconnect();
|
872
|
-
$this->assertEquals($mgr->stat(), 0);
|
920
|
+
$this->assertEquals($mgr->stat() , 0);
|
921
|
+
$this->assertEquals($mgr->isOpen(), false);
|
922
|
+
//haNameReslover
|
923
|
+
$host = "localhost";
|
924
|
+
$user = "root";
|
925
|
+
$pwd = "";
|
926
|
+
$ret = bz\haNameResolver::start("master123", "slave1, slave2", $host, 0, $user, $pwd);
|
927
|
+
$this->assertEquals($ret , 1);
|
928
|
+
//portMap
|
929
|
+
bz\haNameResolver::addPortMap(3307, 8611);
|
930
|
+
bz\haNameResolver::clearPortMap();
|
931
|
+
//master slave name
|
932
|
+
$this->assertEquals(bz\haNameResolver::master() , $host);
|
933
|
+
$this->assertEquals(bz\haNameResolver::slave() , "-");
|
934
|
+
//connect by master roll
|
935
|
+
$mgr->connect("tdap://" . $user . "@master123/?pwd=" . $pwd);
|
936
|
+
$this->assertEquals($mgr->stat() , 0);
|
937
|
+
$this->assertEquals($mgr->isOpen() , true);
|
938
|
+
$mgr->disconnect();
|
939
|
+
$this->assertEquals($mgr->isOpen() , false);
|
940
|
+
//stop
|
941
|
+
bz\haNameResolver::stop();
|
942
|
+
$mgr->connect("tdap://" . $user . "@master123/?pwd=" . $pwd);
|
943
|
+
$this->assertEquals($mgr->stat() , ERROR_TD_HOSTNAME_NOT_FOUND);
|
873
944
|
$tb_other->close();
|
874
945
|
$db_other->close();
|
946
|
+
|
875
947
|
}
|
948
|
+
|
949
|
+
public function test_v3_5_constant()
|
950
|
+
{
|
951
|
+
$this->assertEquals(bz\transactd::ERROR_TD_RECONNECTED_OFFSET , 1000);
|
952
|
+
$this->assertEquals(bz\transactd::ERROR_TD_INVALID_SERVER_ROLE , 3812);
|
953
|
+
$this->assertEquals(bz\transactd::ERROR_TD_RECONNECTED , 3900);
|
954
|
+
$this->assertEquals(bz\transactd::MYSQL_ERROR_OFFSET , 25000);
|
955
|
+
$this->assertEquals(bz\transactd::HA_ROLE_SLAVE , 0);
|
956
|
+
$this->assertEquals(bz\transactd::HA_ROLE_MASTER , 1);
|
957
|
+
$this->assertEquals(bz\transactd::HA_ROLE_NONE , 2);
|
958
|
+
$this->assertEquals(bz\transactd::HA_RESTORE_ROLE , 4);
|
959
|
+
$this->assertEquals(bz\transactd::HA_ENABLE_FAILOVER , 8);
|
960
|
+
}
|
961
|
+
|
876
962
|
}
|
@@ -773,6 +773,10 @@ describe Transactd, 'V3Features' do
|
|
773
773
|
expect(bpos.pos).not_to eq 0
|
774
774
|
expect(bpos.filename).not_to eq ""
|
775
775
|
print "\nbinlog pos = ", bpos.filename, ":", bpos.pos, "\n"
|
776
|
+
print "gtid (set)= ", bpos.gtid, "\n"
|
777
|
+
# setGtid
|
778
|
+
bpos.gtid = "ABCD"
|
779
|
+
expect(bpos.gtid).to eq "ABCD"
|
776
780
|
db.endSnapshot();
|
777
781
|
db.close()
|
778
782
|
end
|
@@ -854,15 +858,78 @@ describe Transactd, 'V3Features' do
|
|
854
858
|
expect(mgr.stat()).to eq 0
|
855
859
|
expect(Transactd::ConnMgr::statusvarName(0)).to eq "tcp_connections"
|
856
860
|
# slaveStatus
|
857
|
-
recs = mgr.slaveStatus()
|
861
|
+
recs = mgr.slaveStatus("")
|
858
862
|
expect(mgr.stat()).to eq 0
|
859
863
|
expect(mgr.slaveStatusName(0)).to eq "Slave_IO_State"
|
860
|
-
|
861
864
|
for i in 0...recs.size() do
|
862
865
|
puts (mgr.slaveStatusName(i) + "\t:" + recs[i].value.to_s)
|
863
866
|
end
|
867
|
+
# extendedvars
|
868
|
+
recs = mgr.extendedvars()
|
869
|
+
expect(recs.size()).to eq 4
|
870
|
+
expect(Transactd::ConnMgr::extendedVarName(0)).to eq "MySQL_Gtid_Mode"
|
871
|
+
# record port
|
872
|
+
expect(recs[0].port).to eq 0
|
873
|
+
# slaveHosts
|
874
|
+
recs = mgr.slaveHosts()
|
875
|
+
expect(mgr.stat()).to eq 0
|
876
|
+
# channels
|
877
|
+
recs = mgr.channels()
|
878
|
+
expect(mgr.stat()).to eq 0
|
879
|
+
# haLock
|
880
|
+
ret = mgr.haLock()
|
881
|
+
expect(mgr.stat()).to eq 0
|
882
|
+
expect(ret).to eq true
|
883
|
+
# haUnlock
|
884
|
+
mgr.haUnlock()
|
885
|
+
expect(mgr.stat()).to eq 0
|
886
|
+
# setRole
|
887
|
+
ret = mgr.setRole(0)
|
888
|
+
expect(mgr.stat()).to eq 0
|
889
|
+
expect(ret).to eq true
|
890
|
+
ret = mgr.setRole(1)
|
891
|
+
expect(mgr.stat()).to eq 0
|
892
|
+
expect(ret).to eq true
|
893
|
+
# setEnableFailover
|
894
|
+
ret = mgr.setEnableFailover(false)
|
895
|
+
expect(mgr.stat()).to eq 0
|
896
|
+
expect(ret).to eq true
|
897
|
+
ret = mgr.setEnableFailover(true)
|
898
|
+
expect(mgr.stat()).to eq 0
|
899
|
+
expect(ret).to eq true
|
900
|
+
expect(mgr.isOpen()).to eq true
|
901
|
+
# enableAutoReconnect
|
902
|
+
expect(Transactd::Database::enableAutoReconnect()).to eq false
|
903
|
+
Transactd::Database::setEnableAutoReconnect(true)
|
904
|
+
expect(Transactd::Database::enableAutoReconnect()).to eq true
|
905
|
+
Transactd::Database::setEnableAutoReconnect(false)
|
906
|
+
mgr.disconnect()
|
907
|
+
expect(mgr.stat()).to eq 0
|
908
|
+
expect(mgr.isOpen()).to eq false
|
909
|
+
# haNameReslover
|
910
|
+
host = "localhost"
|
911
|
+
user = "root"
|
912
|
+
pwd = ""
|
913
|
+
ret = Transactd::HaNameResolver::start("master123", "slave1, slave2", host, 0, user, pwd)
|
914
|
+
expect(ret).to eq 1
|
915
|
+
# portMap
|
916
|
+
Transactd::HaNameResolver::addPortMap(3307, 8611)
|
917
|
+
Transactd::HaNameResolver::clearPortMap()
|
918
|
+
# master slave name
|
919
|
+
expect(Transactd::HaNameResolver::master()).to eq host
|
920
|
+
expect(Transactd::HaNameResolver::slave()).to eq "-"
|
921
|
+
# connect by master roll
|
922
|
+
mgr.connect("tdap://" + user + "@master123/?pwd=" + pwd)
|
923
|
+
expect(mgr.stat()).to eq 0
|
924
|
+
expect(mgr.isOpen()).to eq true
|
864
925
|
mgr.disconnect()
|
865
926
|
expect(mgr.stat()).to eq 0
|
927
|
+
expect(mgr.isOpen()).to eq false
|
928
|
+
# stop
|
929
|
+
Transactd::HaNameResolver::stop()
|
930
|
+
mgr.connect("tdap://" + user + "@master123/?pwd=" + pwd)
|
931
|
+
expect(mgr.stat()).to eq Transactd::ERROR_TD_HOSTNAME_NOT_FOUND
|
932
|
+
mgr.disconnect()
|
866
933
|
tb_other.close()
|
867
934
|
db_other.close()
|
868
935
|
end
|
@@ -3346,7 +3346,7 @@ void testSnapshotWithbinlog()
|
|
3346
3346
|
}
|
3347
3347
|
|
3348
3348
|
|
3349
|
-
void
|
3349
|
+
void testConnMgr()
|
3350
3350
|
{
|
3351
3351
|
nsdatabase::setCheckTablePtr(true);
|
3352
3352
|
database_ptr db = createDatabaseObject();
|
@@ -3372,8 +3372,26 @@ void testTableList()
|
|
3372
3372
|
}
|
3373
3373
|
{
|
3374
3374
|
mgr->slaveStatus();
|
3375
|
+
BOOST_CHECK_MESSAGE(mgr->stat() == 0, "stat = " << mgr->stat());
|
3376
|
+
}
|
3377
|
+
{
|
3378
|
+
const connMgr::records& recs = mgr->extendedvars();
|
3379
|
+
BOOST_CHECK(mgr->stat() == 0);
|
3380
|
+
BOOST_CHECK(recs.size() == TD_EXTENDED_VAR_SIZE);
|
3381
|
+
_tprintf(_T("\nSQL_GTID_MODE = %lld\n"),
|
3382
|
+
recs[TD_EXTENDED_VAR_MYSQL_GTID_MODE].longValue);
|
3383
|
+
}
|
3384
|
+
{
|
3385
|
+
const connMgr::records& recs = mgr->slaveHosts();
|
3375
3386
|
BOOST_CHECK(mgr->stat() == 0);
|
3387
|
+
for (int i=0;i<recs.size();++i)
|
3388
|
+
{
|
3389
|
+
_TCHAR tmp[1024];
|
3390
|
+
recs[i].value(tmp, 1024);
|
3391
|
+
_tprintf(_T("slaveHosts = %u\t%u\t%s\n"), recs[i].id, recs[i].readCount, tmp);
|
3392
|
+
}
|
3376
3393
|
}
|
3394
|
+
|
3377
3395
|
mgr->disconnect();
|
3378
3396
|
|
3379
3397
|
}
|
@@ -0,0 +1,388 @@
|
|
1
|
+
/* =================================================================
|
2
|
+
Copyright (C) 2015 BizStation Corp All rights reserved.
|
3
|
+
|
4
|
+
This program is free software; you can redistribute it and/or
|
5
|
+
modify it under the terms of the GNU General Public License
|
6
|
+
as published by the Free Software Foundation; either version 2
|
7
|
+
of the License, or (at your option) any later version.
|
8
|
+
|
9
|
+
This program is distributed in the hope that it will be useful,
|
10
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
11
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
12
|
+
GNU General Public License for more details.
|
13
|
+
|
14
|
+
You should have received a copy of the GNU General Public License
|
15
|
+
along with this program; if not, write to the Free Software
|
16
|
+
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
17
|
+
02111-1307, USA.
|
18
|
+
================================================================= */
|
19
|
+
#include "testbase.h"
|
20
|
+
#include <bzs/db/protocol/tdap/btrDate.h>
|
21
|
+
#include <bzs/db/protocol/tdap/client/connMgr.h>
|
22
|
+
#include <bzs/db/protocol/tdap/client/haNameResolver.h>
|
23
|
+
#include <limits.h>
|
24
|
+
#include <stdlib.h>
|
25
|
+
#include <global/replication/haCommand.h>
|
26
|
+
#pragma package(smart_init)
|
27
|
+
|
28
|
+
#define DBNAMEV3 _T("test_v3")
|
29
|
+
|
30
|
+
char host1[128] = {"localhost"};
|
31
|
+
char host2[128] = {"localhost:8611"};
|
32
|
+
char host3[128] = {"localhost:8612"};
|
33
|
+
char g_repUser[128] = "replication_user";
|
34
|
+
char g_repPasswd[128] = "abcd";
|
35
|
+
|
36
|
+
char slaveHostsWithPort[512];
|
37
|
+
static const char* portMap = "8610:3306,8611:3307,8612:3308";
|
38
|
+
|
39
|
+
/* command line ex
|
40
|
+
|
41
|
+
./test_tdclcpp_ha_64m --host1=HOST --host2=HOST:8611 --host3=HOST2 --repl_user=replication_user --repl_passwd=abcd
|
42
|
+
|
43
|
+
*/
|
44
|
+
void init_commandLine(char* argv)
|
45
|
+
{
|
46
|
+
if (strstr(argv, "--host1=") == argv)
|
47
|
+
strcpy_s(host1, 128, (argv + 8));
|
48
|
+
if (strstr(argv, "--host2=") == argv)
|
49
|
+
strcpy_s(host2, 128, (argv + 8));
|
50
|
+
if (strstr(argv, "--host3=") == argv)
|
51
|
+
strcpy_s(host3, 128, (argv + 8));
|
52
|
+
if (strstr(argv, "--repl_user=") == argv)
|
53
|
+
strcpy_s(g_repUser, 128, (argv + 12));
|
54
|
+
if (strstr(argv, "--repl_passwd=") == argv)
|
55
|
+
strcpy_s(g_repPasswd, 128, (argv + 14));
|
56
|
+
}
|
57
|
+
|
58
|
+
_tstring str_conv(const char* v)
|
59
|
+
{
|
60
|
+
#ifdef _UNICODE
|
61
|
+
wchar_t wbuf[1024];
|
62
|
+
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, v, -1, wbuf, 1024);
|
63
|
+
return wbuf;
|
64
|
+
#else
|
65
|
+
return v;
|
66
|
+
#endif //_UNICODE
|
67
|
+
}
|
68
|
+
|
69
|
+
const char* getHostList()
|
70
|
+
{
|
71
|
+
sprintf_s(slaveHostsWithPort, 512, "%s,%s,%s", host1, host2, host3);
|
72
|
+
return slaveHostsWithPort;
|
73
|
+
}
|
74
|
+
|
75
|
+
const char* g_port[3] = {"3306", "3307", "3308"};
|
76
|
+
const char* getReplPort(const _tstring& host)
|
77
|
+
{
|
78
|
+
_TCHAR tmp[128];
|
79
|
+
_tcscpy_s(tmp ,128, host.c_str());
|
80
|
+
int n = 0;
|
81
|
+
const _TCHAR* p = _tcsstr(tmp, _T(":"));
|
82
|
+
if (p)
|
83
|
+
n = _ttol(p+1) - 8610;
|
84
|
+
return g_port[n];
|
85
|
+
}
|
86
|
+
|
87
|
+
void start_Resolver()
|
88
|
+
{
|
89
|
+
const char* slaves = "slave1,slave2";
|
90
|
+
const char* slaveHostsWithPort = getHostList();
|
91
|
+
haNameResolver::addPortMap(3307, 8611);
|
92
|
+
haNameResolver::addPortMap(3308, 8612);
|
93
|
+
string u = toUtf8(g_userName);
|
94
|
+
string p = toUtf8(g_password);
|
95
|
+
int ret = haNameResolver::start("master", slaves, slaveHostsWithPort, 1, u.c_str(), p.c_str());
|
96
|
+
BOOST_CHECK_MESSAGE(ret == 0, "startResolver ret = " << ret);
|
97
|
+
}
|
98
|
+
|
99
|
+
void testSetServerRole()
|
100
|
+
{
|
101
|
+
failOverParam pm;
|
102
|
+
pm.master.host = str_conv(host1);
|
103
|
+
pm.master.user = g_userName;
|
104
|
+
pm.master.passwd = g_password;
|
105
|
+
try
|
106
|
+
{
|
107
|
+
setServerRole(pm, HA_ROLE_MASTER);
|
108
|
+
BOOST_CHECK(true);
|
109
|
+
}
|
110
|
+
catch (bzs::rtl::exception& e)
|
111
|
+
{
|
112
|
+
BOOST_CHECK_MESSAGE(false, "setServerRole Error");
|
113
|
+
_tprintf(_T("%s"), getMsg(e)->c_str());
|
114
|
+
}
|
115
|
+
}
|
116
|
+
|
117
|
+
void testNameResover()
|
118
|
+
{
|
119
|
+
start_Resolver();
|
120
|
+
BOOST_CHECK_MESSAGE(std::string(haNameResolver::slave()) == host2, haNameResolver::slave());
|
121
|
+
BOOST_CHECK_MESSAGE(std::string(haNameResolver::master()) == host1, haNameResolver::master());
|
122
|
+
|
123
|
+
database_ptr db = createDatabaseObject();
|
124
|
+
bool ret = db->open(makeUri(PROTOCOL, _T("master"), DBNAMEV3, BDFNAME));
|
125
|
+
BOOST_CHECK(ret == true);
|
126
|
+
table* tb = db->openTable(_T("fieldtest"));
|
127
|
+
BOOST_CHECK(db->stat() == 0);
|
128
|
+
tb->seekFirst();
|
129
|
+
tb->setFV(_T("int_1_byte"), 1);
|
130
|
+
tb->update();
|
131
|
+
BOOST_CHECK(tb->stat() == 0);
|
132
|
+
db->close();
|
133
|
+
ret = db->open(makeUri(PROTOCOL, _T("slave1"), DBNAMEV3, BDFNAME));
|
134
|
+
BOOST_CHECK(ret == true);
|
135
|
+
db->close();
|
136
|
+
|
137
|
+
//haNameResolver::clear();
|
138
|
+
//BOOST_CHECK(std::string(haNameResolver::slave()) == "");
|
139
|
+
//BOOST_CHECK(std::string(haNameResolver::master()) == "");
|
140
|
+
haNameResolver::stop();
|
141
|
+
ret = db->open(makeUri(PROTOCOL, _T("master"), DBNAMEV3, BDFNAME));
|
142
|
+
BOOST_CHECK(ret == false);
|
143
|
+
}
|
144
|
+
|
145
|
+
void makeSOParam(failOverParam& pm, const _tstring& master, const _tstring& newMaster)
|
146
|
+
{
|
147
|
+
pm.master.host = master;
|
148
|
+
pm.master.user = g_userName;
|
149
|
+
pm.master.passwd = g_password;
|
150
|
+
pm.newMaster.host = newMaster;
|
151
|
+
pm.newMaster.repPort = getReplPort(newMaster);
|
152
|
+
pm.newMaster.repUser = g_repUser;
|
153
|
+
pm.newMaster.repPasswd = g_repPasswd;
|
154
|
+
}
|
155
|
+
|
156
|
+
void testSwitchTo(const _tstring& master, const _tstring& newMaster)
|
157
|
+
{
|
158
|
+
try
|
159
|
+
{
|
160
|
+
haNameResolver::stop();
|
161
|
+
failOverParam pm;
|
162
|
+
pm.option |= OPT_SO_AUTO_SLVAE_LIST;
|
163
|
+
makeSOParam(pm,master, newMaster);
|
164
|
+
switchOrver(pm);
|
165
|
+
BOOST_CHECK(true);
|
166
|
+
}
|
167
|
+
catch (bzs::rtl::exception& e)
|
168
|
+
{
|
169
|
+
BOOST_CHECK(false);
|
170
|
+
_tprintf(_T("%s"), getMsg(e)->c_str());
|
171
|
+
}
|
172
|
+
}
|
173
|
+
|
174
|
+
void testNameResover8611()
|
175
|
+
{
|
176
|
+
start_Resolver();
|
177
|
+
bool ret = std::string(haNameResolver::slave()) == host1 || std::string(haNameResolver::slave()) == host3;
|
178
|
+
BOOST_CHECK_MESSAGE(ret == true, haNameResolver::slave());
|
179
|
+
BOOST_CHECK_MESSAGE(std::string(haNameResolver::master()) == host2, haNameResolver::master());
|
180
|
+
database_ptr db = createDatabaseObject();
|
181
|
+
ret = db->open(makeUri(PROTOCOL, _T("master"), DBNAMEV3, BDFNAME));
|
182
|
+
BOOST_CHECK(ret == true);
|
183
|
+
db->close();
|
184
|
+
ret = db->open(makeUri(PROTOCOL, _T("slave1"), DBNAMEV3, BDFNAME));
|
185
|
+
BOOST_CHECK(ret == true);
|
186
|
+
db->close();
|
187
|
+
|
188
|
+
//haNameResolver::clear();
|
189
|
+
//BOOST_CHECK(std::string(haNameResolver::slave()) == "");
|
190
|
+
//BOOST_CHECK(std::string(haNameResolver::master()) == "");
|
191
|
+
haNameResolver::stop();
|
192
|
+
ret = db->open(makeUri(PROTOCOL, _T("master"), DBNAMEV3, BDFNAME));
|
193
|
+
BOOST_CHECK(ret == false);
|
194
|
+
}
|
195
|
+
|
196
|
+
void testSwitchLiveSeek()
|
197
|
+
{
|
198
|
+
database_ptr db = createDatabaseObject();
|
199
|
+
try
|
200
|
+
{
|
201
|
+
start_Resolver();
|
202
|
+
bool ret = db->open(makeUri(PROTOCOL, _T("master"), DBNAMEV3, BDFNAME));
|
203
|
+
BOOST_CHECK(db->stat() == 0);
|
204
|
+
if (ret)
|
205
|
+
{
|
206
|
+
table* tb = db->openTable(_T("fieldtest"));
|
207
|
+
BOOST_CHECK(db->stat() == 0);
|
208
|
+
table* tb2 = db->openTable(_T("timetest"));
|
209
|
+
BOOST_CHECK(db->stat() == 0);
|
210
|
+
if (tb && tb2)
|
211
|
+
{
|
212
|
+
tb->seekFirst();
|
213
|
+
tb2->seekFirst();
|
214
|
+
failOverParam pm;
|
215
|
+
pm.option |= OPT_SO_AUTO_SLVAE_LIST;
|
216
|
+
makeSOParam(pm, str_conv(host2), str_conv(host3));
|
217
|
+
switchOrver(pm);
|
218
|
+
BOOST_CHECK(true);
|
219
|
+
|
220
|
+
tb->seekNext();
|
221
|
+
BOOST_CHECK(tb->stat() == 0);
|
222
|
+
BOOST_CHECK(tb->getFVint(_T("id")) == 2);
|
223
|
+
tb2->seekNext();
|
224
|
+
BOOST_CHECK(tb2->stat() == 0);
|
225
|
+
BOOST_CHECK(tb2->getFVint(_T("id")) == 2);
|
226
|
+
tb->release();
|
227
|
+
tb2->release();
|
228
|
+
}
|
229
|
+
}
|
230
|
+
}
|
231
|
+
catch (bzs::rtl::exception& e)
|
232
|
+
{
|
233
|
+
BOOST_CHECK(false);
|
234
|
+
_tprintf(_T("%s"), getMsg(e)->c_str());
|
235
|
+
}
|
236
|
+
}
|
237
|
+
|
238
|
+
void testSwitchLiveOpen()
|
239
|
+
{
|
240
|
+
try
|
241
|
+
{
|
242
|
+
database_ptr db = createDatabaseObject();
|
243
|
+
start_Resolver();
|
244
|
+
failOverParam pm;
|
245
|
+
pm.option |= OPT_SO_AUTO_SLVAE_LIST;
|
246
|
+
makeSOParam(pm, str_conv(host3), str_conv(host1));
|
247
|
+
switchOrver(pm);
|
248
|
+
bool ret = db->open(makeUri(PROTOCOL, _T("master"), DBNAMEV3, BDFNAME));
|
249
|
+
BOOST_CHECK(ret && (db->stat() == 0));
|
250
|
+
}
|
251
|
+
catch (bzs::rtl::exception& e)
|
252
|
+
{
|
253
|
+
BOOST_CHECK(false);
|
254
|
+
_tprintf(_T("%s"), getMsg(e)->c_str());
|
255
|
+
}
|
256
|
+
}
|
257
|
+
|
258
|
+
void testEnableFailOver(bool v)
|
259
|
+
{
|
260
|
+
failOverParam pm;
|
261
|
+
pm.master.host = str_conv(host1);
|
262
|
+
pm.master.user = g_userName;
|
263
|
+
pm.master.passwd = g_password;
|
264
|
+
pm.option |= OPT_SO_AUTO_SLVAE_LIST;
|
265
|
+
try
|
266
|
+
{
|
267
|
+
setEnableFailOver(pm, v);
|
268
|
+
BOOST_CHECK(true);
|
269
|
+
}
|
270
|
+
catch (bzs::rtl::exception& e)
|
271
|
+
{
|
272
|
+
BOOST_CHECK_MESSAGE(false, "setEnableFailOver Error v = " << v);
|
273
|
+
_tprintf(_T("%s"), getMsg(e)->c_str());
|
274
|
+
}
|
275
|
+
}
|
276
|
+
|
277
|
+
void testFailOverBlock()
|
278
|
+
{
|
279
|
+
database_ptr db = createDatabaseObject();
|
280
|
+
start_Resolver();
|
281
|
+
failOverParam pm;
|
282
|
+
pm.master.user = g_userName;
|
283
|
+
pm.master.passwd = g_password;
|
284
|
+
char tmp[512];
|
285
|
+
sprintf_s(tmp, 512, "%s,%s", host2, host3);
|
286
|
+
pm.slaves = str_conv(tmp);
|
287
|
+
pm.portMap = portMap;
|
288
|
+
try
|
289
|
+
{
|
290
|
+
failOrver(pm);
|
291
|
+
BOOST_CHECK_MESSAGE(false, "failorver not block");
|
292
|
+
}
|
293
|
+
catch (bzs::rtl::exception& /*e*/)
|
294
|
+
{
|
295
|
+
BOOST_CHECK(true);
|
296
|
+
|
297
|
+
}
|
298
|
+
}
|
299
|
+
|
300
|
+
void testFailOver8611()
|
301
|
+
{
|
302
|
+
database_ptr db = createDatabaseObject();
|
303
|
+
start_Resolver();
|
304
|
+
failOverParam pm;
|
305
|
+
pm.master.user = g_userName;
|
306
|
+
pm.master.passwd = g_password;
|
307
|
+
char tmp[512];
|
308
|
+
sprintf_s(tmp, 512, "%s,%s", host2, host3);
|
309
|
+
pm.slaves = str_conv(tmp);
|
310
|
+
pm.portMap = portMap;
|
311
|
+
try
|
312
|
+
{
|
313
|
+
failOrver(pm);
|
314
|
+
bool ret = db->open(makeUri(PROTOCOL, _T("master"), DBNAMEV3, BDFNAME));
|
315
|
+
BOOST_CHECK(ret && db->stat() == 0);
|
316
|
+
}
|
317
|
+
catch (bzs::rtl::exception& e)
|
318
|
+
{
|
319
|
+
BOOST_CHECK_MESSAGE(false, "fail orver");
|
320
|
+
_tprintf(_T("%s"), getMsg(e)->c_str());
|
321
|
+
}
|
322
|
+
}
|
323
|
+
|
324
|
+
void testMasterToSlave()
|
325
|
+
{
|
326
|
+
database_ptr db = createDatabaseObject();
|
327
|
+
start_Resolver();
|
328
|
+
failOverParam pm;
|
329
|
+
makeSOParam(pm, str_conv(host1), str_conv(host2));
|
330
|
+
try
|
331
|
+
{
|
332
|
+
demoteToSlave(pm);
|
333
|
+
bool ret = db->open(makeUri(PROTOCOL, _T("master"), DBNAMEV3, BDFNAME));
|
334
|
+
BOOST_CHECK(ret && db->stat() == 0);
|
335
|
+
}
|
336
|
+
catch (bzs::rtl::exception& e)
|
337
|
+
{
|
338
|
+
BOOST_CHECK(false);
|
339
|
+
_tprintf(_T("%s"), getMsg(e)->c_str());
|
340
|
+
}
|
341
|
+
|
342
|
+
}
|
343
|
+
|
344
|
+
BOOST_AUTO_TEST_SUITE(ha_default)
|
345
|
+
BOOST_AUTO_TEST_CASE(NameResover)
|
346
|
+
{
|
347
|
+
testSetServerRole();
|
348
|
+
testNameResover();
|
349
|
+
}
|
350
|
+
BOOST_AUTO_TEST_SUITE_END()
|
351
|
+
|
352
|
+
|
353
|
+
BOOST_AUTO_TEST_SUITE(SwitchOver)
|
354
|
+
BOOST_AUTO_TEST_CASE(Switch8611)
|
355
|
+
{
|
356
|
+
testSwitchTo(str_conv(host1), str_conv(host2));
|
357
|
+
}
|
358
|
+
|
359
|
+
BOOST_AUTO_TEST_CASE(NameResover8611)
|
360
|
+
{
|
361
|
+
testNameResover8611();
|
362
|
+
}
|
363
|
+
|
364
|
+
BOOST_AUTO_TEST_CASE(Switch8612)
|
365
|
+
{
|
366
|
+
testSwitchLiveSeek();
|
367
|
+
}
|
368
|
+
BOOST_AUTO_TEST_CASE(Switch8610)
|
369
|
+
{
|
370
|
+
testSwitchLiveOpen();
|
371
|
+
}
|
372
|
+
|
373
|
+
BOOST_AUTO_TEST_SUITE_END()
|
374
|
+
|
375
|
+
BOOST_AUTO_TEST_SUITE(FailOver)
|
376
|
+
BOOST_AUTO_TEST_CASE(FailOver8611)
|
377
|
+
{
|
378
|
+
testEnableFailOver(false);
|
379
|
+
testFailOverBlock();
|
380
|
+
testEnableFailOver(true);
|
381
|
+
Sleep(10000);
|
382
|
+
testFailOver8611();
|
383
|
+
testMasterToSlave();
|
384
|
+
testSwitchTo(str_conv(host2), str_conv(host1));
|
385
|
+
}
|
386
|
+
BOOST_AUTO_TEST_SUITE_END()
|
387
|
+
|
388
|
+
// ------------------------------------------------------------------------
|