mirror of
https://github.com/postgresml/pgcat.git
synced 2026-03-24 01:36:29 +00:00
Do not unban replicas if a primary is available (#843)
Add `unban_replicas_when_all_banned` to control unbanning replicas behavior.
This commit is contained in:
@@ -315,6 +315,9 @@ pub struct General {
|
||||
#[serde(default = "General::default_ban_time")]
|
||||
pub ban_time: i64,
|
||||
|
||||
#[serde(default)] // True
|
||||
pub unban_replicas_when_all_banned: bool,
|
||||
|
||||
#[serde(default = "General::default_idle_client_in_transaction_timeout")]
|
||||
pub idle_client_in_transaction_timeout: u64,
|
||||
|
||||
@@ -460,6 +463,7 @@ impl Default for General {
|
||||
healthcheck_timeout: Self::default_healthcheck_timeout(),
|
||||
healthcheck_delay: Self::default_healthcheck_delay(),
|
||||
ban_time: Self::default_ban_time(),
|
||||
unban_replicas_when_all_banned: true,
|
||||
idle_client_in_transaction_timeout: Self::default_idle_client_in_transaction_timeout(),
|
||||
server_lifetime: Self::default_server_lifetime(),
|
||||
server_round_robin: Self::default_server_round_robin(),
|
||||
|
||||
10
src/pool.rs
10
src/pool.rs
@@ -189,6 +189,9 @@ pub struct PoolSettings {
|
||||
// Ban time
|
||||
pub ban_time: i64,
|
||||
|
||||
// Should we automatically unban replicas when all are banned?
|
||||
pub unban_replicas_when_all_banned: bool,
|
||||
|
||||
// Regex for searching for the sharding key in SQL statements
|
||||
pub sharding_key_regex: Option<Regex>,
|
||||
|
||||
@@ -228,6 +231,7 @@ impl Default for PoolSettings {
|
||||
healthcheck_delay: General::default_healthcheck_delay(),
|
||||
healthcheck_timeout: General::default_healthcheck_timeout(),
|
||||
ban_time: General::default_ban_time(),
|
||||
unban_replicas_when_all_banned: true,
|
||||
sharding_key_regex: None,
|
||||
shard_id_regex: None,
|
||||
regex_search_limit: 1000,
|
||||
@@ -541,6 +545,9 @@ impl ConnectionPool {
|
||||
healthcheck_delay: config.general.healthcheck_delay,
|
||||
healthcheck_timeout: config.general.healthcheck_timeout,
|
||||
ban_time: config.general.ban_time,
|
||||
unban_replicas_when_all_banned: config
|
||||
.general
|
||||
.unban_replicas_when_all_banned,
|
||||
sharding_key_regex: pool_config
|
||||
.sharding_key_regex
|
||||
.clone()
|
||||
@@ -946,8 +953,9 @@ impl ConnectionPool {
|
||||
let read_guard = self.banlist.read();
|
||||
let all_replicas_banned = read_guard[address.shard].len() == replicas_available;
|
||||
drop(read_guard);
|
||||
let unban_replicas_when_all_banned = self.settings.clone().unban_replicas_when_all_banned;
|
||||
|
||||
if all_replicas_banned {
|
||||
if all_replicas_banned && unban_replicas_when_all_banned {
|
||||
let mut write_guard = self.banlist.write();
|
||||
warn!("Unbanning all replicas.");
|
||||
write_guard[address.shard].clear();
|
||||
|
||||
@@ -1464,6 +1464,7 @@ mod test {
|
||||
healthcheck_delay: PoolSettings::default().healthcheck_delay,
|
||||
healthcheck_timeout: PoolSettings::default().healthcheck_timeout,
|
||||
ban_time: PoolSettings::default().ban_time,
|
||||
unban_replicas_when_all_banned: true,
|
||||
sharding_key_regex: None,
|
||||
shard_id_regex: None,
|
||||
default_shard: crate::config::DefaultShard::Shard(0),
|
||||
@@ -1542,6 +1543,7 @@ mod test {
|
||||
healthcheck_delay: PoolSettings::default().healthcheck_delay,
|
||||
healthcheck_timeout: PoolSettings::default().healthcheck_timeout,
|
||||
ban_time: PoolSettings::default().ban_time,
|
||||
unban_replicas_when_all_banned: true,
|
||||
sharding_key_regex: Some(Regex::new(r"/\* sharding_key: (\d+) \*/").unwrap()),
|
||||
shard_id_regex: Some(Regex::new(r"/\* shard_id: (\d+) \*/").unwrap()),
|
||||
default_shard: crate::config::DefaultShard::Shard(0),
|
||||
|
||||
Reference in New Issue
Block a user