diff --git a/CHANGELOG.md b/CHANGELOG.md index 205ffa2f5..10746e8db 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ This project adheres to [Semantic Versioning](http://semver.org/). - Miscalculation of time used for expiring tokens - @calebmer - Remove bcrypt dependency to fix Windows build - @begriffs - Detect relations event when authenticator does not have rights to intermediate tables - @ruslantalpa +- Ensure db connections released on sigint - @begriffs ### Added - Allow order by computed columns - @diogob diff --git a/postgrest.cabal b/postgrest.cabal index 6ad23dfa6..54ab5b78c 100644 --- a/postgrest.cabal +++ b/postgrest.cabal @@ -61,6 +61,7 @@ executable postgrest , HTTP, http-types , MissingH , Ranged-sets + , unix >= 2.7 && < 3 hs-source-dirs: src other-modules: Paths_postgrest diff --git a/src/PostgREST/Main.hs b/src/PostgREST/Main.hs index 8faec1be8..6636d632b 100644 --- a/src/PostgREST/Main.hs +++ b/src/PostgREST/Main.hs @@ -6,11 +6,13 @@ import PostgREST.Config (AppConfig (..), minimumPgVersion, prettyVersion, readOptions) -import PostgREST.Error (pgErrResponse, PgError) -import PostgREST.Middleware import PostgREST.DbStructure +import PostgREST.Error (PgError, pgErrResponse) +import PostgREST.Middleware -import Control.Monad (unless) +import Control.Concurrent (myThreadId) +import Control.Exception.Base (throwTo, AsyncException(..)) +import Control.Monad (unless, void) import Control.Monad.IO.Class (liftIO) import Data.Aeson (encode) import Data.Functor.Identity @@ -26,6 +28,7 @@ import Network.Wai.Middleware.RequestLogger (logStdout) import System.IO (BufferMode (..), hSetBuffering, stderr, stdin, stdout) +import System.Posix.Signals import Web.JWT (secret) isServerVersionSupported :: H.Session P.Postgres IO Bool @@ -69,6 +72,12 @@ main = do <> show minimumPgVersion) ) supportedOrError + tid <- myThreadId + void $ installHandler keyboardSignal (Catch $ do + H.releasePool pool + throwTo tid UserInterrupt + ) Nothing + let txSettings = Just (H.ReadCommitted, Just True) dbOrError <- H.session pool $ H.tx txSettings $ getDbStructure (cs $ configSchema conf) dbStructure <- either hasqlError return dbOrError