PageRenderTime 54ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 0ms

/test/replica_sets/refresh_test.rb

http://github.com/mongodb/mongo-ruby-driver
Ruby | 175 lines | 151 code | 22 blank | 2 comment | 1 complexity | 12f25ecbb7ff94087ff9b7662bf17bb6 MD5 | raw file
Possible License(s): Apache-2.0
  1. $:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
  2. require './test/replica_sets/rs_test_helper'
  3. require 'benchmark'
  4. class ReplicaSetRefreshTest < Test::Unit::TestCase
  5. def setup
  6. ensure_rs
  7. @conn = nil
  8. end
  9. def teardown
  10. @rs.restart_killed_nodes
  11. @conn.close if @conn
  12. end
  13. def test_connect_speed
  14. Benchmark.bm do |x|
  15. x.report("Connect") do
  16. 10.times do
  17. ReplSetConnection.new([@rs.host, @rs.ports[0]],
  18. [@rs.host, @rs.ports[1]],
  19. [@rs.host, @rs.ports[2]],
  20. :refresh_mode => false)
  21. end
  22. end
  23. @con = ReplSetConnection.new([@rs.host, @rs.ports[0]],
  24. [@rs.host, @rs.ports[1]],
  25. [@rs.host, @rs.ports[2]],
  26. :refresh_mode => false)
  27. x.report("manager") do
  28. man = Mongo::PoolManager.new(@con, @con.seeds)
  29. 10.times do
  30. man.connect
  31. end
  32. end
  33. end
  34. end
  35. def test_connect_and_manual_refresh_with_secondaries_down
  36. @rs.kill_all_secondaries
  37. rescue_connection_failure do
  38. @conn = ReplSetConnection.new([@rs.host, @rs.ports[0]],
  39. [@rs.host, @rs.ports[1]],
  40. [@rs.host, @rs.ports[2]],
  41. :refresh_mode => false)
  42. end
  43. assert_equal [], @conn.secondaries
  44. assert @conn.connected?
  45. assert_equal @conn.read_pool, @conn.primary_pool
  46. # Refresh with no change to set
  47. @conn.refresh
  48. assert_equal [], @conn.secondaries
  49. assert @conn.connected?
  50. assert_equal @conn.read_pool, @conn.primary_pool
  51. @rs.restart_killed_nodes
  52. assert_equal [], @conn.secondaries
  53. assert @conn.connected?
  54. assert_equal @conn.read_pool, @conn.primary_pool
  55. # Refresh with everything up
  56. @conn.refresh
  57. assert @conn.read_pool
  58. assert @conn.secondaries.length > 0
  59. end
  60. def test_automated_refresh_with_secondaries_down
  61. @rs.kill_all_secondaries
  62. rescue_connection_failure do
  63. @conn = ReplSetConnection.new([@rs.host, @rs.ports[0]],
  64. [@rs.host, @rs.ports[1]],
  65. [@rs.host, @rs.ports[2]],
  66. :refresh_interval => 2,
  67. :refresh_mode => :sync)
  68. end
  69. assert_equal [], @conn.secondaries
  70. assert @conn.connected?
  71. assert_equal @conn.read_pool, @conn.primary_pool
  72. old_refresh_version = @conn.refresh_version
  73. @rs.restart_killed_nodes
  74. sleep(4)
  75. @conn['foo']['bar'].find_one
  76. @conn['foo']['bar'].insert({:a => 1})
  77. assert @conn.refresh_version > old_refresh_version,
  78. "Refresh version hasn't changed."
  79. assert @conn.secondaries.length > 0,
  80. "No secondaries have been added."
  81. assert @conn.read_pool != @conn.primary_pool,
  82. "Read pool and primary pool are identical."
  83. end
  84. def test_automated_refresh_when_secondary_goes_down
  85. @conn = ReplSetConnection.new([@rs.host, @rs.ports[0]],
  86. [@rs.host, @rs.ports[1]],
  87. [@rs.host, @rs.ports[2]],
  88. :refresh_interval => 2,
  89. :refresh_mode => :sync)
  90. num_secondaries = @conn.secondary_pools.length
  91. old_refresh_version = @conn.refresh_version
  92. n = @rs.kill_secondary
  93. sleep(4)
  94. @conn['foo']['bar'].find_one
  95. assert @conn.refresh_version > old_refresh_version,
  96. "Refresh version hasn't changed."
  97. assert_equal num_secondaries - 1, @conn.secondaries.length
  98. assert_equal num_secondaries - 1, @conn.secondary_pools.length
  99. @rs.restart_killed_nodes
  100. end
  101. def test_automated_refresh_with_removed_node
  102. @conn = ReplSetConnection.new([@rs.host, @rs.ports[0]],
  103. [@rs.host, @rs.ports[1]],
  104. [@rs.host, @rs.ports[2]],
  105. :refresh_interval => 2,
  106. :refresh_mode => :sync)
  107. num_secondaries = @conn.secondary_pools.length
  108. old_refresh_version = @conn.refresh_version
  109. n = @rs.remove_secondary_node
  110. sleep(4)
  111. @conn['foo']['bar'].find_one
  112. assert @conn.refresh_version > old_refresh_version,
  113. "Refresh version hasn't changed."
  114. assert_equal num_secondaries - 1, @conn.secondaries.length
  115. assert_equal num_secondaries - 1, @conn.secondary_pools.length
  116. @rs.add_node(n)
  117. end
  118. def test_adding_and_removing_nodes
  119. @conn = ReplSetConnection.new([@rs.host, @rs.ports[0]],
  120. [@rs.host, @rs.ports[1]],
  121. [@rs.host, @rs.ports[2]],
  122. :refresh_interval => 2, :refresh_mode => :sync)
  123. @rs.add_node
  124. sleep(4)
  125. @conn['foo']['bar'].find_one
  126. @conn2 = ReplSetConnection.new([@rs.host, @rs.ports[0]],
  127. [@rs.host, @rs.ports[1]],
  128. [@rs.host, @rs.ports[2]],
  129. :refresh_interval => 2, :refresh_mode => :sync)
  130. assert @conn2.secondaries.sort == @conn.secondaries.sort,
  131. "Second connection secondaries not equal to first."
  132. assert_equal 3, @conn.secondary_pools.length
  133. assert_equal 3, @conn.secondaries.length
  134. config = @conn['admin'].command({:ismaster => 1})
  135. @rs.remove_secondary_node
  136. sleep(4)
  137. config = @conn['admin'].command({:ismaster => 1})
  138. assert_equal 2, @conn.secondary_pools.length
  139. assert_equal 2, @conn.secondaries.length
  140. end
  141. end