From 85c8828c0d5b2928166cfb55fed4d58cae57ea5e Mon Sep 17 00:00:00 2001 From: Taimoor Zaeem Date: Tue, 21 Jul 2026 20:37:32 +0500 Subject: [PATCH] fix: kill postgrest main thread on admin server crash Fixes #5096. Signed-off-by: Taimoor Zaeem --- CHANGELOG.md | 4 ++++ src/PostgREST/Admin.hs | 8 ++++---- src/PostgREST/Logger.hs | 2 +- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a2141e26e..08644751b 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 crashing without a way to recover by @taimoorzaeem in #5096 + ## [14.15] - 2026-07-13 ### Fixed diff --git a/src/PostgREST/Admin.hs b/src/PostgREST/Admin.hs index 429983e38..6edbaf9e4 100644 --- a/src/PostgREST/Admin.hs +++ b/src/PostgREST/Admin.hs @@ -11,7 +11,7 @@ import Control.Monad.Extra (whenJust) import Network.Socket hiding (addrFamily) import Network.Socket.ByteString -import PostgREST.AppState (AppState, getConfig) +import PostgREST.AppState (AppState, getConfig, getMainThreadId) import PostgREST.Config (AppConfig (..)) import PostgREST.MediaType (MediaType (..), toContentType) import PostgREST.Metrics (metricsToText) @@ -28,7 +28,7 @@ runAdmin appState maybeAdminSocket socketREST settings = do conf <- getConfig appState whenJust maybeAdminSocket $ \adminSocket -> do address <- resolveSocketToAddress adminSocket - void . forkIO $ handle (onError adminSocket) $ + void . forkIO $ handle onError $ Warp.runSettingsSocket (adminServerSettings conf address) adminSocket adminApp where adminApp = admin appState socketREST @@ -38,9 +38,9 @@ runAdmin appState maybeAdminSocket socketREST settings = do & Warp.setBeforeMainLoop (observer $ AdminStartObs addr) & maybe identity Warp.setPort (configAdminServerPort config) - onError adminSock ex = do + onError ex = do observer $ AdminServerCrashedObs ex - NS.close adminSock -- we close the socket so request doesn't hang + killThread (getMainThreadId appState) -- Admin server crash is deemed unrecoverable, so we kill postgrest -- | PostgREST admin application admin :: AppState.AppState -> NS.Socket -> Wai.Application diff --git a/src/PostgREST/Logger.hs b/src/PostgREST/Logger.hs index 4c6f0aafc..af287ac4c 100644 --- a/src/PostgREST/Logger.hs +++ b/src/PostgREST/Logger.hs @@ -161,7 +161,7 @@ observationMessage = \case AdminStartObs address -> "Admin server listening on " <> address AdminServerCrashedObs ex -> - "FAILURE: Admin server crashed unexpectedly: " <> (showOnSingleLine '\t' . show) ex + "Admin server crashed unexpectedly: " <> (showOnSingleLine '\t' . show) ex AppStartObs ver -> "Starting PostgREST " <> T.decodeUtf8 ver <> "..." AppServerAddressObs address ->