transactd 3.4.1 → 3.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|
+
// ------------------------------------------------------------------------
|