Compare commits

..

1 Commits

Author SHA1 Message Date
dependabot[bot]
1e841eba60 chore(deps): bump h2 from 0.3.20 to 0.3.26
Bumps [h2](https://github.com/hyperium/h2) from 0.3.20 to 0.3.26.
- [Release notes](https://github.com/hyperium/h2/releases)
- [Changelog](https://github.com/hyperium/h2/blob/v0.3.26/CHANGELOG.md)
- [Commits](https://github.com/hyperium/h2/compare/v0.3.20...v0.3.26)

---
updated-dependencies:
- dependency-name: h2
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-04-05 16:03:27 +00:00
14 changed files with 55 additions and 132 deletions

38
Cargo.lock generated
View File

@@ -542,9 +542,9 @@ checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e"
[[package]] [[package]]
name = "h2" name = "h2"
version = "0.3.20" version = "0.3.26"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "97ec8491ebaf99c8eaa73058b045fe58073cd6be7f596ac993ced0b0a0c01049" checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8"
dependencies = [ dependencies = [
"bytes", "bytes",
"fnv", "fnv",
@@ -552,19 +552,13 @@ dependencies = [
"futures-sink", "futures-sink",
"futures-util", "futures-util",
"http", "http",
"indexmap 1.9.3", "indexmap",
"slab", "slab",
"tokio", "tokio",
"tokio-util", "tokio-util",
"tracing", "tracing",
] ]
[[package]]
name = "hashbrown"
version = "0.12.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
[[package]] [[package]]
name = "hashbrown" name = "hashbrown"
version = "0.14.0" version = "0.14.0"
@@ -709,16 +703,6 @@ dependencies = [
"unicode-normalization", "unicode-normalization",
] ]
[[package]]
name = "indexmap"
version = "1.9.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99"
dependencies = [
"autocfg",
"hashbrown 0.12.3",
]
[[package]] [[package]]
name = "indexmap" name = "indexmap"
version = "2.0.0" version = "2.0.0"
@@ -726,7 +710,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d" checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d"
dependencies = [ dependencies = [
"equivalent", "equivalent",
"hashbrown 0.14.0", "hashbrown",
] ]
[[package]] [[package]]
@@ -848,7 +832,7 @@ version = "0.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1efa59af2ddfad1854ae27d75009d538d0998b4b2fd47083e743ac1a10e46c60" checksum = "1efa59af2ddfad1854ae27d75009d538d0998b4b2fd47083e743ac1a10e46c60"
dependencies = [ dependencies = [
"hashbrown 0.14.0", "hashbrown",
] ]
[[package]] [[package]]
@@ -1510,9 +1494,9 @@ checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d"
[[package]] [[package]]
name = "sqlparser" name = "sqlparser"
version = "0.41.0" version = "0.34.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5cc2c25a6c66789625ef164b4c7d2e548d627902280c13710d33da8222169964" checksum = "37d3706eefb17039056234df6b566b0014f303f867f2656108334a55b8096f59"
dependencies = [ dependencies = [
"log", "log",
"sqlparser_derive", "sqlparser_derive",
@@ -1520,13 +1504,13 @@ dependencies = [
[[package]] [[package]]
name = "sqlparser_derive" name = "sqlparser_derive"
version = "0.2.2" version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "01b2e185515564f15375f593fb966b5718bc624ba77fe49fa4616ad619690554" checksum = "55fe75cb4a364c7f7ae06c7dbbc8d84bddd85d6cdf9975963c3935bc1991761e"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.26", "syn 1.0.109",
] ]
[[package]] [[package]]
@@ -1741,7 +1725,7 @@ version = "0.19.14"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f8123f27e969974a3dfba720fdb560be359f57b44302d280ba72e76a74480e8a" checksum = "f8123f27e969974a3dfba720fdb560be359f57b44302d280ba72e76a74480e8a"
dependencies = [ dependencies = [
"indexmap 2.0.0", "indexmap",
"serde", "serde",
"serde_spanned", "serde_spanned",
"toml_datetime", "toml_datetime",

View File

@@ -19,7 +19,7 @@ serde_derive = "1"
regex = "1" regex = "1"
num_cpus = "1" num_cpus = "1"
once_cell = "1" once_cell = "1"
sqlparser = { version = "0.41", features = ["visitor"] } sqlparser = {version = "0.34", features = ["visitor"] }
log = "0.4" log = "0.4"
arc-swap = "1" arc-swap = "1"
parking_lot = "0.12.1" parking_lot = "0.12.1"
@@ -47,12 +47,9 @@ serde_json = "1"
itertools = "0.10" itertools = "0.10"
clap = { version = "4.3.1", features = ["derive", "env"] } clap = { version = "4.3.1", features = ["derive", "env"] }
tracing = "0.1.37" tracing = "0.1.37"
tracing-subscriber = { version = "0.3.17", features = [ tracing-subscriber = { version = "0.3.17", features = ["json", "env-filter", "std"]}
"json",
"env-filter",
"std",
] }
lru = "0.12.0" lru = "0.12.0"
[target.'cfg(not(target_env = "msvc"))'.dependencies] [target.'cfg(not(target_env = "msvc"))'.dependencies]
jemallocator = "0.5.0" jemallocator = "0.5.0"

View File

@@ -1,4 +1,4 @@
FROM rust:1.79.0-slim-bookworm AS builder FROM rust:1-slim-bookworm AS builder
RUN apt-get update && \ RUN apt-get update && \
apt-get install -y build-essential apt-get install -y build-essential
@@ -19,4 +19,3 @@ COPY --from=builder /app/pgcat.toml /etc/pgcat/pgcat.toml
WORKDIR /etc/pgcat WORKDIR /etc/pgcat
ENV RUST_LOG=info ENV RUST_LOG=info
CMD ["pgcat"] CMD ["pgcat"]
STOPSIGNAL SIGINT

View File

@@ -1,4 +1,4 @@
FROM rust:bullseye FROM rust:1.70-bullseye
# Dependencies # Dependencies
COPY --from=sclevine/yj /bin/yj /bin/yj COPY --from=sclevine/yj /bin/yj /bin/yj

View File

@@ -11,7 +11,6 @@ RestartSec=1
Environment=RUST_LOG=info Environment=RUST_LOG=info
LimitNOFILE=65536 LimitNOFILE=65536
ExecStart=/usr/bin/pgcat /etc/pgcat.toml ExecStart=/usr/bin/pgcat /etc/pgcat.toml
ExecReload=/bin/kill -SIGHUP $MAINPID
[Install] [Install]
WantedBy=multi-user.target WantedBy=multi-user.target

View File

@@ -1204,12 +1204,9 @@ where
if !server.in_transaction() { if !server.in_transaction() {
// Report transaction executed statistics. // Report transaction executed statistics.
self.stats.transaction(); self.stats.transaction();
server.stats().transaction( server
Instant::now() .stats()
.duration_since(server.transaction_start().into()) .transaction(self.server_parameters.get_application_name());
.as_millis() as u64,
self.server_parameters.get_application_name(),
);
// Release server back to the pool if we are in transaction mode. // Release server back to the pool if we are in transaction mode.
// If we are in session mode, we keep the server until the client disconnects. // If we are in session mode, we keep the server until the client disconnects.
@@ -1463,12 +1460,9 @@ where
if !server.in_transaction() { if !server.in_transaction() {
self.stats.transaction(); self.stats.transaction();
server.stats().transaction( server
Instant::now() .stats()
.duration_since(server.transaction_start().into()) .transaction(self.server_parameters.get_application_name());
.as_millis() as u64,
self.server_parameters.get_application_name(),
);
// Release server back to the pool if we are in transaction mode. // Release server back to the pool if we are in transaction mode.
// If we are in session mode, we keep the server until the client disconnects. // If we are in session mode, we keep the server until the client disconnects.
@@ -1517,12 +1511,9 @@ where
if !server.in_transaction() { if !server.in_transaction() {
self.stats.transaction(); self.stats.transaction();
server.stats().transaction( server
Instant::now() .stats()
.duration_since(server.transaction_start().into()) .transaction(self.server_parameters.get_application_name());
.as_millis() as u64,
self.server_parameters.get_application_name(),
);
// Release server back to the pool if we are in transaction mode. // Release server back to the pool if we are in transaction mode.
// If we are in session mode, we keep the server until the client disconnects. // If we are in session mode, we keep the server until the client disconnects.

View File

@@ -38,12 +38,12 @@ pub enum Role {
Mirror, Mirror,
} }
impl std::fmt::Display for Role { impl ToString for Role {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { fn to_string(&self) -> String {
match self { match *self {
Role::Primary => write!(f, "primary"), Role::Primary => "primary".to_string(),
Role::Replica => write!(f, "replica"), Role::Replica => "replica".to_string(),
Role::Mirror => write!(f, "mirror"), Role::Mirror => "mirror".to_string(),
} }
} }
} }
@@ -476,11 +476,11 @@ pub enum PoolMode {
Session, Session,
} }
impl std::fmt::Display for PoolMode { impl ToString for PoolMode {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { fn to_string(&self) -> String {
match self { match *self {
PoolMode::Transaction => write!(f, "transaction"), PoolMode::Transaction => "transaction".to_string(),
PoolMode::Session => write!(f, "session"), PoolMode::Session => "session".to_string(),
} }
} }
} }
@@ -493,13 +493,12 @@ pub enum LoadBalancingMode {
#[serde(alias = "loc", alias = "LOC", alias = "least_outstanding_connections")] #[serde(alias = "loc", alias = "LOC", alias = "least_outstanding_connections")]
LeastOutstandingConnections, LeastOutstandingConnections,
} }
impl ToString for LoadBalancingMode {
impl std::fmt::Display for LoadBalancingMode { fn to_string(&self) -> String {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match *self {
match self { LoadBalancingMode::Random => "random".to_string(),
LoadBalancingMode::Random => write!(f, "random"),
LoadBalancingMode::LeastOutstandingConnections => { LoadBalancingMode::LeastOutstandingConnections => {
write!(f, "least_outstanding_connections") "least_outstanding_connections".to_string()
} }
} }
} }
@@ -1000,17 +999,15 @@ impl Config {
pub fn fill_up_auth_query_config(&mut self) { pub fn fill_up_auth_query_config(&mut self) {
for (_name, pool) in self.pools.iter_mut() { for (_name, pool) in self.pools.iter_mut() {
if pool.auth_query.is_none() { if pool.auth_query.is_none() {
pool.auth_query.clone_from(&self.general.auth_query); pool.auth_query = self.general.auth_query.clone();
} }
if pool.auth_query_user.is_none() { if pool.auth_query_user.is_none() {
pool.auth_query_user pool.auth_query_user = self.general.auth_query_user.clone();
.clone_from(&self.general.auth_query_user);
} }
if pool.auth_query_password.is_none() { if pool.auth_query_password.is_none() {
pool.auth_query_password pool.auth_query_password = self.general.auth_query_password.clone();
.clone_from(&self.general.auth_query_password);
} }
} }
} }
@@ -1158,7 +1155,7 @@ impl Config {
"Default max server lifetime: {}ms", "Default max server lifetime: {}ms",
self.general.server_lifetime self.general.server_lifetime
); );
info!("Server round robin: {}", self.general.server_round_robin); info!("Sever round robin: {}", self.general.server_round_robin);
match self.general.tls_certificate.clone() { match self.general.tls_certificate.clone() {
Some(tls_certificate) => { Some(tls_certificate) => {
info!("TLS certificate: {}", tls_certificate); info!("TLS certificate: {}", tls_certificate);

View File

@@ -733,10 +733,6 @@ pub fn configure_socket(stream: &TcpStream) {
} }
Err(err) => error!("Could not configure socket: {}", err), Err(err) => error!("Could not configure socket: {}", err),
} }
match sock_ref.set_nodelay(true) {
Ok(_) => (),
Err(err) => error!("Could not configure TCP_NODELAY for socket: {}", err),
}
} }
pub trait BytesMutReader { pub trait BytesMutReader {

View File

@@ -813,7 +813,7 @@ impl ConnectionPool {
} }
} }
client_stats.checkout_error(); client_stats.checkout_success();
Err(Error::AllServersDown) Err(Error::AllServersDown)
} }

View File

@@ -499,7 +499,6 @@ impl QueryRouter {
table: _, table: _,
on: _, on: _,
returning: _, returning: _,
ignore: _,
} => { } => {
// Not supported in postgres. // Not supported in postgres.
assert!(or.is_none()); assert!(or.is_none());
@@ -507,9 +506,7 @@ impl QueryRouter {
assert!(after_columns.is_empty()); assert!(after_columns.is_empty());
Self::process_table(table_name, &mut table_names); Self::process_table(table_name, &mut table_names);
if let Some(source) = source { Self::process_query(source, &mut exprs, &mut table_names, &Some(columns));
Self::process_query(source, &mut exprs, &mut table_names, &Some(columns));
}
} }
Delete { Delete {
tables, tables,
@@ -517,8 +514,6 @@ impl QueryRouter {
using, using,
selection, selection,
returning: _, returning: _,
order_by: _,
limit: _,
} => { } => {
if let Some(expr) = selection { if let Some(expr) = selection {
exprs.push(expr.clone()); exprs.push(expr.clone());

View File

@@ -15,7 +15,6 @@ use std::sync::Arc;
use std::time::SystemTime; use std::time::SystemTime;
use tokio::io::{AsyncRead, AsyncReadExt, AsyncWrite, BufStream}; use tokio::io::{AsyncRead, AsyncReadExt, AsyncWrite, BufStream};
use tokio::net::TcpStream; use tokio::net::TcpStream;
use tokio::time::Instant;
use tokio_rustls::rustls::{OwnedTrustAnchor, RootCertStore}; use tokio_rustls::rustls::{OwnedTrustAnchor, RootCertStore};
use tokio_rustls::{client::TlsStream, TlsConnector}; use tokio_rustls::{client::TlsStream, TlsConnector};
@@ -286,9 +285,6 @@ pub struct Server {
/// Is the server inside a transaction or idle. /// Is the server inside a transaction or idle.
in_transaction: bool, in_transaction: bool,
/// The time the most recent transaction started.
transaction_start: Instant,
/// Is there more data for the client to read. /// Is there more data for the client to read.
data_available: bool, data_available: bool,
@@ -808,7 +804,6 @@ impl Server {
process_id, process_id,
secret_key, secret_key,
in_transaction: false, in_transaction: false,
transaction_start: Instant::now(),
in_copy_mode: false, in_copy_mode: false,
data_available: false, data_available: false,
bad: false, bad: false,
@@ -941,7 +936,6 @@ impl Server {
// In transaction. // In transaction.
'T' => { 'T' => {
self.in_transaction = true; self.in_transaction = true;
self.transaction_start = Instant::now();
} }
// Idle, transaction over. // Idle, transaction over.
@@ -1226,12 +1220,6 @@ impl Server {
self.in_transaction self.in_transaction
} }
/// The start time of the most recent transaction.
/// Will be stale if not in a transaction.
pub fn transaction_start(&self) -> Instant {
self.transaction_start
}
/// Currently copying data from client to server or vice-versa. /// Currently copying data from client to server or vice-versa.
pub fn in_copy_mode(&self) -> bool { pub fn in_copy_mode(&self) -> bool {
self.in_copy_mode self.in_copy_mode

View File

@@ -14,11 +14,11 @@ pub enum ShardingFunction {
Sha1, Sha1,
} }
impl std::fmt::Display for ShardingFunction { impl ToString for ShardingFunction {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { fn to_string(&self) -> String {
match self { match *self {
ShardingFunction::PgBigintHash => write!(f, "pg_bigint_hash"), ShardingFunction::PgBigintHash => "pg_bigint_hash".to_string(),
ShardingFunction::Sha1 => write!(f, "sha1"), ShardingFunction::Sha1 => "sha1".to_string(),
} }
} }
} }

View File

@@ -187,12 +187,11 @@ impl ServerStats {
/// we report each individual queries outside a transaction as a transaction /// we report each individual queries outside a transaction as a transaction
/// We only count the initial BEGIN as a transaction, all queries within do not /// We only count the initial BEGIN as a transaction, all queries within do not
/// count as transactions /// count as transactions
pub fn transaction(&self, milliseconds: u64, application_name: &str) { pub fn transaction(&self, application_name: &str) {
self.set_application(application_name.to_string()); self.set_application(application_name.to_string());
self.transaction_count.fetch_add(1, Ordering::Relaxed); self.transaction_count.fetch_add(1, Ordering::Relaxed);
self.address.stats.xact_count_add(); self.address.stats.xact_count_add();
self.address.stats.xact_time_add(milliseconds);
} }
/// Report data sent to a server /// Report data sent to a server

View File

@@ -16,7 +16,7 @@ describe "Stats" do
it "updates *_query_time and *_wait_time" do it "updates *_query_time and *_wait_time" do
connections = Array.new(3) { PG::connect("#{pgcat_conn_str}?application_name=one_query") } connections = Array.new(3) { PG::connect("#{pgcat_conn_str}?application_name=one_query") }
connections.each do |c| connections.each do |c|
Thread.new { c.async_exec("BEGIN; SELECT pg_sleep(0.25); COMMIT;") } Thread.new { c.async_exec("SELECT pg_sleep(0.25)") }
end end
sleep(1) sleep(1)
connections.map(&:close) connections.map(&:close)
@@ -25,32 +25,10 @@ describe "Stats" do
sleep(15.5) sleep(15.5)
admin_conn = PG::connect(processes.pgcat.admin_connection_string) admin_conn = PG::connect(processes.pgcat.admin_connection_string)
results = admin_conn.async_exec("SHOW STATS")[0] results = admin_conn.async_exec("SHOW STATS")[0]
admin_conn.close
expect(results["total_query_time"].to_i).to be_within(200).of(750) expect(results["total_query_time"].to_i).to be_within(200).of(750)
expect(results["avg_query_time"].to_i).to be_within(50).of(250) expect(results["avg_query_time"].to_i).to be_within(50).of(250)
expect(results["total_xact_time"].to_i).to be_within(200).of(750)
expect(results["avg_xact_time"].to_i).to be_within(50).of(250)
expect(results["total_wait_time"].to_i).to_not eq(0)
expect(results["avg_wait_time"].to_i).to_not eq(0)
connections = Array.new(3) { PG::connect("#{pgcat_conn_str}?application_name=one_query") }
connections.each do |c|
Thread.new { c.async_exec("SELECT pg_sleep(0.25);") }
end
sleep(1)
connections.map(&:close)
results = admin_conn.async_exec("SHOW STATS")[0]
admin_conn.close
# This should increase with more queries
expect(results["total_query_time"].to_i).to be_within(400).of(1500)
expect(results["avg_query_time"].to_i).to be_within(50).of(250)
# This should not increase as we did not run any additional transactions
expect(results["total_xact_time"].to_i).to be_within(200).of(750)
expect(results["avg_xact_time"].to_i).to be_within(50).of(250)
expect(results["total_wait_time"].to_i).to_not eq(0) expect(results["total_wait_time"].to_i).to_not eq(0)
expect(results["avg_wait_time"].to_i).to_not eq(0) expect(results["avg_wait_time"].to_i).to_not eq(0)
end end