fix excessive memory consumption with bulk queries (#1972)

Use 'Strict' State monad instead of 'Lazy' to avoid unevaluated memory thunks
This commit is contained in:
Rakesh Emmadi
2019-04-09 21:41:06 +05:30
committed by Vamshi Surabhi
parent 6b3e544069
commit 7b5bbb758a
2 changed files with 32 additions and 30 deletions

View File

@@ -5,32 +5,34 @@ module Hasura.Prelude
, onLeft
) where
import Control.Applicative as M ((<|>))
import Control.Monad as M (void, when)
import Control.Monad.Base as M
import Control.Monad.Except as M
import Control.Monad.Fail as M (MonadFail)
import Control.Monad.Identity as M
import Control.Monad.Reader as M
import Control.Monad.State as M
import Data.Bool as M (bool)
import Data.Either as M (lefts, partitionEithers, rights)
import Data.Foldable as M (foldrM, toList)
import Data.Hashable as M (Hashable)
import Data.List as M (find, foldl', group, intercalate,
intersect, lookup, sort, sortBy,
sortOn, union, unionBy, (\\))
import Data.Maybe as M (catMaybes, fromMaybe, isJust,
isNothing, listToMaybe, mapMaybe,
maybeToList)
import Data.Ord as M (comparing)
import Data.Semigroup as M (Semigroup (..))
import Data.String as M (IsString)
import Data.Text as M (Text)
import Data.Word as M (Word64)
import GHC.Generics as M (Generic)
import Prelude as M hiding (fail, init, lookup)
import Text.Read as M (readEither, readMaybe)
import Control.Applicative as M ((<|>))
import Control.Monad as M (void, when)
import Control.Monad.Base as M
import Control.Monad.Except as M
import Control.Monad.Fail as M (MonadFail)
import Control.Monad.Identity as M
import Control.Monad.Reader as M
import Control.Monad.State.Strict as M
import Data.Bool as M (bool)
import Data.Either as M (lefts, partitionEithers,
rights)
import Data.Foldable as M (foldrM, toList)
import Data.Hashable as M (Hashable)
import Data.List as M (find, foldl', group,
intercalate, intersect,
lookup, sort, sortBy, sortOn,
union, unionBy, (\\))
import Data.Maybe as M (catMaybes, fromMaybe, isJust,
isNothing, listToMaybe,
mapMaybe, maybeToList)
import Data.Ord as M (comparing)
import Data.Semigroup as M (Semigroup (..))
import Data.String as M (IsString)
import Data.Text as M (Text)
import Data.Word as M (Word64)
import GHC.Generics as M (Generic)
import Prelude as M hiding (fail, init, lookup)
import Text.Read as M (readEither, readMaybe)
onNothing :: (Monad m) => Maybe a -> m a -> m a
onNothing m act = maybe act return m

View File

@@ -50,10 +50,10 @@ import Hasura.RQL.Types.BoolExp as R
import Hasura.RQL.Types.Common as R
import Hasura.RQL.Types.DML as R
import Hasura.RQL.Types.Error as R
import Hasura.RQL.Types.EventTrigger as R
import Hasura.RQL.Types.Permission as R
import Hasura.RQL.Types.RemoteSchema as R
import Hasura.RQL.Types.SchemaCache as R
import Hasura.RQL.Types.EventTrigger as R
import Hasura.SQL.Types
@@ -165,9 +165,9 @@ instance (MonadTx m) => MonadTx (ReaderT s m) where
liftTx = lift . liftTx
data LazyTx e a
= LTErr e
| LTNoTx a
| LTTx (Q.TxE e a)
= LTErr !e
| LTNoTx !a
| LTTx !(Q.TxE e a)
lazyTxToQTx :: LazyTx e a -> Q.TxE e a
lazyTxToQTx = \case