From a1690a76c54005121f7f34221b7da86debab5d4a Mon Sep 17 00:00:00 2001 From: Vita Tauer Date: Wed, 6 Nov 2024 16:40:24 +0100 Subject: [PATCH 1/2] Add 'Fail' mode when no shard selected --- pgcat.toml | 1 + src/config.rs | 3 +++ src/errors.rs | 1 + src/pool.rs | 3 ++- 4 files changed, 7 insertions(+), 1 deletion(-) diff --git a/pgcat.toml b/pgcat.toml index 87f2700c..888a920b 100644 --- a/pgcat.toml +++ b/pgcat.toml @@ -179,6 +179,7 @@ primary_reads_enabled = true # `random`: picks a shard at random # `random_healthy`: picks a shard at random favoring shards with the least number of recent errors # `shard_`: e.g. shard_0, shard_4, etc. picks a specific shard, everytime +# `fail`: fails to pick up shard. (require explicit shard setup) # default_shard = "shard_0" # So what if you wanted to implement a different hashing function, diff --git a/src/config.rs b/src/config.rs index b0d98fb5..0fca24d6 100644 --- a/src/config.rs +++ b/src/config.rs @@ -773,6 +773,7 @@ pub enum DefaultShard { Shard(usize), Random, RandomHealthy, + Fail } impl Default for DefaultShard { fn default() -> Self { @@ -787,6 +788,7 @@ impl serde::Serialize for DefaultShard { } DefaultShard::Random => serializer.serialize_str("random"), DefaultShard::RandomHealthy => serializer.serialize_str("random_healthy"), + DefaultShard::Fail => serializer.serialize_str("fail"), } } } @@ -804,6 +806,7 @@ impl<'de> serde::Deserialize<'de> for DefaultShard { match s.as_str() { "random" => Ok(DefaultShard::Random), "random_healthy" => Ok(DefaultShard::RandomHealthy), + "fail" => Ok(DefaultShard::Fail), _ => Err(serde::de::Error::custom( "invalid value for no_shard_specified_behavior", )), diff --git a/src/errors.rs b/src/errors.rs index 13047b4b..8dc93ab3 100644 --- a/src/errors.rs +++ b/src/errors.rs @@ -30,6 +30,7 @@ pub enum Error { QueryRouterError(String), InvalidShardId(usize), PreparedStatementError, + NoShardSelected } #[derive(Clone, PartialEq, Debug)] diff --git a/src/pool.rs b/src/pool.rs index 7915a0a4..76e70a77 100644 --- a/src/pool.rs +++ b/src/pool.rs @@ -719,7 +719,8 @@ impl ConnectionPool { .partial_cmp(&a.error_count.load(Ordering::Relaxed)) .unwrap() }); - } + }, + DefaultShard::Fail => return Err(Error::NoShardSelected) }, }; From c0ae53484f1cc7a60d96da794d7c1a81580ee152 Mon Sep 17 00:00:00 2001 From: Vita Tauer Date: Mon, 11 Nov 2024 12:09:19 +0100 Subject: [PATCH 2/2] Fixed linter errors --- src/config.rs | 2 +- src/errors.rs | 2 +- src/pool.rs | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/config.rs b/src/config.rs index 0fca24d6..b9dc3ee1 100644 --- a/src/config.rs +++ b/src/config.rs @@ -773,7 +773,7 @@ pub enum DefaultShard { Shard(usize), Random, RandomHealthy, - Fail + Fail, } impl Default for DefaultShard { fn default() -> Self { diff --git a/src/errors.rs b/src/errors.rs index 8dc93ab3..66a5b521 100644 --- a/src/errors.rs +++ b/src/errors.rs @@ -30,7 +30,7 @@ pub enum Error { QueryRouterError(String), InvalidShardId(usize), PreparedStatementError, - NoShardSelected + NoShardSelected, } #[derive(Clone, PartialEq, Debug)] diff --git a/src/pool.rs b/src/pool.rs index 76e70a77..5f044d80 100644 --- a/src/pool.rs +++ b/src/pool.rs @@ -719,8 +719,8 @@ impl ConnectionPool { .partial_cmp(&a.error_count.load(Ordering::Relaxed)) .unwrap() }); - }, - DefaultShard::Fail => return Err(Error::NoShardSelected) + } + DefaultShard::Fail => return Err(Error::NoShardSelected), }, };