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.
Files changed (91) hide show
  1. checksums.yaml +4 -4
  2. data/CMakeLists.txt +2 -2
  3. data/bin/common/tdclc_32_3_5.dll +0 -0
  4. data/bin/common/tdclc_64_3_5.dll +0 -0
  5. data/build/common/options.cmake +12 -0
  6. data/build/common/transactd_cl_common.cmake +1 -0
  7. data/build/common/transactd_required.cmake +5 -0
  8. data/build/swig/ruby/tdclrb_wrap.cpp +1029 -130
  9. data/build/swig/tdcl.i +60 -5
  10. data/build/tdclc/CMakeLists.txt +30 -32
  11. data/build/tdclc/libtdclcm.map +1 -1
  12. data/build/tdclc/tdclc.cbproj +1 -1
  13. data/build/tdclc/tdclc.rc +4 -4
  14. data/build/tdclcpp/CMakeLists.txt +39 -48
  15. data/build/tdclcpp/tdclcpp.rc +4 -4
  16. data/build/tdclcpp/tdclcpp_bc.cbproj +4 -1
  17. data/build/tdclrb/CMakeLists.txt +5 -4
  18. data/build/tdclrb/tdclrb.rc +4 -4
  19. data/source/bzs/db/engine/mysql/database.cpp +45 -35
  20. data/source/bzs/db/engine/mysql/database.h +6 -8
  21. data/source/bzs/db/engine/mysql/dbManager.cpp +11 -0
  22. data/source/bzs/db/engine/mysql/dbManager.h +1 -0
  23. data/source/bzs/db/engine/mysql/ha.cpp +174 -0
  24. data/source/bzs/db/engine/mysql/ha.h +50 -0
  25. data/source/bzs/db/engine/mysql/mysqlInternal.h +18 -1
  26. data/source/bzs/db/engine/mysql/mysqlProtocol.cpp +222 -9
  27. data/source/bzs/db/engine/mysql/mysqlProtocol.h +5 -0
  28. data/source/bzs/db/protocol/tdap/client/client.cpp +23 -9
  29. data/source/bzs/db/protocol/tdap/client/client.h +125 -94
  30. data/source/bzs/db/protocol/tdap/client/connMgr.cpp +139 -30
  31. data/source/bzs/db/protocol/tdap/client/connMgr.h +40 -8
  32. data/source/bzs/db/protocol/tdap/client/database.cpp +17 -17
  33. data/source/bzs/db/protocol/tdap/client/database.h +15 -0
  34. data/source/bzs/db/protocol/tdap/client/dllmain.cpp +10 -4
  35. data/source/bzs/db/protocol/tdap/client/haNameResolver.cpp +486 -0
  36. data/source/bzs/db/protocol/tdap/client/haNameResolver.h +74 -0
  37. data/source/bzs/db/protocol/tdap/client/nsDatabase.cpp +102 -71
  38. data/source/bzs/db/protocol/tdap/client/nsDatabase.h +15 -3
  39. data/source/bzs/db/protocol/tdap/client/nsTable.cpp +2 -5
  40. data/source/bzs/db/protocol/tdap/client/nsTable.h +2 -1
  41. data/source/bzs/db/protocol/tdap/client/sqlBuilder.cpp +2 -2
  42. data/source/bzs/db/protocol/tdap/client/table.cpp +1 -2
  43. data/source/bzs/db/protocol/tdap/client/trdboostapi.h +13 -0
  44. data/source/bzs/db/protocol/tdap/client/trnsctcl.def +1 -0
  45. data/source/bzs/db/protocol/tdap/mysql/databaseSchema.cpp +9 -7
  46. data/source/bzs/db/protocol/tdap/mysql/recordsetReader.h +2 -2
  47. data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.cpp +328 -117
  48. data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.h +7 -8
  49. data/source/bzs/db/protocol/tdap/tdapcapi.h +81 -41
  50. data/source/bzs/db/transactd/connManager.cpp +118 -93
  51. data/source/bzs/db/transactd/connManager.h +6 -1
  52. data/source/bzs/db/transactd/connectionRecord.h +27 -7
  53. data/source/bzs/db/transactd/transactd.cpp +24 -13
  54. data/source/bzs/env/crosscompile.h +2 -0
  55. data/source/bzs/netsvc/client/iconnection.h +2 -0
  56. data/source/bzs/netsvc/client/tcpClient.cpp +45 -14
  57. data/source/bzs/netsvc/client/tcpClient.h +21 -4
  58. data/source/bzs/netsvc/server/IAppModule.h +1 -0
  59. data/source/bzs/netsvc/server/serverCpt.cpp +1 -1
  60. data/source/bzs/netsvc/server/serverPipe.cpp +2 -0
  61. data/source/bzs/netsvc/server/serverTpool.cpp +3 -5
  62. data/source/bzs/test/tdclatl/test_v3.js +91 -3
  63. data/source/bzs/test/tdclphp/transactd_v3_Test.php +89 -3
  64. data/source/bzs/test/tdclrb/transactd_v3_spec.rb +69 -2
  65. data/source/bzs/test/trdclengn/testField.h +19 -1
  66. data/source/bzs/test/trdclengn/test_tdclcpp_ha.cpp +388 -0
  67. data/source/bzs/test/trdclengn/test_tdclcpp_v3.cpp +6 -1
  68. data/source/bzs/test/trdclengn/test_trdclengn.cpp +1 -0
  69. data/source/bzs/test/trdclengn/testbase.h +7 -1
  70. data/source/global/replication/haCommand.cpp +843 -0
  71. data/source/global/replication/haCommand.h +78 -0
  72. data/source/global/replication/haMgr.cpp +321 -0
  73. data/source/global/replication/replCommand.cpp +696 -0
  74. data/source/global/replication/replCommand.h +161 -0
  75. data/source/global/tdclatl/BinlogPos.cpp +10 -0
  76. data/source/global/tdclatl/BinlogPos.h +1 -0
  77. data/source/global/tdclatl/ConnMgr.cpp +89 -2
  78. data/source/global/tdclatl/ConnMgr.h +13 -1
  79. data/source/global/tdclatl/ConnRecord.cpp +8 -2
  80. data/source/global/tdclatl/ConnRecord.h +4 -3
  81. data/source/global/tdclatl/Database.cpp +13 -0
  82. data/source/global/tdclatl/Database.h +2 -0
  83. data/source/global/tdclatl/HaNameREsolver.cpp +54 -0
  84. data/source/global/tdclatl/HaNameREsolver.h +68 -0
  85. data/source/global/tdclatl/resource.h +0 -0
  86. data/source/global/tdclatl/tdclatl.idl +76 -5
  87. metadata +16 -6
  88. data/bin/common/tdclc_32_3_4.dll +0 -0
  89. data/bin/common/tdclc_64_3_4.dll +0 -0
  90. data/source/bzs/db/protocol/tdap/mysql/debuglog.cpp +0 -423
  91. 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
- //echo PHP_EOL.'binlog pos = '.$bpos->filename.':'.$bpos->pos.PHP_EOL;
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 testTableList()
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
+ // ------------------------------------------------------------------------