diff --git a/changelog.d/5-internal/polysemy-oom b/changelog.d/5-internal/polysemy-oom new file mode 100644 index 00000000000..82b4530ebc9 --- /dev/null +++ b/changelog.d/5-internal/polysemy-oom @@ -0,0 +1 @@ +Reduce Polysemy-induced high memory requirements diff --git a/nix/haskell-pins.nix b/nix/haskell-pins.nix index ce404aa2326..0082da92620 100644 --- a/nix/haskell-pins.nix +++ b/nix/haskell-pins.nix @@ -203,6 +203,41 @@ let tasty-hunit = "hunit"; }; }; + polysemy = { + src = fetchgit { + url = "https://github.com/polysemy-research/polysemy.git"; + rev = "3855786e58bf397ca8204f3a79d19c24485dabd4"; + sha256 = "sha256-4ans30VWuSMC9HNFb6FWQyc30oxJd2dmFrMGu5/dLg0="; + }; + }; + polysemy-plugin = { + src = fetchgit { + url = "https://github.com/polysemy-research/polysemy.git"; + rev = "3855786e58bf397ca8204f3a79d19c24485dabd4"; + sha256 = "sha256-4ans30VWuSMC9HNFb6FWQyc30oxJd2dmFrMGu5/dLg0="; + }; + packages = { + polysemy-plugin = "polysemy-plugin"; + }; + }; + polysemy-check = { + src = fetchgit { + url = "https://github.com/polysemy-research/polysemy-check.git"; + rev = "4c0d3ff929ae22ae68d962f7f3f7056f357bf7ac"; + sha256 = "sha256-8XeCeJWbkdqrUf6tERFMoGM8xRI5l/nKNqI810kzMs0="; + }; + }; + kind-generics = { + src = fetchgit { + url = "https://gitlab.com/trupill/kind-generics.git"; + rev = "f4ad2bcfacc9c3dcecf64c069d086926465cab2c"; + sha256 = "sha256-uvQMV8aTNyTN+ozrseohexbCneVPMO35Jf1eEhLPk78="; + }; + packages = { + kind-generics = "kind-generics"; + kind-generics-th = "kind-generics-th"; + }; + }; # This can be removed once postie 0.6.0.3 (or later) is in nixpkgs postie = { src = fetchgit { @@ -213,10 +248,6 @@ let }; }; hackagePins = { - kind-generics = { - version = "0.4.1.0"; - sha256 = "sha256-gD9b9AXpLkpPSAeg8oPBU7tsHtSNQjxIZKBo+7+r3+c="; - }; wai-route = { version = "0.4.0"; sha256 = "sha256-DSMckKIeVE/buSMg8Mq+mUm1bYPYB7veA11Ns7vTBbc="; diff --git a/services/brig/src/Brig/Effects/SFT.hs b/services/brig/src/Brig/Effects/SFT.hs index 7672876e4fa..de325e810e2 100644 --- a/services/brig/src/Brig/Effects/SFT.hs +++ b/services/brig/src/Brig/Effects/SFT.hs @@ -37,7 +37,6 @@ import Imports hiding (fromException, intercalate) import Network.HTTP.Client import Polysemy import Polysemy.Error hiding (try) -import Polysemy.Internal import Polysemy.TinyLog import qualified System.Logger as Log import URI.ByteString (uriPath) diff --git a/services/federator/src/Federator/Monitor/Internal.hs b/services/federator/src/Federator/Monitor/Internal.hs index 4fd0faef579..4d38328bdc0 100644 --- a/services/federator/src/Federator/Monitor/Internal.hs +++ b/services/federator/src/Federator/Monitor/Internal.hs @@ -35,6 +35,7 @@ import qualified Network.TLS as TLS import Polysemy (Embed, Member, Members, Sem, embed) import qualified Polysemy import qualified Polysemy.Error as Polysemy +import Polysemy.Final (Final) import qualified Polysemy.Resource as Polysemy import Polysemy.TinyLog (TinyLog) import qualified Polysemy.TinyLog as Log @@ -103,8 +104,8 @@ watchPathEvents (WatchedDir _ _) = [MoveIn, Create] -- directory watches as they get deleted and recreated. type Watches = Map RawFilePath (WatchDescriptor, WatchedPath) -runSemDefault :: Logger -> Sem '[TinyLog, Embed IO] a -> IO a -runSemDefault logger = Polysemy.runM . Log.loggerToTinyLog logger +runSemDefault :: Logger -> Sem '[TinyLog, Embed IO, Final IO] a -> IO a +runSemDefault logger = Polysemy.runFinal . Polysemy.embedToFinal . Log.loggerToTinyLog logger logErrors :: Members '[TinyLog, Polysemy.Error FederationSetupError] r => @@ -123,10 +124,10 @@ logAndIgnoreErrors :: logAndIgnoreErrors = void . Polysemy.runError . logErrors delMonitor :: - (Members '[TinyLog, Embed IO] r) => + (Members '[TinyLog, Embed IO, Final IO] r) => Monitor -> Sem r () -delMonitor monitor = Polysemy.resourceToIO +delMonitor monitor = Polysemy.resourceToIOFinal $ Polysemy.bracket (takeMVar (monLock monitor)) (putMVar (monLock monitor)) diff --git a/services/federator/test/unit/Test/Federator/Monitor.hs b/services/federator/test/unit/Test/Federator/Monitor.hs index dcb28815387..e448f62f2ef 100644 --- a/services/federator/test/unit/Test/Federator/Monitor.hs +++ b/services/federator/test/unit/Test/Federator/Monitor.hs @@ -125,7 +125,7 @@ withSilentMonitor reloads settings = do (runSem . delMonitor) pure tlsVar where - runSem = Polysemy.runM . Log.discardTinyLogs + runSem = Polysemy.runFinal . Polysemy.embedToFinal @IO . Log.discardTinyLogs runSemE action = do r <- runSem (Polysemy.runError @FederationSetupError action) writeChan reloads (either Just (const Nothing) r) diff --git a/services/galley/src/Galley/API/Message.hs b/services/galley/src/Galley/API/Message.hs index ffe54121b35..94d6809ce57 100644 --- a/services/galley/src/Galley/API/Message.hs +++ b/services/galley/src/Galley/API/Message.hs @@ -65,7 +65,7 @@ import Galley.Options import qualified Galley.Types.Clients as Clients import Galley.Types.Conversations.Members import Imports hiding (forkIO) -import Polysemy +import Polysemy hiding (send) import Polysemy.Error import Polysemy.Input import qualified Polysemy.TinyLog as P