@@ -128,6 +128,7 @@ import Control.Distributed.Process.Extras.Internal.Types (whereisRemote)
128128import Control.Distributed.Process.ManagedProcess.Client (call, safeCall)
129129import Control.Distributed.Process (NodeId(..), reconnect)
130130
131+import Data.Either (isRight)
131132import Data.UUID.V4 (nextRandom)
132133import Data.Word
133134import Control.Distributed.Process (ProcessId, Process, receiveWait, send, match)
@@ -580,7 +581,8 @@ autoMergeToHead sessionId (InProcessConnection conf) strat headName' = do
580581 Right session -> do
581582 case Graph.autoMergeToHead (id1, id2, id3) (Sess.disconnectedTransaction session) headName' strat graph of
582583 Left err -> pure (Left err)
583− Right (discon', graph') -> pure (Right (discon', graph', True))
584+ Right (discon', graph') -> do
585+ pure (Right (discon', graph', [id1, id2, id3]))
584586autoMergeToHead sessionId conn@(RemoteProcessConnection _) strat headName' = remoteCall conn (ExecuteAutoMergeToHead sessionId strat headName')
585587
586588-- | Execute a database context IO-monad-based expression for the given session and connection. `DatabaseContextIOExpr`s modify the DatabaseContext but cannot be purely implemented.
@@ -645,7 +647,13 @@ executeGraphExpr sessionId (InProcessConnection conf) graphExpr = excEither $ do
645647 let discon = Sess.disconnectedTransaction session
646648 case evalGraphOp freshId discon updatedGraph graphExpr of
647649 Left err -> pure (Left err)
648− Right (discon', graph') -> pure (Right (discon', graph', isCommit graphExpr))
650+ Right (discon', graph') -> do
651+ --if freshId appears in the graph, then we need to pass it on
652+ let transIds = if isRight (transactionForId freshId graph') then
653+ [freshId]
654+ else
655+ []
656+ pure (Right (discon', graph', transIds))
649657{-
650658executeGraphExpr sessionId (InProcessConnection conf) graphExpr = excEither $ do
651659 let strat = ipPersistenceStrategy conf
@@ -768,10 +776,10 @@ rollback sessionId conn@(InProcessConnection _) = executeGraphExpr sessionId con
768776rollback sessionId conn@(RemoteProcessConnection _) = remoteCall conn (ExecuteGraphExpr sessionId Rollback)
769777
770778-- | Write the transaction graph to disk. This function can be used to incrementally write new transactions to disk.
771−processTransactionGraphPersistence :: PersistenceStrategy -> TransactionGraph -> IO ()
772−processTransactionGraphPersistence NoPersistence _ = pure ()
773−processTransactionGraphPersistence (MinimalPersistence dbdir) graph = transactionGraphPersist NoDiskSync dbdir graph >> pure ()
774−processTransactionGraphPersistence (CrashSafePersistence dbdir) graph = transactionGraphPersist FsyncDiskSync dbdir graph >> pure ()
779+processTransactionGraphPersistence :: PersistenceStrategy -> [TransactionId] -> TransactionGraph -> IO ()
780+processTransactionGraphPersistence NoPersistence _ _ = pure ()
781+processTransactionGraphPersistence (MinimalPersistence dbdir) transIds graph = transactionGraphPersist NoDiskSync dbdir transIds graph >> pure ()
782+processTransactionGraphPersistence (CrashSafePersistence dbdir) transIds graph = transactionGraphPersist FsyncDiskSync dbdir transIds graph >> pure ()
775783
776784readGraphTransactionIdDigest :: PersistenceStrategy -> IO (LockFileHash)
777785readGraphTransactionIdDigest NoPersistence = error "attempt to read digest from transaction log without persistence enabled"
@@ -947,13 +955,11 @@ disconnectedTransaction_ sessionId (InProcessConnection conf) = do
947955 Just (Sess.Session discon _) -> pure discon
948956disconnectedTransaction_ _ _= error "remote connection used"
949957
950−type ProcessCommit = Bool
951−
952958-- wrap a graph evaluation in file locking
953959commitLock_ :: SessionId ->
954960 InProcessConnectionConf ->
955961 (TransactionGraph ->
956− STM (Either RelationalError (DisconnectedTransaction, TransactionGraph, ProcessCommit))) ->
962+ STM (Either RelationalError (DisconnectedTransaction, TransactionGraph, [TransactionId]))) ->
957963 IO (Either RelationalError ())
958964commitLock_ sessionId conf stmBlock = do
959965 let sessions = ipSessions conf
@@ -998,25 +1004,25 @@ commitLock_ sessionId conf stmBlock = do
9981004 eGraph <- stmBlock refreshedGraph
9991005 case eGraph of
10001006 Left err -> pure (Left err)
1001− Right (discon', graph', processCommit) -> do
1007+ Right (discon', graph', transactionIdsToPersist) -> do
10021008 writeTVar graphTvar graph'
10031009 let newSession = Session discon' (Sess.schemaName session)
10041010 STMMap.insert newSession sessionId sessions
10051011 case transactionForId (Sess.parentId session) oldGraph of
10061012 Left err -> pure $ Left err
10071013 Right previousTrans -> do
1008− if processCommit then do
1014+ if not (Prelude.null transactionIdsToPersist) then do
10091015 (evaldNots, nodes) <- executeCommitExprSTM_ (Trans.concreteDatabaseContext previousTrans) (Sess.concreteDatabaseContext session) clientNodes
10101016 nodesToNotify <- toList (STMSet.stream nodes)
1011− pure $ Right (evaldNots, nodesToNotify, graph')
1012− else pure (Right (M.empty, [], graph'))
1017+ pure $ Right (evaldNots, nodesToNotify, graph', transactionIdsToPersist)
1018+ else pure (Right (M.empty, [], graph', []))
10131019
10141020 --handle notification firing
10151021 case manip of
10161022 Left err -> pure (Left err)
1017− Right (notsToFire, nodesToNotify, newGraph) -> do
1023+ Right (notsToFire, nodesToNotify, newGraph, transactionIdsToPersist) -> do
10181024 --update filesystem database, if necessary
1019− processTransactionGraphPersistence strat newGraph
1025+ processTransactionGraphPersistence strat transactionIdsToPersist newGraph
10201026 sendNotifications nodesToNotify (ipLocalNode conf) notsToFire
10211027 pure (Right ())
10221028{-