@@ -16,7 +16,6 @@ module ProjectM36.Client
1616 typeForRelationalExpr,
1717 inclusionDependencies,
1818 planForDatabaseContextExpr,
19− attributesForRelationalExpr,
2019 processPersistence,
2120 transactionGraphAsRelation,
2221 headName,
@@ -37,7 +36,6 @@ module ProjectM36.Client
3736import ProjectM36.Base hiding (inclusionDependencies) --defined in this module as well
3837import qualified ProjectM36.Base as B
3938import ProjectM36.Error
40−import ProjectM36.Relation
4139import ProjectM36.StaticOptimizer
4240import Control.Monad.State
4341import ProjectM36.Transaction
@@ -50,17 +48,19 @@ import ProjectM36.Daemon.RemoteCallTypes (RemoteExecution(..))
5048import Network.Transport.TCP (createTransport, defaultTCPParameters, encodeEndPointAddress)
5149import Control.Distributed.Process.Node (newLocalNode, initRemoteTable, runProcess, LocalNode)
5250import Control.Distributed.Process.Extras.Internal.Types (whereisRemote)
53−import Control.Distributed.Process.ManagedProcess.Client (call)
51+import Control.Distributed.Process.ManagedProcess.Client (call, safeCall)
5452import Control.Distributed.Process (NodeId(..))
5553
5654import Data.UUID (UUID)
5755import Data.UUID.V4 (nextRandom)
5856import Control.Concurrent.STM
5957import Data.Word
60−import Control.Distributed.Process (ProcessId, Process)
58+import Control.Distributed.Process (ProcessId, Process, getSelfPid)
6159import Control.Exception (IOException)
6260import Control.Concurrent.MVar
6361import qualified Data.Map as M
62+import Control.Distributed.Process.Serializable (Serializable)
63+--import Control.Distributed.Process.Debug
6464
6565type Hostname = String
6666
@@ -165,13 +165,21 @@ runProcessResult localNode proc = do
165165 liftIO $ putMVar ret val
166166 takeMVar ret
167167
168+remoteCall :: (Serializable a, Serializable b) => Connection -> a -> IO b
169+remoteCall (InProcessConnection _ _) _ = error "remoteCall called on local connection"
170+remoteCall (RemoteProcessConnection localNode serverProcessId) arg = runProcessResult localNode $ do
171+ pid <- getSelfPid
172+ liftIO $ putStrLn (show serverProcessId)
173+ ret <- safeCall serverProcessId arg
174+ case ret of
175+ Left err -> error (show err)
176+ Right ret' -> pure ret'
177+
168178executeRelationalExpr :: Connection -> RelationalExpr -> IO (Either RelationalError Relation)
169179executeRelationalExpr (InProcessConnection _ tvar) expr = atomically $ do
170180 ((DisconnectedTransaction _ context), _) <- readTVar tvar
171181 return $ evalState (RE.evalRelationalExpr expr) context
172−executeRelationalExpr (RemoteProcessConnection localNode serverProcessId) relExpr = do
173− runProcessResult localNode $ do
174− call serverProcessId (ExecuteRelationalExpr relExpr)
182+executeRelationalExpr conn@(RemoteProcessConnection _ _) relExpr = remoteCall conn (ExecuteRelationalExpr relExpr)
175183
176184executeDatabaseContextExpr :: Connection -> DatabaseExpr -> IO (Maybe RelationalError)
177185executeDatabaseContextExpr (InProcessConnection _ tvar) expr = atomically $ do
@@ -182,8 +190,7 @@ executeDatabaseContextExpr (InProcessConnection _ tvar) expr = atomically $ do
182190 let newDiscon = DisconnectedTransaction parentUUID context'
183191 writeTVar tvar (newDiscon, graph)
184192 return Nothing
185−executeDatabaseContextExpr (RemoteProcessConnection localNode serverProcessId) dbExpr = do
186− runProcessResult localNode $ call serverProcessId (ExecuteDatabaseContextExpr dbExpr)
193+executeDatabaseContextExpr conn@(RemoteProcessConnection _ _) dbExpr = remoteCall conn (ExecuteDatabaseContextExpr dbExpr)
187194
188195executeGraphExpr :: Connection -> TransactionGraphOperator -> IO (Maybe RelationalError)
189196executeGraphExpr (InProcessConnection strat tvar) graphExpr = do
@@ -202,15 +209,15 @@ executeGraphExpr (InProcessConnection strat tvar) graphExpr = do
202209 --this should really grab a lock at the beginning of the method to be threadsafe
203210 processPersistence strat newGraph
204211 return Nothing
205−executeGraphExpr (RemoteProcessConnection localNode serverProcessId) graphExpr = do
206− runProcessResult localNode $ do
207− call serverProcessId (ExecuteGraphExpr graphExpr)
212+executeGraphExpr conn@(RemoteProcessConnection _ _) graphExpr = remoteCall conn (ExecuteGraphExpr graphExpr)
208213
209214commit :: Connection -> IO (Maybe RelationalError)
210−commit conn = executeGraphExpr conn Commit
215+commit conn@(InProcessConnection _ _) = executeGraphExpr conn Commit
216+commit conn@(RemoteProcessConnection _ _) = remoteCall conn (ExecuteGraphExpr Commit)
211217
212218rollback :: Connection -> IO (Maybe RelationalError)
213−rollback conn = executeGraphExpr conn Rollback
219+rollback conn@(InProcessConnection _ _) = executeGraphExpr conn Rollback
220+rollback conn@(RemoteProcessConnection _ _) = remoteCall conn (ExecuteGraphExpr Rollback)
214221
215222processPersistence :: PersistenceStrategy -> TransactionGraph -> IO ()
216223processPersistence NoPersistence _ = return ()
@@ -219,43 +226,43 @@ processPersistence (CrashSafePersistence dbdir) graph = transactionGraphPersist
219226
220227typeForRelationalExpr :: Connection -> RelationalExpr -> IO (Either RelationalError Relation)
221228typeForRelationalExpr conn@(InProcessConnection _ _) relExpr = atomically $ typeForRelationalExprSTM conn relExpr
229+typeForRelationalExpr conn@(RemoteProcessConnection _ _) relExpr = remoteCall conn (ExecuteTypeForRelationalExpr relExpr)
222230
223231typeForRelationalExprSTM :: Connection -> RelationalExpr -> STM (Either RelationalError Relation)
224232typeForRelationalExprSTM (InProcessConnection _ tvar) relExpr = do
225233 (DisconnectedTransaction _ context, _) <- readTVar tvar
226234 pure $ evalState (RE.typeForRelationalExpr relExpr) context
235+typeForRelationalExprSTM _ _ = error "typeForRelationalExprSTM called on non-local connection"
227236
228237inclusionDependencies :: Connection -> IO (M.Map IncDepName InclusionDependency)
229238inclusionDependencies (InProcessConnection _ tvar) = do
230239 atomically $ do
231240 ((DisconnectedTransaction _ context), _) <- readTVar tvar
232241 pure (B.inclusionDependencies context)
242+inclusionDependencies conn@(RemoteProcessConnection _ _) = remoteCall conn RetrieveInclusionDependencies
243+
233244
234245planForDatabaseContextExpr :: Connection -> DatabaseExpr -> IO (Either RelationalError DatabaseExpr)
235246planForDatabaseContextExpr (InProcessConnection _ tvar) dbExpr = do
236247 atomically $ do
237248 ((DisconnectedTransaction _ context), _) <- readTVar tvar
238249 pure $ evalState (applyStaticDatabaseOptimization dbExpr) context
250+planForDatabaseContextExpr conn@(RemoteProcessConnection _ _) dbExpr = remoteCall conn (RetrievePlanForDatabaseContextExpr dbExpr)
239251
240252transactionGraphAsRelation :: Connection -> IO (Either RelationalError Relation)
241253transactionGraphAsRelation (InProcessConnection _ tvar) = do
242254 atomically $ do
243255 (discon, graph) <- readTVar tvar
244256 pure $ graphAsRelation discon graph
245−
246−attributesForRelationalExpr :: Connection -> RelationalExpr -> IO (Either RelationalError Attributes)
247−attributesForRelationalExpr conn relExpr = atomically $ do
248− eRelType <- typeForRelationalExprSTM conn relExpr
249− pure $ case eRelType of
250− Left err -> Left err
251− Right relType -> Right $ attributes relType
252−
257+transactionGraphAsRelation conn@(RemoteProcessConnection _ _) = remoteCall conn RetrieveTransactionGraph
258+
253259-- | Returns the UUID for the connection's disconnected transaction committed parent transaction.
254260headTransactionUUID :: Connection -> IO (UUID)
255261headTransactionUUID (InProcessConnection _ tvar) = do
256262 atomically $ do
257263 (DisconnectedTransaction parentUUID _, _) <- readTVar tvar
258264 pure parentUUID
265+headTransactionUUID conn@(RemoteProcessConnection _ _) = remoteCall conn RetrieveHeadTransactionUUID
259266
260267-- | Returns Just the name of the head of the current disconnected transaction or Nothing.
261268headName :: Connection -> IO (Maybe HeadName)