Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 11 additions & 4 deletions server/src-lib/Hasura/App.hs
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ import Hasura.GraphQL.Transport.HTTP.Protocol (toParsed)
import Hasura.Logging
import Hasura.Prelude
import Hasura.RQL.DDL.Schema.Cache
import Hasura.RQL.DDL.Schema.Source
import Hasura.RQL.Types
import Hasura.RQL.Types.Run
import Hasura.Server.API.Query
Expand Down Expand Up @@ -228,7 +229,7 @@ initialiseCtx env (HGEOptionsG rci metadataDbUrl hgeCmd) = do
migrateCatalogSchema logger pgLogger env connParams rci metadataDbUrl

schemaCacheE <- runExceptT
$ peelMetadataRun (RunCtx adminUserInfo httpManager sqlGenCtx) metadata
$ peelMetadataRun (RunCtx adminUserInfo httpManager sqlGenCtx {- TODO: -} defaultResolveCustomSource) metadata
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Here, we initialize and build the RebuildableSchemaCache for the OSS server. No other customization exist (via type classes). We can use default here for OSS.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Isn't this also where we build the cache for Pro then? So wouldn't we need to add the type class here?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Or do you mean it's just the connection used to read the Postgres metadata? I guess what I'm asking is - will the ResolvedSources be stored in the schema cache?

Copy link
Owner

@rakeshkky rakeshkky Oct 29, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Isn't this also where we build the cache for Pro then?

I'm not sure about this. If yes, then we should add the type class here too.

$ buildRebuildableSchemaCache env

schemaCache <- fmap fst $ onLeft schemaCacheE $ \err -> do
Expand Down Expand Up @@ -326,6 +327,7 @@ runHGEServer
, Tracing.HasReporter m
, MonadQueryInstrumentation m
, MonadMetadataStorage m
, HasResolveCustomSource m
)
=> Env.Environment
-> ServeOptions impl
Expand Down Expand Up @@ -357,6 +359,8 @@ runHGEServer env ServeOptions{..} InitCtx{..} _ initTime
Loggers loggerCtx logger _ = _icLoggers
SchemaSyncCtx schemaSyncListenerThread schemaSyncEventRef = schemaSyncCtx

srcResolver <- askResolveCustomSource

authModeRes <- runExceptT $ setupAuthMode soAdminSecret soAuthHook soJwtSecret soUnAuthRole
_icHttpManager logger

Expand Down Expand Up @@ -393,7 +397,7 @@ runHGEServer env ServeOptions{..} InitCtx{..} _ initTime

-- start background thread for schema sync event processing
schemaSyncProcessorThread <-
startSchemaSyncProcessorThread sqlGenCtx
startSchemaSyncProcessorThread sqlGenCtx srcResolver
logger _icHttpManager schemaSyncEventRef cacheRef _icInstanceId

let
Expand Down Expand Up @@ -631,7 +635,7 @@ runAsAdmin
-> m (Either QErr a)
runAsAdmin sqlGenCtx httpManager metadata m =
fmap (fmap fst) $ runExceptT $
peelMetadataRun (RunCtx adminUserInfo httpManager sqlGenCtx) metadata m
peelMetadataRun (RunCtx adminUserInfo httpManager sqlGenCtx {- TODO: -} defaultResolveCustomSource) metadata m
Copy link
Owner

@rakeshkky rakeshkky Oct 28, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Here too we can use the default one.


execQuery
:: ( HasVersion
Expand All @@ -646,7 +650,7 @@ execQuery env httpManager metadata queryBs = runExceptT do
QueryWithSource source query <- case A.decode queryBs of
Just jVal -> decodeValue jVal
Nothing -> throw400 InvalidJSON "invalid json"
let runCtx = RunCtx adminUserInfo httpManager (SQLGenCtx False)
let runCtx = RunCtx adminUserInfo httpManager (SQLGenCtx False) {- TODO: -} defaultResolveCustomSource
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Here too we can use the default one.

actionM = do
buildSchemaCacheStrict noMetadataModify
encJToLBS <$> runQueryM env source query
Expand All @@ -667,6 +671,9 @@ execQuery env httpManager metadata queryBs = runExceptT do

instance Tracing.HasReporter ServerAppM

instance HasResolveCustomSource ServerAppM where
askResolveCustomSource = pure defaultResolveCustomSource

instance MonadQueryInstrumentation ServerAppM where
askInstrumentQuery _ = pure (id, noProfile)

Expand Down
5 changes: 3 additions & 2 deletions server/src-lib/Hasura/RQL/DDL/Metadata.hs
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,8 @@ runClearMetadata _ = do
Nothing -> emptyMetadata
Just defaultSourceMetadata ->
let emptyDefaultSource = SourceMetadata defaultSource mempty mempty
$ _smConfiguration defaultSourceMetadata
(_smConfiguration defaultSourceMetadata)
(_smReplicas defaultSourceMetadata)
in emptyMetadata
& metaSources %~ HM.insert defaultSource emptyDefaultSource
pure successMsg
Expand Down Expand Up @@ -405,7 +406,7 @@ fetchMetadataFromHdbTables defaultSourceConfig = liftTx do

let tableMetadatas = mapFromL _tmTable $ HM.elems postRelMap
sources = HM.singleton defaultSource $
SourceMetadata defaultSource tableMetadatas functions defaultSourceConfig
SourceMetadata defaultSource tableMetadatas functions defaultSourceConfig [] {- TODO: not sure what to do here -}
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I do think there's no notion of read_replicas in the OSS server before. This line of code is trying to migrate the metadata of the older single source database to the newer multi source support. Hence we can safely use [] which specifies there's no read_replica configuration.

pure $ Metadata sources remoteSchemas collections
allowlist customTypes actions cronTriggers

Expand Down
17 changes: 10 additions & 7 deletions server/src-lib/Hasura/RQL/DDL/Schema/Cache.hs
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,8 @@ import Hasura.RQL.DDL.Schema.Cache.Permission
import Hasura.RQL.DDL.Schema.Diff
import Hasura.RQL.DDL.Schema.Enum (fetchEnumValuesFromDb)
import Hasura.RQL.DDL.Schema.Function
import Hasura.RQL.DDL.Schema.Source (fetchPgScalars, resolveSource)
import Hasura.RQL.DDL.Schema.Source (HasResolveCustomSource,
fetchPgScalars, resolveSource)
import Hasura.RQL.DDL.Schema.Table
import Hasura.RQL.Types hiding (tmTable)
import Hasura.Server.Version (HasVersion)
Expand All @@ -62,6 +63,7 @@ import Hasura.SQL.Types
buildRebuildableSchemaCache
:: ( HasVersion, MonadIO m, MonadError QErr m
, HasHttpManager m, HasSQLGenCtx m, MonadMetadata m
, HasResolveCustomSource m
)
=> Env.Environment
-> m RebuildableSchemaCache
Expand Down Expand Up @@ -96,7 +98,7 @@ instance (Monad m) => CacheRM (CacheRWT m) where
askSchemaCache = CacheRWT $ gets (lastBuiltSchemaCache . (^. _1))

instance ( MonadIO m , MonadMetadata m, MonadError QErr m
, HasHttpManager m, HasSQLGenCtx m
, HasHttpManager m, HasSQLGenCtx m, HasResolveCustomSource m
) => CacheRWM (CacheRWT m) where
buildSchemaCacheWithOptions buildReason invalidations metadataModifier = CacheRWT do
(RebuildableSchemaCache _ invalidationKeys rule, oldInvalidations, resolvedSources) <- get
Expand Down Expand Up @@ -128,7 +130,7 @@ buildSchemaCacheRule
:: ( HasVersion, ArrowChoice arr, Inc.ArrowDistribute arr, Inc.ArrowCache m arr
, MonadIO m, MonadUnique m, MonadError QErr m
, MonadReader BuildContext m, HasHttpManager m, HasSQLGenCtx m
, MonadBaseControl IO m
, MonadBaseControl IO m, HasResolveCustomSource m
)
=> Env.Environment
-> (Metadata, InvalidationKeys) `arr` SchemaCache
Expand Down Expand Up @@ -193,6 +195,7 @@ buildSchemaCacheRule env = proc (metadata, invalidationKeys) -> do
, ArrowWriter (Seq CollectedInfo) arr
, MonadIO m, MonadBaseControl IO m
, MonadReader BuildContext m
, HasResolveCustomSource m
)
=> ( Inc.Dependency (HashMap SourceName Inc.InvalidationKey)
, SourceMetadata
Expand All @@ -203,14 +206,14 @@ buildSchemaCacheRule env = proc (metadata, invalidationKeys) -> do
Inc.dependOn -< Inc.selectKeyD sourceName invalidationKeys
(| withRecordInconsistency (
liftEitherA <<< bindA -< (getResolvedSourceFromBuildContext sourceName <$> ask) >>= \case
Nothing -> resolveSource env $ _smConfiguration sourceMetadata
Nothing -> resolveSource env (_smConfiguration sourceMetadata) (_smReplicas sourceMetadata)
Just rs -> pure $ Right rs)
|) metadataObj

buildSource
:: ( ArrowChoice arr, Inc.ArrowDistribute arr, Inc.ArrowCache m arr
, ArrowWriter (Seq CollectedInfo) arr, MonadReader BuildContext m
, HasSQLGenCtx m, MonadIO m, MonadError QErr m)
, HasSQLGenCtx m, MonadIO m, MonadError QErr m, HasResolveCustomSource m)
=> ( SourceMetadata
, PGSourceConfig
, PostgresTablesMetadata
Expand All @@ -220,7 +223,7 @@ buildSchemaCacheRule env = proc (metadata, invalidationKeys) -> do
, Inc.Dependency InvalidationKeys
) `arr` SourceOutput
buildSource = proc (sourceMetadata, sourceConfig, pgTables, pgFunctions, enumTables, remoteSchemaMap, invalidationKeys) -> do
let SourceMetadata source tables functions _ = sourceMetadata
let SourceMetadata source tables functions _ _ = sourceMetadata
(tableInputs, nonColumnInputs, permissions) = unzip3 $ map mkTableInputs $ M.elems tables
eventTriggers = map (_tmTable &&& (M.elems . _tmEventTriggers)) (M.elems tables)
-- HashMap k a -> HashMap k b -> HashMap k (a, b)
Expand Down Expand Up @@ -281,7 +284,7 @@ buildSchemaCacheRule env = proc (metadata, invalidationKeys) -> do
:: ( ArrowChoice arr, Inc.ArrowDistribute arr, Inc.ArrowCache m arr
, ArrowWriter (Seq CollectedInfo) arr, MonadIO m, MonadBaseControl IO m
, MonadError QErr m, MonadUnique m, MonadReader BuildContext m
, HasHttpManager m, HasSQLGenCtx m )
, HasHttpManager m, HasSQLGenCtx m, HasResolveCustomSource m )
=> (Metadata, Inc.Dependency InvalidationKeys) `arr` BuildOutputs
buildAndCollectInfo = proc (metadata, invalidationKeys) -> do
let Metadata sources remoteSchemas collections allowlists
Expand Down
13 changes: 10 additions & 3 deletions server/src-lib/Hasura/RQL/DDL/Schema/Cache/Common.hs
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import Control.Monad.Unique

import qualified Hasura.Incremental as Inc

import Hasura.RQL.DDL.Schema.Source
import Hasura.RQL.Types
import Hasura.SQL.Types

Expand Down Expand Up @@ -124,8 +125,9 @@ $(makeLenses ''BuildOutputs)
-- | Parameters required for schema cache build
data CacheBuildParams
= CacheBuildParams
{ _cbpManager :: !HTTP.Manager
, _cbpSqlGenCtx :: !SQLGenCtx
{ _cbpManager :: !HTTP.Manager
, _cbpSqlGenCtx :: !SQLGenCtx
, _cbpRslvCustomSrc :: !ResolveCustomSource
}

-- | The monad in which @'RebuildableSchemaCache' is being run
Expand All @@ -145,18 +147,23 @@ instance HasHttpManager CacheBuild where

instance HasSQLGenCtx CacheBuild where
askSQLGenCtx = asks _cbpSqlGenCtx

instance HasResolveCustomSource CacheBuild where
askResolveCustomSource = asks _cbpRslvCustomSrc

runCacheBuild
:: ( MonadIO m
, MonadError QErr m
, HasHttpManager m
, HasSQLGenCtx m
, HasResolveCustomSource m
)
=> CacheBuild a -> m a
runCacheBuild (CacheBuild m) = do
httpManager <- askHttpManager
sqlGenCtx <- askSQLGenCtx
let params = CacheBuildParams httpManager sqlGenCtx
rslvCustomSrc <- askResolveCustomSource
let params = CacheBuildParams httpManager sqlGenCtx rslvCustomSrc
liftEitherM $ liftIO $ runExceptT (runReaderT m params)

data RebuildableSchemaCache
Expand Down
41 changes: 34 additions & 7 deletions server/src-lib/Hasura/RQL/DDL/Schema/Source.hs
Original file line number Diff line number Diff line change
Expand Up @@ -8,26 +8,53 @@ import Hasura.RQL.DDL.Deps
import Hasura.RQL.DDL.Schema.Common
import Hasura.RQL.Types
import Hasura.SQL.Types
import Hasura.Tracing

import qualified Data.Environment as Env
import qualified Data.HashMap.Strict as HM
import qualified Data.HashSet as S
import qualified Database.PG.Query as Q

resolveSource
:: (MonadIO m, MonadBaseControl IO m)
=> Env.Environment -> SourceConfiguration -> m (Either QErr ResolvedSource)
resolveSource env config = runExceptT do
let SourceConfiguration urlConf connSettings = config
SourceConnSettings maxConns idleTimeout retries = connSettings
type ResolveCustomSource =
Env.Environment
-> SourceConfiguration
-> [SourceConfiguration]
-> IO (Either QErr PGSourceConfig)

class Monad m => HasResolveCustomSource m where
askResolveCustomSource :: m ResolveCustomSource

-- A default for monad transformer instances
default askResolveCustomSource
:: (m ~ t n, MonadTrans t, HasResolveCustomSource n)
=> m ResolveCustomSource
askResolveCustomSource = lift askResolveCustomSource

instance HasResolveCustomSource m => HasResolveCustomSource (ReaderT r m)
instance HasResolveCustomSource m => HasResolveCustomSource (ExceptT e m)
instance HasResolveCustomSource m => HasResolveCustomSource (TraceT m)

defaultResolveCustomSource :: ResolveCustomSource
defaultResolveCustomSource env (SourceConfiguration urlConf connSettings) _replicas = runExceptT do
let SourceConnSettings maxConns idleTimeout retries = connSettings
urlText <- resolveUrlConf env urlConf
let connInfo = Q.ConnInfo retries $ Q.CDDatabaseURI $ txtToBs urlText
connParams = Q.defaultConnParams{ Q.cpIdleTime = idleTimeout
, Q.cpConns = maxConns
}
pgPool <- liftIO $ Q.initPGPool connInfo connParams (\_ -> pure ()) -- FIXME? Pg logger
let pgExecCtx = mkPGExecCtx Q.ReadCommitted pgPool
sourceConfig = PGSourceConfig pgExecCtx connInfo
pure $ PGSourceConfig pgExecCtx connInfo

resolveSource
:: (MonadIO m, MonadBaseControl IO m, HasResolveCustomSource m)
=> Env.Environment
-> SourceConfiguration
-> [SourceConfiguration]
-> m (Either QErr ResolvedSource)
resolveSource env config replicas = runExceptT do
resolver <- askResolveCustomSource
sourceConfig <- ExceptT . liftIO $ resolver env config replicas

(tablesMeta, functionsMeta, pgScalars) <- runLazyTx (_pscExecCtx sourceConfig) Q.ReadWrite $ do
initSource
Expand Down
9 changes: 7 additions & 2 deletions server/src-lib/Hasura/RQL/Types/Metadata.hs
Original file line number Diff line number Diff line change
Expand Up @@ -311,6 +311,7 @@ data SourceMetadata
, _smTables :: !Tables
, _smFunctions :: !Functions
, _smConfiguration :: !SourceConfiguration
, _smReplicas :: ![SourceConfiguration]
} deriving (Show, Eq, Lift, Generic)
instance Cacheable SourceMetadata
$(makeLenses ''SourceMetadata)
Expand All @@ -320,12 +321,15 @@ instance FromJSON SourceMetadata where
_smTables <- mapFromL _tmTable <$> o .: "tables"
_smFunctions <- mapFromL _fmFunction <$> o .:? "functions" .!= []
_smConfiguration <- o .: "configuration"
_smReplicas <- o .:? "read_replicas" .!= []
pure SourceMetadata{..}

mkSourceMetadata
:: SourceName -> UrlConf -> SourceConnSettings -> SourceMetadata
mkSourceMetadata name urlConf connSettings =
SourceMetadata name mempty mempty $ SourceConfiguration urlConf connSettings
SourceMetadata name mempty mempty
(SourceConfiguration urlConf connSettings)
mempty

type Sources = M.HashMap SourceName SourceMetadata

Expand Down Expand Up @@ -464,7 +468,8 @@ metadataToOrdJSON ( Metadata
tablesPair = ("tables", AO.array $ map tableMetaToOrdJSON $ M.elems _smTables)
functionsPair = listToMaybeOrdPair "functions" functionMetadataToOrdJSON $ M.elems _smFunctions
configurationPair = [("configuration", AO.toOrdered _smConfiguration)]
in AO.object $ [sourceNamePair, tablesPair] <> maybeToList functionsPair <> configurationPair
replicasPair = [("read_replicas", AO.toOrdered _smReplicas) | not (null _smReplicas)]
in AO.object $ [sourceNamePair, tablesPair] <> maybeToList functionsPair <> configurationPair <> replicasPair

tableMetaToOrdJSON :: TableMetadata -> AO.Value
tableMetaToOrdJSON ( TableMetadata
Expand Down
7 changes: 7 additions & 0 deletions server/src-lib/Hasura/RQL/Types/Run.hs
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import Control.Monad.Trans.Control (MonadBaseControl)
import Control.Monad.Unique
import Data.Aeson

import Hasura.RQL.DDL.Schema.Source
import Hasura.RQL.Types
import qualified Hasura.Tracing as Tracing

Expand All @@ -30,6 +31,7 @@ data RunCtx
{ _rcUserInfo :: !UserInfo
, _rcHttpMgr :: !HTTP.Manager
, _rcSqlGenCtx :: !SQLGenCtx
, _rcRslvCustomSrc :: !ResolveCustomSource
}

newtype BaseRunT m a
Expand Down Expand Up @@ -58,6 +60,9 @@ instance (Monad m) => MonadMetadata (BaseRunT m) where
fetchMetadata = get
updateMetadata = put

instance (Monad m) => HasResolveCustomSource (BaseRunT m) where
askResolveCustomSource = asks _rcRslvCustomSrc

runBaseRunT :: RunCtx -> Metadata -> BaseRunT m a -> m (a, Metadata)
runBaseRunT runCtx metadata (BaseRunT m) =
runStateT (runReaderT m runCtx) metadata
Expand All @@ -73,6 +78,7 @@ newtype MetadataRun m a
, UserInfoM
, HasHttpManager
, HasSQLGenCtx
, HasResolveCustomSource
)

runInMetadataRun :: (Monad m) => MetadataStorageT m a -> MetadataRun m a
Expand Down Expand Up @@ -117,6 +123,7 @@ newtype QueryRun a
, UserInfoM
, HasHttpManager
, HasSQLGenCtx
, HasResolveCustomSource
)

peelQueryRun
Expand Down
5 changes: 3 additions & 2 deletions server/src-lib/Hasura/Server/API/Metadata.hs
Original file line number Diff line number Diff line change
Expand Up @@ -146,15 +146,16 @@ runMetadataRequest
-> UserInfo
-> HTTP.Manager
-> SQLGenCtx
-> ResolveCustomSource
-> RebuildableSchemaCache
-> Metadata
-> RQLMetadata
-> m (EncJSON, MetadataStateResult)
runMetadataRequest env userInfo httpManager sqlGenCtx schemaCache metadata request = do
runMetadataRequest env userInfo httpManager sqlGenCtx srcResolver schemaCache metadata request = do
((r, modSchemaCache, cacheInvalidations), modMetadata) <-
runMetadataRequestM env request
& runCacheRWT schemaCache
& peelMetadataRun (RunCtx userInfo httpManager sqlGenCtx) metadata
& peelMetadataRun (RunCtx userInfo httpManager sqlGenCtx srcResolver) metadata
& runExceptT
& liftEitherM
pure (r, MetadataStateResult modSchemaCache cacheInvalidations modMetadata)
Expand Down
Loading