Skip to content

Commit 622e210

Browse files
committed
Add a test for ban expiration unban timing
1 parent 6a31e9c commit 622e210

File tree

3 files changed

+52
-3
lines changed

3 files changed

+52
-3
lines changed

tests/ruby/helpers/pg_instance.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ class PgInstance
66
attr_reader :username
77
attr_reader :password
88
attr_reader :database_name
9+
attr_reader :original_port
910

1011
def self.mass_takedown(databases)
1112
raise StandardError "block missing" unless block_given?

tests/ruby/helpers/pgcat_helper.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ def self.single_instance_setup(pool_name, pool_size, pool_mode="transaction", lb
119119
end
120120
end
121121

122-
def self.single_shard_setup(pool_name, pool_size, pool_mode="transaction", lb_mode="random", log_level="info", pool_settings={})
122+
def self.single_shard_setup(pool_name, pool_size, pool_mode="transaction", lb_mode="random", log_level="info", pool_settings={}, general_settings = {})
123123
user = {
124124
"password" => "sharding_user",
125125
"pool_size" => pool_size,
@@ -163,6 +163,7 @@ def self.single_shard_setup(pool_name, pool_size, pool_mode="transaction", lb_mo
163163
"#{pool_name}" => pool_config,
164164
}
165165
pgcat_cfg["general"]["port"] = pgcat.port
166+
pgcat_cfg["general"] = pgcat_cfg["general"].merge(general_settings)
166167
pgcat.update_config(pgcat_cfg)
167168
pgcat.start
168169
pgcat.wait_until_ready

tests/ruby/load_balancing_spec.rb

Lines changed: 49 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@
165165

166166
describe "Candidate filtering based on `default_pool`" do
167167
let(:processes) {
168-
Helpers::Pgcat.single_shard_setup("sharded_db", 5, "transaction", "random", "debug", pool_settings)
168+
Helpers::Pgcat.single_shard_setup("sharded_db", 5, "transaction", "random", "debug", pool_settings, general_settings)
169169
}
170170

171171
after do
@@ -175,12 +175,16 @@
175175

176176
context("with default_pool set to replicas") do
177177
context("when all replicas are down ") do
178+
let(:ban_time) { 60 }
179+
let(:connect_timeout) { 1000 }
178180
let(:pool_settings) do
179181
{
180182
"default_role" => "replica",
181-
"replica_to_primary_failover_enabled" => replica_to_primary_failover_enabled
183+
"replica_to_primary_failover_enabled" => replica_to_primary_failover_enabled,
184+
"connect_timeout" => connect_timeout,
182185
}
183186
end
187+
let(:general_settings) { { "ban_time" => ban_time } }
184188

185189
context("with `replica_to_primary_failover_enabled` set to false`") do
186190
let(:replica_to_primary_failover_enabled) { false }
@@ -249,6 +253,49 @@
249253

250254
expect(failed_count).to(eq(number_of_replicas))
251255
end
256+
context("when banned replicas are tested for availability because they expired the ban time") do
257+
let(:ban_time) { 2 }
258+
it "should be done in the background without interfering with traffic" do
259+
select_server_port = "SELECT setting AS port FROM pg_settings WHERE name = 'port';"
260+
conn = PG.connect(processes.pgcat.connection_string("sharded_db", "sharding_user"))
261+
primary_port = processes.primary.original_port;
262+
263+
response = conn.async_exec(select_server_port)
264+
expect(response[0]["port"].to_i).not_to(eq(primary_port))
265+
266+
failed_count = 0
267+
number_of_replicas = processes[:replicas].length
268+
269+
# Take down all replicas
270+
processes[:replicas].each(&:take_down)
271+
272+
(number_of_replicas).times do |n|
273+
response = conn.async_exec(select_server_port)
274+
expect(response[0]["port"].to_i).to(eq(primary_port))
275+
rescue
276+
conn = PG.connect(processes.pgcat.connection_string("sharded_db", "sharding_user"))
277+
failed_count += 1
278+
end
279+
expect(failed_count).to(eq(number_of_replicas))
280+
failed_count = 0
281+
282+
response = conn.async_exec(select_server_port)
283+
expect(response[0]["port"].to_i).to(eq(primary_port))
284+
sleep(ban_time + 1)
285+
286+
begin
287+
time_before_query = Time.now
288+
response = conn.async_exec(select_server_port)
289+
expect(response[0]["port"].to_i).to(eq(primary_port))
290+
expect(Time.now - time_before_query).to(be < connect_timeout / 1000.0)
291+
rescue
292+
conn = PG.connect(processes.pgcat.connection_string("sharded_db", "sharding_user"))
293+
failed_count += 1
294+
end
295+
expect(response[0]["port"].to_i).to(eq(primary_port))
296+
expect(failed_count).to(eq(0))
297+
end
298+
end
252299
end
253300
end
254301
end

0 commit comments

Comments
 (0)