mirror of
https://github.com/hasura/graphql-engine.git
synced 2024-09-20 06:58:39 +03:00
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:
parent
3bdd777ec4
commit
df1efdcd27
@ -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
|
||||
|
@ -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
|
||||
|
||||
|
@ -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:
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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:
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user