server/postgres: fix reload sources and remote schemas if they're inconsistent

https://github.com/hasura/graphql-engine-mono/pull/1709

GitOrigin-RevId: c0684380d0e86dd6f28d6c8a0aebeaa210319272
This commit is contained in:
Rakesh Emmadi 2021-07-13 13:26:32 +05:30 committed by hasura-bot
parent 3bdd777ec4
commit df1efdcd27
7 changed files with 49 additions and 35 deletions

View File

@ -3,6 +3,7 @@
## Next release
(Add entries below in the order of server, console, cli, docs, others)
- server: fix reloading inconsistent sources or remote schemas via `reload_metadata` API
- server: support scalar computed fields in remote joins (close #7101)
- server: Support computed fields in query filter (`where` argument) (close #7100)
- server: add a `$.detail.operation.request_mode` field to `http-log` which takes the values `"single"` or `"batched"` to log whether a GraphQL request was executed on its own or as part of a batch

View File

@ -296,52 +296,52 @@ The various types of queries are listed in the following table:
- :ref:`mssql_set_table_customization_args <mssql_set_table_customization_syntax>`
- 1
- Set table customization of an already tracked MS SQL Server table
* - :ref:`mssql_create_insert_permission`
- :ref:`mssql_create_insert_permission_args <mssql_create_insert_permission_syntax>`
- 1
- Specify insert permission for an MS SQL Server table/view
* - :ref:`mssql_drop_insert_permission`
- :ref:`mssql_drop_insert_permission_args <mssql_drop_insert_permission_syntax>`
- 1
- Remove existing insert permission for an MS SQL Server table/view
* - :ref:`mssql_create_select_permission`
- :ref:`mssql_create_select_permission_args <mssql_create_select_permission_syntax>`
- 1
- Specify select permission for an MS SQL Server table/view
* - :ref:`mssql_drop_select_permission`
- :ref:`mssql_drop_select_permission_args <mssql_drop_select_permission_syntax>`
- 1
- Remove existing select permission for an MS SQL Server table/view
* - :ref:`mssql_create_update_permission`
- :ref:`mssql_create_update_permission_args <mssql_create_update_permission_syntax>`
- 1
- Specify update permission for an MS SQL Server table/view
* - :ref:`mssql_drop_update_permission`
- :ref:`mssql_drop_update_permission_args <mssql_drop_update_permission_syntax>`
- 1
- Remove existing update permission for an MS SQL Server table/view
* - :ref:`mssql_create_delete_permission`
- :ref:`mssql_create_delete_permission_args <mssql_create_delete_permission_syntax>`
- 1
- Specify delete permission for an MS SQL Server table/view
* - :ref:`mssql_drop_delete_permission`
- :ref:`mssql_drop_delete_permission_args <mssql_drop_delete_permission_syntax>`
- 1
- Remove existing delete permission for an MS SQL Server table/view
* - :ref:`mssql_set_permission_comment`
- :ref:`mssql_set_permission_comment_args <mssql_set_permission_comment_syntax>`
- 1
- Set comment on an existing permission for an MS SQL Server table/view
* - :ref:`metadata_create_cron_trigger`
- :ref:`create_cron_trigger_args <metadata_create_cron_trigger_syntax>`
- 1
@ -424,7 +424,7 @@ The various types of queries are listed in the following table:
- Replace existing metadata with check against current resource_version.
* - :ref:`metadata_reload_metadata`
- :ref:`Empty Object`
- :ref:`reload_metadata_args <metadata_reload_metadata_syntax>`
- 1
- Reload changes to the underlying Postgres DB

View File

@ -232,7 +232,8 @@ table using ``psql`` and this column should now be added to the GraphQL schema.
{
"type" : "reload_metadata",
"args": {
"reload_remote_schemas": true
"reload_remote_schemas": true,
"reload_sources": false
}
}
@ -250,8 +251,12 @@ Args syntax
- Description
* - reload_remote_schemas
- false
- Boolean
- If set to ``true``, all remote schemas' (including inconsistent ones) cached GraphQL schemas are refreshed (default: ``false``)
- ``Boolean`` | [:ref:`RemoteSchemaName`]
- If set to ``true``, all remote schemas' (including inconsistent ones) cached GraphQL schemas are refreshed (default: ``true``)
* - reload_sources
- false
- ``Boolean`` | [:ref:`SourceName`]
- If set to ``true``, all sources' (including inconsistent ones) cached GraphQL schemas are refreshed (default: ``true``)
.. _metadata_clear_metadata:

View File

@ -270,7 +270,7 @@ The various types of queries are listed in the following table:
- :ref:`update_remote_schema_args <update_remote_schema_syntax>`
- 1
- Update the details for a remote schema
* - :ref:`remove_remote_schema`
- :ref:`remove_remote_schema_args <remove_remote_schema_syntax>`
- 1
@ -317,7 +317,7 @@ The various types of queries are listed in the following table:
- Import and replace existing metadata
* - :ref:`reload_metadata`
- :ref:`Empty Object`
- :ref:`reload_metadata_args <reload_metadata_args_syntax>`
- 1
- Reload changes to the underlying Postgres DB

View File

@ -167,8 +167,8 @@ Args syntax
- Description
* - reload_remote_schemas
- false
- Boolean
- If set to ``true``, all remote schemas' (including inconsistent ones) cached GraphQL schemas are refreshed (default: ``false``)
- ``Boolean`` | [:ref:`RemoteSchemaName`]
- If set to ``true``, all remote schemas' (including inconsistent ones) cached GraphQL schemas are refreshed (default: ``true``)
.. _clear_metadata:

View File

@ -20,7 +20,6 @@ module Hasura.RQL.DDL.Metadata
import Hasura.Prelude
import qualified Data.Aeson.Ordered as AO
import qualified Data.HashMap.Strict as HM
import qualified Data.HashMap.Strict.InsOrd as OMap
import qualified Data.HashSet as HS
import qualified Data.List as L
@ -260,19 +259,31 @@ runExportMetadataV2 currentResourceVersion ExportMetadata{} = do
runReloadMetadata :: (QErrM m, CacheRWM m, MetadataM m) => ReloadMetadata -> m EncJSON
runReloadMetadata (ReloadMetadata reloadRemoteSchemas reloadSources) = do
sc <- askSchemaCache
let remoteSchemaInvalidations = case reloadRemoteSchemas of
RSReloadAll -> HS.fromList $ getAllRemoteSchemas sc
RSReloadList l -> l
pgSourcesInvalidations = case reloadSources of
RSReloadAll -> HS.fromList $ HM.keys $ scSources sc
RSReloadList l -> l
cacheInvalidations = CacheInvalidations
metadata <- getMetadata
let allSources = HS.fromList $ OMap.keys $ _metaSources metadata
allRemoteSchemas = HS.fromList $ OMap.keys $ _metaRemoteSchemas metadata
checkRemoteSchema name =
unless (HS.member name allRemoteSchemas)
$ throw400 NotExists
$ "Remote schema with name " <> name <<> " not found in metadata"
checkSource name =
unless (HS.member name allSources)
$ throw400 NotExists
$ "Source with name " <> name <<> " not found in metadata"
remoteSchemaInvalidations <- case reloadRemoteSchemas of
RSReloadAll -> pure allRemoteSchemas
RSReloadList l -> mapM_ checkRemoteSchema l *> pure l
pgSourcesInvalidations <- case reloadSources of
RSReloadAll -> pure allSources
RSReloadList l -> mapM_ checkSource l *> pure l
let cacheInvalidations = CacheInvalidations
{ ciMetadata = True
, ciRemoteSchemas = remoteSchemaInvalidations
, ciSources = pgSourcesInvalidations
}
metadata <- getMetadata
buildSchemaCacheWithOptions CatalogUpdate cacheInvalidations metadata
pure successMsg

View File

@ -56,8 +56,8 @@ instance (FromJSON a, Eq a, Hashable a) => FromJSON (ReloadSpec a) where
type ReloadRemoteSchemas = ReloadSpec RemoteSchemaName
type ReloadSources = ReloadSpec SourceName
noReloadRemoteSchemas :: ReloadRemoteSchemas
noReloadRemoteSchemas = RSReloadList mempty
reloadAllRemoteSchemas :: ReloadRemoteSchemas
reloadAllRemoteSchemas = RSReloadAll
reloadAllSources :: ReloadSources
reloadAllSources = RSReloadAll
@ -72,12 +72,9 @@ $(deriveToJSON hasuraJSON ''ReloadMetadata)
instance FromJSON ReloadMetadata where
parseJSON = \case
Object o -> ReloadMetadata
-- To maintain backwards compatibility of the API behaviour,
-- we choose not to reload any remote schema in absence of
-- 'reload_remote_schemas' field.
<$> o .:? "reload_remote_schemas" .!= noReloadRemoteSchemas
<$> o .:? "reload_remote_schemas" .!= reloadAllRemoteSchemas
<*> o .:? "reload_sources" .!= reloadAllSources
_ -> pure $ ReloadMetadata noReloadRemoteSchemas reloadAllSources
_ -> pure $ ReloadMetadata reloadAllRemoteSchemas reloadAllSources
data DumpInternalState
= DumpInternalState