@@ -9,6 +9,7 @@ import Options.Applicative
9
9
import System.Environment (getEnvironment , lookupEnv )
10
10
import System.Exit (exitFailure )
11
11
12
+
12
13
import qualified Control.Concurrent as C
13
14
import qualified Data.Aeson as A
14
15
import qualified Data.ByteString.Char8 as BC
@@ -21,17 +22,17 @@ import qualified Network.HTTP.Client.TLS as HTTP
21
22
import qualified Network.Wai.Handler.Warp as Warp
22
23
23
24
import Hasura.Events.Lib
24
- import Hasura.Logging (Logger (.. ), defaultLoggerSettings ,
25
- mkLogger , mkLoggerCtx )
25
+ import Hasura.Logging
26
26
import Hasura.Prelude
27
27
import Hasura.RQL.DDL.Metadata (fetchMetadata )
28
- import Hasura.RQL.Types (QErr , adminUserInfo ,
29
- emptySchemaCache )
30
- import Hasura.Server.App (mkWaiApp )
28
+ import Hasura.RQL.Types (adminUserInfo , emptySchemaCache )
29
+ import Hasura.Server.App (SchemaCacheRef (.. ), mkWaiApp )
31
30
import Hasura.Server.Auth
32
31
import Hasura.Server.CheckUpdates (checkForUpdates )
33
32
import Hasura.Server.Init
33
+ import Hasura.Server.Logging
34
34
import Hasura.Server.Query (peelRun )
35
+ import Hasura.Server.SchemaUpdate
35
36
import Hasura.Server.Telemetry
36
37
import Hasura.Server.Version (currentVersion )
37
38
@@ -97,13 +98,19 @@ printJSON = BLC.putStrLn . A.encode
97
98
printYaml :: (A. ToJSON a ) => a -> IO ()
98
99
printYaml = BC. putStrLn . Y. encode
99
100
101
+ mkPGLogger :: Logger -> Q. PGLogger
102
+ mkPGLogger (Logger logger) (Q. PLERetryMsg msg) =
103
+ logger $ PGLog LevelWarn msg
104
+
100
105
main :: IO ()
101
106
main = do
102
107
(HGEOptionsG rci hgeCmd) <- parseArgs
103
108
-- global http manager
104
109
httpManager <- HTTP. newManager HTTP. tlsManagerSettings
105
110
loggerCtx <- mkLoggerCtx $ defaultLoggerSettings True
111
+ instanceId <- mkInstanceId
106
112
let logger = mkLogger loggerCtx
113
+ pgLogger = mkPGLogger logger
107
114
case hgeCmd of
108
115
HCServe so@ (ServeOptions port host cp isoL mAdminSecret mAuthHook mJwtSecret
109
116
mUnAuthRole corsCfg enableConsole enableTelemetry strfyNum enabledAPIs) -> do
@@ -120,15 +127,21 @@ main = do
120
127
-- log postgres connection info
121
128
unLogger logger $ connInfoToLog ci
122
129
130
+ pool <- Q. initPGPool ci cp pgLogger
131
+
123
132
-- safe init catalog
124
133
initRes <- initialise logger ci httpManager
125
134
126
135
-- prepare event triggers data
127
136
prepareEvents logger ci
128
137
129
- pool <- Q. initPGPool ci cp
130
- (app, cacheRef) <- mkWaiApp isoL loggerCtx pool httpManager
131
- strfyNum am corsCfg enableConsole enableTelemetry enabledAPIs
138
+ (app, cacheRef, cacheInitTime) <-
139
+ mkWaiApp isoL loggerCtx strfyNum pool httpManager am
140
+ corsCfg enableConsole enableTelemetry instanceId enabledAPIs
141
+
142
+ -- start a background thread for schema sync
143
+ startSchemaSync strfyNum pool logger httpManager
144
+ cacheRef instanceId cacheInitTime
132
145
133
146
let warpSettings = Warp. setPort port $ Warp. setHost host Warp. defaultSettings
134
147
@@ -138,48 +151,48 @@ main = do
138
151
139
152
eventEngineCtx <- atomically $ initEventEngineCtx maxEvThrds evFetchMilliSec
140
153
154
+ let scRef = _scrCache cacheRef
141
155
unLogger logger $
142
156
mkGenericStrLog " event_triggers" " starting workers"
143
- void $ C. forkIO $ processEventQueue hloggerCtx logEnvHeaders httpManager pool cacheRef eventEngineCtx
157
+ void $ C. forkIO $ processEventQueue hloggerCtx logEnvHeaders httpManager pool scRef eventEngineCtx
144
158
145
159
-- start a background thread to check for updates
146
160
void $ C. forkIO $ checkForUpdates loggerCtx httpManager
147
161
148
162
-- start a background thread for telemetry
149
163
when enableTelemetry $ do
150
164
unLogger logger $ mkGenericStrLog " telemetry" telemetryNotice
151
- void $ C. forkIO $ runTelemetry logger httpManager cacheRef initRes
165
+ void $ C. forkIO $ runTelemetry logger httpManager scRef initRes
152
166
153
167
unLogger logger $
154
168
mkGenericStrLog " server" " starting API server"
155
169
Warp. runSettings warpSettings app
156
170
157
171
HCExport -> do
158
172
ci <- procConnInfo rci
159
- res <- runTx ci fetchMetadata
173
+ res <- runTx pgLogger ci fetchMetadata
160
174
either printErrJExit printJSON res
161
175
162
176
HCClean -> do
163
177
ci <- procConnInfo rci
164
- res <- runTx ci cleanCatalog
178
+ res <- runTx pgLogger ci cleanCatalog
165
179
either printErrJExit (const cleanSuccess) res
166
180
167
181
HCExecute -> do
168
182
queryBs <- BL. getContents
169
183
ci <- procConnInfo rci
170
- res <- runAsAdmin ci httpManager $ execQuery queryBs
184
+ res <- runAsAdmin pgLogger ci httpManager $ execQuery queryBs
171
185
either printErrJExit BLC. putStrLn res
172
186
173
187
HCVersion -> putStrLn $ " Hasura GraphQL Engine: " ++ T. unpack currentVersion
174
188
where
175
189
176
- runTx :: Q. ConnInfo -> Q. TxE QErr a -> IO (Either QErr a )
177
- runTx ci tx = do
178
- pool <- getMinimalPool ci
190
+ runTx pgLogger ci tx = do
191
+ pool <- getMinimalPool pgLogger ci
179
192
runExceptT $ Q. runTx pool (Q. Serializable , Nothing ) tx
180
193
181
- runAsAdmin ci httpManager m = do
182
- pool <- getMinimalPool ci
194
+ runAsAdmin pgLogger ci httpManager m = do
195
+ pool <- getMinimalPool pgLogger ci
183
196
res <- runExceptT $ peelRun emptySchemaCache adminUserInfo
184
197
httpManager False pool Q. Serializable m
185
198
return $ fmap fst res
@@ -188,31 +201,32 @@ main = do
188
201
either (printErrExit . connInfoErrModifier) return $
189
202
mkConnInfo rci
190
203
191
- getMinimalPool ci = do
204
+ getMinimalPool pgLogger ci = do
192
205
let connParams = Q. defaultConnParams { Q. cpConns = 1 }
193
- Q. initPGPool ci connParams
206
+ Q. initPGPool ci connParams pgLogger
194
207
195
208
initialise (Logger logger) ci httpMgr = do
196
209
currentTime <- getCurrentTime
197
-
210
+ let pgLogger = mkPGLogger $ Logger logger
198
211
-- initialise the catalog
199
- initRes <- runAsAdmin ci httpMgr $ initCatalogSafe currentTime
212
+ initRes <- runAsAdmin pgLogger ci httpMgr $ initCatalogSafe currentTime
200
213
either printErrJExit (logger . mkGenericStrLog " db_init" ) initRes
201
214
202
215
-- migrate catalog if necessary
203
- migRes <- runAsAdmin ci httpMgr $ migrateCatalog currentTime
216
+ migRes <- runAsAdmin pgLogger ci httpMgr $ migrateCatalog currentTime
204
217
either printErrJExit (logger . mkGenericStrLog " db_migrate" ) migRes
205
218
206
219
-- generate and retrieve uuids
207
- getUniqIds ci
220
+ getUniqIds pgLogger ci
208
221
209
222
prepareEvents (Logger logger) ci = do
223
+ let pgLogger = mkPGLogger $ Logger logger
210
224
logger $ mkGenericStrLog " event_triggers" " preparing data"
211
- res <- runTx ci unlockAllEvents
225
+ res <- runTx pgLogger ci unlockAllEvents
212
226
either printErrJExit return res
213
227
214
- getUniqIds ci = do
215
- eDbId <- runTx ci getDbId
228
+ getUniqIds pgLogger ci = do
229
+ eDbId <- runTx pgLogger ci getDbId
216
230
dbId <- either printErrJExit return eDbId
217
231
fp <- liftIO generateFingerprint
218
232
return (dbId, fp)
0 commit comments