diff --git a/proxy/src/pglb/connect_compute.rs b/proxy/src/pglb/connect_compute.rs index f6942f500d..cd91ab0cfd 100644 --- a/proxy/src/pglb/connect_compute.rs +++ b/proxy/src/pglb/connect_compute.rs @@ -1,35 +1,14 @@ use async_trait::async_trait; -use tracing::warn; use crate::auth::backend::ComputeUserInfo; use crate::compute::{self, AuthInfo, PostgresConnection}; use crate::config::ComputeConfig; use crate::context::RequestContext; use crate::control_plane::locks::ApiLocks; -use crate::control_plane::{self, CachedNodeInfo, NodeInfo}; +use crate::control_plane::{self, CachedNodeInfo}; use crate::error::ReportableError; -use crate::metrics::{ConnectionFailureKind, Metrics}; use crate::types::Host; -/// If we couldn't connect, a cached connection info might be to blame -/// (e.g. the compute node's address might've changed at the wrong time). -/// Invalidate the cache entry (if any) to prevent subsequent errors. -#[tracing::instrument(name = "invalidate_cache", skip_all)] -pub(crate) fn invalidate_cache(node_info: control_plane::CachedNodeInfo) -> NodeInfo { - let is_cached = node_info.cached(); - if is_cached { - warn!("invalidating stalled compute node info cache entry"); - } - let label = if is_cached { - ConnectionFailureKind::ComputeCached - } else { - ConnectionFailureKind::ComputeUncached - }; - Metrics::get().proxy.connection_failures_total.inc(label); - - node_info.invalidate() -} - #[async_trait] pub(crate) trait ConnectMechanism { type Connection; diff --git a/proxy/src/proxy/mod.rs b/proxy/src/proxy/mod.rs index 5faf0d3426..8e55ce50d2 100644 --- a/proxy/src/proxy/mod.rs +++ b/proxy/src/proxy/mod.rs @@ -22,14 +22,14 @@ use crate::cancellation::{self, CancellationHandler}; use crate::compute::COULD_NOT_CONNECT; use crate::config::{ComputeConfig, ProxyConfig, ProxyProtocolV2, RetryConfig, TlsConfig}; use crate::context::RequestContext; +use crate::control_plane::NodeInfo; use crate::control_plane::errors::WakeComputeError; use crate::error::{ReportableError, UserFacingError}; use crate::metrics::{ - ConnectOutcome, Metrics, NumClientConnectionsGuard, RetriesMetricGroup, RetryType, -}; -use crate::pglb::connect_compute::{ - ComputeConnectBackend, ConnectMechanism, TcpMechanism, invalidate_cache, + ConnectOutcome, ConnectionFailureKind, Metrics, NumClientConnectionsGuard, RetriesMetricGroup, + RetryType, }; +use crate::pglb::connect_compute::{ComputeConnectBackend, ConnectMechanism, TcpMechanism}; pub use crate::pglb::copy_bidirectional::{ErrorSource, copy_bidirectional_client_compute}; use crate::pglb::handshake::{HandshakeData, HandshakeError, handshake}; use crate::pglb::passthrough::ProxyPassthrough; @@ -41,7 +41,7 @@ use crate::rate_limiter::EndpointRateLimiter; use crate::stream::{PqStream, Stream}; use crate::types::EndpointCacheKey; use crate::util::run_until_cancelled; -use crate::{auth, compute}; +use crate::{auth, compute, control_plane}; const ERR_INSECURE_CONNECTION: &str = "connection is insecure (try using `sslmode=require`)"; @@ -405,6 +405,25 @@ pub(crate) async fn handle_client( })) } +/// If we couldn't connect, a cached connection info might be to blame +/// (e.g. the compute node's address might've changed at the wrong time). +/// Invalidate the cache entry (if any) to prevent subsequent errors. +#[tracing::instrument(skip_all)] +pub(crate) fn invalidate_cache(node_info: control_plane::CachedNodeInfo) -> NodeInfo { + let is_cached = node_info.cached(); + if is_cached { + warn!("invalidating stalled compute node info cache entry"); + } + let label = if is_cached { + ConnectionFailureKind::ComputeCached + } else { + ConnectionFailureKind::ComputeUncached + }; + Metrics::get().proxy.connection_failures_total.inc(label); + + node_info.invalidate() +} + /// Try to connect to the compute node, retrying if necessary. #[tracing::instrument(skip_all)] pub(crate) async fn connect_to_compute(