Skip to content

Commit

Permalink
Better error message for query utxo
Browse files Browse the repository at this point in the history
  • Loading branch information
newhoggy committed Jul 24, 2021
1 parent 3bb844d commit 3cfbe96
Show file tree
Hide file tree
Showing 3 changed files with 72 additions and 32 deletions.
3 changes: 3 additions & 0 deletions cardano-api/src/Cardano/Api.hs
Expand Up @@ -518,6 +518,9 @@ module Cardano.Api (
QueryUTxOFilter(..),
UTxO(..),
queryNodeLocalState,
queryNodeLocalStateWithVersion,
QueryError(..),
MinNodeToClientVersion,

EraHistory(..),
getProgress,
Expand Down
70 changes: 46 additions & 24 deletions cardano-api/src/Cardano/Api/IPC.hs
Expand Up @@ -55,6 +55,7 @@ module Cardano.Api.IPC (
QueryInEra(..),
QueryInShelleyBasedEra(..),
queryNodeLocalState,
queryNodeLocalStateWithVersion,

EraHistory(..),
getProgress,
Expand All @@ -67,7 +68,10 @@ module Cardano.Api.IPC (
ConsensusMode(..),
consensusModeOnly,

NodeToClientVersion(..)
NodeToClientVersion(..),

QueryError(..),
MinNodeToClientVersion
) where

import Prelude
Expand Down Expand Up @@ -114,7 +118,6 @@ import Cardano.Api.Protocol.Types
import Cardano.Api.Query
import Cardano.Api.TxInMode


-- ----------------------------------------------------------------------------
-- The types for the client side of the node-to-client IPC protocols
--
Expand Down Expand Up @@ -161,6 +164,13 @@ data LocalNodeConnectInfo mode =
localNodeSocketPath :: FilePath
}

type MinNodeToClientVersion = NodeToClientVersion

data QueryError
= QueryErrorAcquireFailure !Net.Query.AcquireFailure
| QueryErrorUnsupportedVersion !MinNodeToClientVersion !NodeToClientVersion
deriving (Eq, Show)

localConsensusMode :: LocalNodeConnectInfo mode -> ConsensusMode mode
localConsensusMode LocalNodeConnectInfo {localConsensusModeParams} =
consensusModeOnly localConsensusModeParams
Expand Down Expand Up @@ -480,40 +490,53 @@ queryNodeLocalState :: forall mode result.
LocalNodeConnectInfo mode
-> Maybe ChainPoint
-> QueryInMode mode result
-> IO (Either Net.Query.AcquireFailure result)
queryNodeLocalState connctInfo mpoint query = do
-> IO (Either QueryError result)
queryNodeLocalState = queryNodeLocalStateWithVersion NodeToClientV_1

queryNodeLocalStateWithVersion :: forall mode result.
NodeToClientVersion
-> LocalNodeConnectInfo mode
-> Maybe ChainPoint
-> QueryInMode mode result
-> IO (Either QueryError result)
queryNodeLocalStateWithVersion minNtcVersion connctInfo mpoint query = do
resultVar <- newEmptyTMVarIO
connectToLocalNodeWithVersion
connctInfo
( \_ntcVersion -> LocalNodeClientProtocols
( \ntcVersion -> LocalNodeClientProtocols
{ localChainSyncClient = NoLocalChainSyncClient
, localStateQueryClient = Just (singleQuery mpoint resultVar)
, localStateQueryClient = Just (singleQuery ntcVersion mpoint resultVar)
, localTxSubmissionClient = Nothing
}
)
atomically (takeTMVar resultVar)
where
singleQuery
:: Maybe ChainPoint
-> TMVar (Either Net.Query.AcquireFailure result)
:: NodeToClientVersion
-> Maybe ChainPoint
-> TMVar (Either QueryError result)
-> Net.Query.LocalStateQueryClient (BlockInMode mode) ChainPoint
(QueryInMode mode) IO ()
singleQuery mPointVar' resultVar' =
LocalStateQueryClient $ do
pure $
Net.Query.SendMsgAcquire mPointVar' $
Net.Query.ClientStAcquiring
{ Net.Query.recvMsgAcquired =
pure $ Net.Query.SendMsgQuery query $
Net.Query.ClientStQuerying
{ Net.Query.recvMsgResult = \result -> do
atomically $ putTMVar resultVar' (Right result)

pure $ Net.Query.SendMsgRelease $
pure $ Net.Query.SendMsgDone ()
}
singleQuery ntcVersion mPointVar' resultVar' =
LocalStateQueryClient . pure $ do
Net.Query.SendMsgAcquire mPointVar' $ Net.Query.ClientStAcquiring
{ Net.Query.recvMsgAcquired = do
if ntcVersion >= minNtcVersion
then
pure $ Net.Query.SendMsgQuery query $
Net.Query.ClientStQuerying
{ Net.Query.recvMsgResult = \result -> do
atomically $ putTMVar resultVar' (Right result)

pure $ Net.Query.SendMsgRelease $
pure $ Net.Query.SendMsgDone ()
}
else do
atomically $ putTMVar resultVar' (Left (QueryErrorUnsupportedVersion minNtcVersion ntcVersion))
pure $ Net.Query.SendMsgRelease $
pure $ Net.Query.SendMsgDone ()
, Net.Query.recvMsgFailure = \failure -> do
atomically $ putTMVar resultVar' (Left failure)
atomically $ putTMVar resultVar' (Left (QueryErrorAcquireFailure failure))
pure $ Net.Query.SendMsgDone ()
}

Expand Down Expand Up @@ -581,4 +604,3 @@ chainSyncGetCurrentTip tipVar =
void $ atomically $ tryPutTMVar tipVar tip
pure $ Net.Sync.SendMsgDone ()
}

31 changes: 23 additions & 8 deletions cardano-cli/src/Cardano/CLI/Shelley/Run/Query.hs
Expand Up @@ -84,6 +84,7 @@ data ShelleyQueryCmdError
| ShelleyQueryCmdPoolIdError (Hash StakePoolKey)
| ShelleyQueryCmdEraMismatch !EraMismatch
| ShelleyQueryCmdUnsupportedMode !AnyConsensusMode
| ShelleyQueryCmdUnsupportedVersion !MinNodeToClientVersion !NodeToClientVersion
| ShelleyQueryCmdPastHorizon !Qry.PastHorizonException
| ShelleyQueryCmdSystemStartUnavailable
deriving Show
Expand All @@ -107,6 +108,10 @@ renderShelleyQueryCmdError err =
ShelleyQueryCmdUnsupportedMode mode -> "Unsupported mode: " <> renderMode mode
ShelleyQueryCmdPastHorizon e -> "Past horizon: " <> show e
ShelleyQueryCmdSystemStartUnavailable -> "System start unavailable"
ShelleyQueryCmdUnsupportedVersion minNtcVersion ntcVersion ->
"Unsupported feature for the node-to-client protocol version.\n\
\This query requires at least " <> show minNtcVersion <> " but the node negotiated " <> show ntcVersion <> ".\n\
\Later node versions support later protocol versions (but development protocol versions are not enabled in the node by default)."

runQueryCmd :: QueryCmd -> ExceptT ShelleyQueryCmdError IO ()
runQueryCmd cmd =
Expand Down Expand Up @@ -151,6 +156,7 @@ runQueryProtocolParameters (AnyConsensusModeParams cModeParams) network mOutFile
result <- executeQuery
era
cModeParams
NodeToClientV_1
localNodeConnInfo
query
writeProtocolParameters mOutFile result
Expand Down Expand Up @@ -336,6 +342,7 @@ runQueryUTxO (AnyConsensusModeParams cModeParams)
result <- executeQuery
era
cModeParams
NodeToClientV_9
localNodeConnInfo
qInMode
writeFilteredUTxOs sbe mOutFile result
Expand Down Expand Up @@ -363,7 +370,7 @@ runQueryPoolParams (AnyConsensusModeParams cModeParams) network poolid = do
& hoistMaybe (ShelleyQueryCmdEraConsensusModeMismatch (AnyConsensusMode cMode) anyE)

let qInMode = QueryInEra eInMode . QueryInShelleyBasedEra sbe $ QueryDebugLedgerState
result <- executeQuery era cModeParams localNodeConnInfo qInMode
result <- executeQuery era cModeParams NodeToClientV_1 localNodeConnInfo qInMode
obtainLedgerEraClassConstraints sbe (writePoolParams poolid) result


Expand All @@ -387,7 +394,7 @@ runQueryStakeSnapshot (AnyConsensusModeParams cModeParams) network poolid = do
& hoistMaybe (ShelleyQueryCmdEraConsensusModeMismatch (AnyConsensusMode cMode) anyE)

let qInMode = QueryInEra eInMode . QueryInShelleyBasedEra sbe $ QueryDebugLedgerState
result <- executeQuery era cModeParams localNodeConnInfo qInMode
result <- executeQuery era cModeParams NodeToClientV_1 localNodeConnInfo qInMode
obtainLedgerEraClassConstraints sbe (writeStakeSnapshot poolid) result


Expand All @@ -413,6 +420,7 @@ runQueryLedgerState (AnyConsensusModeParams cModeParams)
result <- executeQuery
era
cModeParams
NodeToClientV_1
localNodeConnInfo
qInMode
obtainLedgerEraClassConstraints sbe (writeLedgerState mOutFile) result
Expand Down Expand Up @@ -441,6 +449,7 @@ runQueryProtocolState (AnyConsensusModeParams cModeParams)
result <- executeQuery
era
cModeParams
NodeToClientV_1
localNodeConnInfo
qInMode
writeProtocolState mOutFile result
Expand Down Expand Up @@ -474,6 +483,7 @@ runQueryStakeAddressInfo (AnyConsensusModeParams cModeParams)
result <- executeQuery
era
cModeParams
NodeToClientV_1
localNodeConnInfo
query
writeStakeAddressInfo mOutFile $ DelegationsAndRewards result
Expand Down Expand Up @@ -734,6 +744,7 @@ runQueryStakeDistribution (AnyConsensusModeParams cModeParams)
result <- executeQuery
era
cModeParams
NodeToClientV_1
localNodeConnInfo
query
writeStakeDistribution mOutFile result
Expand Down Expand Up @@ -823,34 +834,38 @@ determineEra cModeParams localNodeConnInfo =
eraQ <- liftIO . queryNodeLocalState localNodeConnInfo Nothing
$ QueryCurrentEra CardanoModeIsMultiEra
case eraQ of
Left acqFail -> left $ ShelleyQueryCmdAcquireFailure acqFail
Left (QueryErrorAcquireFailure acqFail) -> left $ ShelleyQueryCmdAcquireFailure acqFail
Left (QueryErrorUnsupportedVersion minNtcVersion ntcVersion) -> left $ ShelleyQueryCmdUnsupportedVersion minNtcVersion ntcVersion
Right anyCarEra -> return anyCarEra

executeQuery
:: forall result era mode. CardanoEra era
-> ConsensusModeParams mode
-> NodeToClientVersion
-> LocalNodeConnectInfo mode
-> QueryInMode mode (Either EraMismatch result)
-> ExceptT ShelleyQueryCmdError IO result
executeQuery era cModeP localNodeConnInfo q = do
executeQuery era cModeP minNtcVersion localNodeConnInfo q = do
eraInMode <- calcEraInMode era $ consensusModeOnly cModeP
case eraInMode of
ByronEraInByronMode -> left ShelleyQueryCmdByronEra
_ -> liftIO execQuery >>= queryResult
where
execQuery :: IO (Either AcquireFailure (Either EraMismatch result))
execQuery = queryNodeLocalState localNodeConnInfo Nothing q
execQuery :: IO (Either QueryError (Either EraMismatch result))
execQuery = queryNodeLocalStateWithVersion minNtcVersion localNodeConnInfo Nothing q

getSbe :: CardanoEraStyle era -> ExceptT ShelleyQueryCmdError IO (ShelleyBasedEra era)
getSbe LegacyByronEra = left ShelleyQueryCmdByronEra
getSbe (ShelleyBasedEra sbe) = return sbe

queryResult
:: Either AcquireFailure (Either EraMismatch a)
:: Either QueryError (Either EraMismatch a)
-> ExceptT ShelleyQueryCmdError IO a
queryResult eAcq =
case eAcq of
Left acqFailure -> left $ ShelleyQueryCmdAcquireFailure acqFailure
Left queryError -> case queryError of
QueryErrorAcquireFailure acquireFailure -> left $ ShelleyQueryCmdAcquireFailure acquireFailure
QueryErrorUnsupportedVersion minNtcVersion ntcVersion -> left (ShelleyQueryCmdUnsupportedVersion minNtcVersion ntcVersion)
Right eResult ->
case eResult of
Left err -> left . ShelleyQueryCmdLocalStateQueryError $ EraMismatchError err
Expand Down

0 comments on commit 3cfbe96

Please sign in to comment.