From ae6576856928a979c4d95310b2ad30e45f9b4dd4 Mon Sep 17 00:00:00 2001 From: Taimoor Zaeem Date: Mon, 29 Jun 2026 22:29:59 +0500 Subject: [PATCH] fix(admin): log admin server exceptions and close admin socket Admin server was crashing silently and requests hang indefinitely. With this fix, we are now logging the admin server exceptions and also close the socket afterwards so admin request don't hang. Signed-off-by: Taimoor Zaeem --- CHANGELOG.md | 4 ++++ src/PostgREST/Admin.hs | 16 +++++++++++++--- src/PostgREST/Logger.hs | 2 ++ src/PostgREST/Observation.hs | 1 + 4 files changed, 20 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a0f86cecd..4498090c5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,10 @@ All notable changes to this project will be documented in this file. From versio ## Unreleased +### Fixed + +- Fix admin server not logging cause of failure by @taimoorzaeem in #5012 + ## [14.13] - 2026-06-04 ### Fixed diff --git a/src/PostgREST/Admin.hs b/src/PostgREST/Admin.hs index 99733a699..429983e38 100644 --- a/src/PostgREST/Admin.hs +++ b/src/PostgREST/Admin.hs @@ -11,7 +11,8 @@ import Control.Monad.Extra (whenJust) import Network.Socket hiding (addrFamily) import Network.Socket.ByteString -import PostgREST.AppState (AppState) +import PostgREST.AppState (AppState, getConfig) +import PostgREST.Config (AppConfig (..)) import PostgREST.MediaType (MediaType (..), toContentType) import PostgREST.Metrics (metricsToText) import PostgREST.Network (resolveSocketToAddress) @@ -24,13 +25,22 @@ import Protolude runAdmin :: AppState -> Maybe NS.Socket -> NS.Socket -> Warp.Settings -> IO () runAdmin appState maybeAdminSocket socketREST settings = do + conf <- getConfig appState whenJust maybeAdminSocket $ \adminSocket -> do address <- resolveSocketToAddress adminSocket - observer $ AdminStartObs address - void . forkIO $ Warp.runSettingsSocket settings adminSocket adminApp + void . forkIO $ handle (onError adminSocket) $ + Warp.runSettingsSocket (adminServerSettings conf address) adminSocket adminApp where adminApp = admin appState socketREST observer = AppState.getObserver appState + adminServerSettings config addr = + settings + & Warp.setBeforeMainLoop (observer $ AdminStartObs addr) + & maybe identity Warp.setPort (configAdminServerPort config) + + onError adminSock ex = do + observer $ AdminServerCrashedObs ex + NS.close adminSock -- we close the socket so request doesn't hang -- | PostgREST admin application admin :: AppState.AppState -> NS.Socket -> Wai.Application diff --git a/src/PostgREST/Logger.hs b/src/PostgREST/Logger.hs index 39d04e9a0..4c6f0aafc 100644 --- a/src/PostgREST/Logger.hs +++ b/src/PostgREST/Logger.hs @@ -160,6 +160,8 @@ observationMessage :: Observation -> Text observationMessage = \case AdminStartObs address -> "Admin server listening on " <> address + AdminServerCrashedObs ex -> + "FAILURE: Admin server crashed unexpectedly: " <> (showOnSingleLine '\t' . show) ex AppStartObs ver -> "Starting PostgREST " <> T.decodeUtf8 ver <> "..." AppServerAddressObs address -> diff --git a/src/PostgREST/Observation.hs b/src/PostgREST/Observation.hs index 1bf6c0e61..e04e8f065 100644 --- a/src/PostgREST/Observation.hs +++ b/src/PostgREST/Observation.hs @@ -23,6 +23,7 @@ import Protolude hiding (toList) data Observation = AdminStartObs Text + | AdminServerCrashedObs SomeException | AppStartObs ByteString | AppServerAddressObs Text | ExitUnsupportedPgVersion PgVersion PgVersion