transactd 3.4.1 → 3.5.0

Sign up to get free protection for your applications and to get access to all the features.
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
+ // ------------------------------------------------------------------------