Skip to content

Commit

Permalink
Merge pull request #4809 from input-output-hk/newhoggy/introduce-Read…
Browse files Browse the repository at this point in the history
…erT-into-LocalStateQueryExpr

Add ReaderT of NodeToClientVersion to LocalStateQueryExpr
  • Loading branch information
newhoggy authored Jan 19, 2023
2 parents b5c9f9b + b153ee2 commit 9665b3d
Show file tree
Hide file tree
Showing 3 changed files with 14 additions and 10 deletions.
1 change: 1 addition & 0 deletions cardano-api/cardano-api.cabal
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,7 @@ library
, iproute
, memory
, microlens
, mtl
, network
, nothunks
, optparse-applicative-fork
Expand Down
16 changes: 9 additions & 7 deletions cardano-api/src/Cardano/Api/IPC/Monad.hs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import Control.Applicative
import Control.Concurrent.STM
import Control.Monad
import Control.Monad.IO.Class
import Control.Monad.Reader
import Control.Monad.Trans.Cont
import Data.Bifunctor (first)
import Data.Either
Expand Down Expand Up @@ -45,14 +46,14 @@ import Cardano.Api.Modes
-- In order to make pipelining still possible we can explore the use of Selective Functors
-- which would allow us to straddle both worlds.
newtype LocalStateQueryExpr block point query r m a = LocalStateQueryExpr
{ runLocalStateQueryExpr :: ContT (Net.Query.ClientStAcquired block point query m r) m a
} deriving (Functor, Applicative, Monad, MonadIO)
{ runLocalStateQueryExpr :: ReaderT NodeToClientVersion (ContT (Net.Query.ClientStAcquired block point query m r) m) a
} deriving (Functor, Applicative, Monad, MonadReader NodeToClientVersion, MonadIO)

-- | Execute a local state query expression.
executeLocalStateQueryExpr
:: LocalNodeConnectInfo mode
-> Maybe ChainPoint
-> (NodeToClientVersion -> LocalStateQueryExpr (BlockInMode mode) ChainPoint (QueryInMode mode) () IO a)
-> LocalStateQueryExpr (BlockInMode mode) ChainPoint (QueryInMode mode) () IO a
-> IO (Either AcquiringFailure a)
executeLocalStateQueryExpr connectInfo mpoint f = do
tmvResultLocalState <- newEmptyTMVarIO
Expand All @@ -63,7 +64,7 @@ executeLocalStateQueryExpr connectInfo mpoint f = do
(\ntcVersion ->
LocalNodeClientProtocols
{ localChainSyncClient = NoLocalChainSyncClient
, localStateQueryClient = Just $ setupLocalStateQueryExpr waitResult mpoint tmvResultLocalState (f ntcVersion)
, localStateQueryClient = Just $ setupLocalStateQueryExpr waitResult mpoint tmvResultLocalState ntcVersion f
, localTxSubmissionClient = Nothing
, localTxMonitoringClient = Nothing
}
Expand All @@ -79,12 +80,13 @@ setupLocalStateQueryExpr ::
-- cause other incomplete protocols to abort which may lead to deadlock.
-> Maybe ChainPoint
-> TMVar (Either Net.Query.AcquireFailure a)
-> NodeToClientVersion
-> LocalStateQueryExpr (BlockInMode mode) ChainPoint (QueryInMode mode) () IO a
-> Net.Query.LocalStateQueryClient (BlockInMode mode) ChainPoint (QueryInMode mode) IO ()
setupLocalStateQueryExpr waitDone mPointVar' resultVar' f =
setupLocalStateQueryExpr waitDone mPointVar' resultVar' ntcVersion f =
LocalStateQueryClient . pure . Net.Query.SendMsgAcquire mPointVar' $
Net.Query.ClientStAcquiring
{ Net.Query.recvMsgAcquired = runContT (runLocalStateQueryExpr f) $ \result -> do
{ Net.Query.recvMsgAcquired = runContT (runReaderT (runLocalStateQueryExpr f) ntcVersion) $ \result -> do
atomically $ putTMVar resultVar' (Right result)
void $ atomically waitDone -- Wait for all protocols to complete before exiting.
pure $ Net.Query.SendMsgRelease $ pure $ Net.Query.SendMsgDone ()
Expand All @@ -98,7 +100,7 @@ setupLocalStateQueryExpr waitDone mPointVar' resultVar' f =
-- | Use 'queryExpr' in a do block to construct monadic local state queries.
queryExpr :: QueryInMode mode a -> LocalStateQueryExpr block point (QueryInMode mode) r IO a
queryExpr q =
LocalStateQueryExpr . ContT $ \f -> pure $
LocalStateQueryExpr . ReaderT $ \_ -> ContT $ \f -> pure $
Net.Query.SendMsgQuery q $
Net.Query.ClientStQuerying
{ Net.Query.recvMsgResult = f
Expand Down
7 changes: 4 additions & 3 deletions cardano-cli/src/Cardano/CLI/Shelley/Run/Query.hs
Original file line number Diff line number Diff line change
Expand Up @@ -209,7 +209,7 @@ runQueryProtocolParameters (AnyConsensusModeParams cModeParams) network mOutFile
$ newExceptT readEnvSocketPath
let localNodeConnInfo = LocalNodeConnectInfo cModeParams network sockPath

result <- liftIO $ executeLocalStateQueryExpr localNodeConnInfo Nothing $ \_ntcVersion -> runExceptT $ do
result <- liftIO $ executeLocalStateQueryExpr localNodeConnInfo Nothing $ runExceptT $ do
anyE@(AnyCardanoEra era) <- lift $ determineEraExpr cModeParams

case cardanoEraStyle era of
Expand Down Expand Up @@ -284,7 +284,8 @@ runQueryTip (AnyConsensusModeParams cModeParams) network mOutFile = do
CardanoMode -> do
let localNodeConnInfo = LocalNodeConnectInfo cModeParams network sockPath

eLocalState <- liftIO $ executeLocalStateQueryExpr localNodeConnInfo Nothing $ \ntcVersion -> do
eLocalState <- liftIO $ executeLocalStateQueryExpr localNodeConnInfo Nothing $ do
ntcVersion <- ask
era <- queryExpr (QueryCurrentEra CardanoModeIsMultiEra)
eraHistory <- queryExpr (QueryEraHistory CardanoModeIsMultiEra)
mChainBlockNo <- if ntcVersion >= NodeToClientV_10
Expand Down Expand Up @@ -1023,7 +1024,7 @@ runQueryStakePools (AnyConsensusModeParams cModeParams)
let localNodeConnInfo = LocalNodeConnectInfo cModeParams network sockPath

result <- ExceptT . fmap (join . first ShelleyQueryCmdAcquireFailure) $
executeLocalStateQueryExpr localNodeConnInfo Nothing $ \_ntcVersion -> runExceptT @ShelleyQueryCmdError $ do
executeLocalStateQueryExpr localNodeConnInfo Nothing $ runExceptT @ShelleyQueryCmdError $ do
anyE@(AnyCardanoEra era) <- case consensusModeOnly cModeParams of
ByronMode -> return $ AnyCardanoEra ByronEra
ShelleyMode -> return $ AnyCardanoEra ShelleyEra
Expand Down

0 comments on commit 9665b3d

Please sign in to comment.