From d6816d8d2a4f9c7d87670d9ec3bd77c9b0796eaf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20K=C5=82eczek?= Date: Sun, 15 Feb 2026 07:21:33 +0100 Subject: [PATCH] refactor: Remove unnecessary SQL.UsageError parameter from PoolAcqTimeoutObs PoolAcqTimeoutObs is always created with SQL.AcquisitionTimeoutUsageError so the parameter does not provide any useful information. On the other hand, it complicates debouncing logic in Logger as logWithDebounce has to lazily create the debouncer (which is error prone and hence the logic has a race condition). This change removes the parameter from PoolAcqTimeoutObs. It is a prerequisite to simplifying logWithDebounce. --- src/PostgREST/AppState.hs | 2 +- src/PostgREST/Logger.hs | 2 +- src/PostgREST/Metrics.hs | 2 +- src/PostgREST/Observation.hs | 5 ++--- 4 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/PostgREST/AppState.hs b/src/PostgREST/AppState.hs index ed2eef3fc..7841d3080 100644 --- a/src/PostgREST/AppState.hs +++ b/src/PostgREST/AppState.hs @@ -222,7 +222,7 @@ usePool AppState{stateObserver=observer, stateMainThreadId=mainThreadId, ..} ses whenLeft res (\case SQL.AcquisitionTimeoutUsageError -> - observer $ PoolAcqTimeoutObs SQL.AcquisitionTimeoutUsageError + observer PoolAcqTimeoutObs err@(SQL.ConnectionUsageError e) -> let failureMessage = BS.unpack $ fromMaybe mempty e in when (("FATAL: password authentication failed" `isInfixOf` failureMessage) || ("no password supplied" `isInfixOf` failureMessage)) $ do diff --git a/src/PostgREST/Logger.hs b/src/PostgREST/Logger.hs index 8f6150985..2c5cd6e52 100644 --- a/src/PostgREST/Logger.hs +++ b/src/PostgREST/Logger.hs @@ -88,7 +88,7 @@ shouldLogResponse logLevel = case logLevel of -- All observations are logged except some that depend on the log-level observationLogger :: LoggerState -> LogLevel -> ObservationHandler observationLogger loggerState logLevel obs = case obs of - o@(PoolAcqTimeoutObs _) -> do + o@PoolAcqTimeoutObs -> do when (logLevel >= LogError) $ do logWithDebounce loggerState $ logWithZTime loggerState $ observationMessage o diff --git a/src/PostgREST/Metrics.hs b/src/PostgREST/Metrics.hs index 7a3955775..89378dfd6 100644 --- a/src/PostgREST/Metrics.hs +++ b/src/PostgREST/Metrics.hs @@ -50,7 +50,7 @@ init configDbPoolSize = do -- Only some observations are used as metrics observationMetrics :: MetricsState -> ObservationHandler observationMetrics MetricsState{..} obs = case obs of - (PoolAcqTimeoutObs _) -> do + PoolAcqTimeoutObs -> do incCounter poolTimeouts (HasqlPoolObs (SQL.ConnectionObservation _ status)) -> case status of SQL.ReadyForUseConnectionStatus -> do diff --git a/src/PostgREST/Observation.hs b/src/PostgREST/Observation.hs index 84f39fe8b..0878671c3 100644 --- a/src/PostgREST/Observation.hs +++ b/src/PostgREST/Observation.hs @@ -59,7 +59,7 @@ data Observation | QueryErrorCodeHighObs SQL.UsageError | QueryPgVersionError SQL.UsageError | PoolInit Int - | PoolAcqTimeoutObs SQL.UsageError + | PoolAcqTimeoutObs | HasqlPoolObs SQL.Observation | PoolRequest | PoolRequestFullfilled @@ -140,8 +140,7 @@ observationMessage = \case "Config reloaded" PoolInit poolSize -> "Connection Pool initialized with a maximum size of " <> show poolSize <> " connections" - PoolAcqTimeoutObs usageErr -> - jsonMessage usageErr + PoolAcqTimeoutObs -> jsonMessage SQL.AcquisitionTimeoutUsageError HasqlPoolObs (SQL.ConnectionObservation uuid status) -> "Connection " <> show uuid <> ( case status of