Skip to content

Commit 21c8b27

Browse files
authored
Merge pull request #1471 from input-output-hk/1459-replace-panic-with-exceptions
Replace panic with exceptions
2 parents c73f53f + 9680b0b commit 21c8b27

File tree

45 files changed

+518
-413
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+518
-413
lines changed

cardano-chain-gen/test/Test/Cardano/Db/Mock/Config.hs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ import qualified Cardano.Db as Db
4242
import Cardano.DbSync
4343
import Cardano.DbSync.Config
4444
import Cardano.DbSync.Config.Cardano
45-
import Cardano.DbSync.Error
45+
import Cardano.DbSync.Error (runOrThrowIO)
4646
import Cardano.DbSync.Types (CardanoBlock, MetricSetters (..))
4747
import Cardano.Mock.ChainSync.Server
4848
import Cardano.Mock.Forging.Interpreter
@@ -63,8 +63,7 @@ import Control.Exception (SomeException, bracket)
6363
import Control.Monad (void)
6464
import Control.Monad.Extra (eitherM)
6565
import Control.Monad.Logger (NoLoggingT, runNoLoggingT)
66-
import Control.Monad.Trans.Except.Exit (orDie)
67-
import Control.Monad.Trans.Except.Extra (newExceptT, runExceptT)
66+
import Control.Monad.Trans.Except.Extra (runExceptT)
6867
import Control.Tracer (nullTracer)
6968
import Data.Text (Text)
7069
import qualified Data.Text as Text
@@ -196,7 +195,7 @@ queryDBSync env = Db.runWithConnectionNoLogging (getDBSyncPGPass env)
196195

197196
getPoolLayer :: DBSyncEnv -> IO PoolDataLayer
198197
getPoolLayer env = do
199-
pgconfig <- orDie Db.renderPGPassError $ newExceptT $ Db.readPGPass (enpPGPassSource $ dbSyncParams env)
198+
pgconfig <- runOrThrowIO $ Db.readPGPass (enpPGPassSource $ dbSyncParams env)
200199
pool <- runNoLoggingT $ createPostgresqlPool (Db.toConnectionString pgconfig) 1 -- Pool size of 1 for tests
201200
pure $
202201
postgresqlPoolDataLayer
@@ -206,7 +205,7 @@ getPoolLayer env = do
206205
mkConfig :: FilePath -> FilePath -> CommandLineArgs -> IO Config
207206
mkConfig staticDir mutableDir cmdLineArgs = do
208207
config <- readSyncNodeConfig $ ConfigFile (staticDir </> "test-db-sync-config.json")
209-
genCfg <- either (error . Text.unpack . renderSyncNodeError) id <$> runExceptT (readCardanoGenesisConfig config)
208+
genCfg <- runOrThrowIO $ runExceptT (readCardanoGenesisConfig config)
210209
let (pInfoDbSync, _) = mkProtocolInfoCardano genCfg []
211210
creds <- mkShelleyCredentials $ staticDir </> "pools" </> "bulk1.creds"
212211
let (pInfoForger, forging) = mkProtocolInfoCardano genCfg creds
@@ -231,7 +230,7 @@ mkShelleyCredentials bulkFile = do
231230
-- | staticDir can be shared by tests running in parallel. mutableDir not.
232231
mkSyncNodeParams :: FilePath -> FilePath -> CommandLineArgs -> IO SyncNodeParams
233232
mkSyncNodeParams staticDir mutableDir CommandLineArgs {..} = do
234-
pgconfig <- orDie Db.renderPGPassError $ newExceptT Db.readPGPassDefault
233+
pgconfig <- runOrThrowIO Db.readPGPassDefault
235234
pure $
236235
SyncNodeParams
237236
{ enpConfigFile = ConfigFile $ staticDir </> (if claHasConfigFile then "test-db-sync-config.json" else "")

cardano-db-sync/app/http-get-json-metadata.hs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,9 @@ import Cardano.DbSync (
66
SimplifiedPoolOfflineData (..),
77
httpGetPoolOfflineData,
88
parsePoolUrl,
9-
renderFetchError,
109
)
1110
import Control.Monad.IO.Class (liftIO)
12-
import Control.Monad.Trans.Except (ExceptT)
13-
import Control.Monad.Trans.Except.Exit (orDie)
11+
import Control.Monad.Trans.Except (ExceptT, runExceptT)
1412
import qualified Data.ByteString.Base16 as Base16
1513
import qualified Data.ByteString.Char8 as BS
1614
import qualified Data.Text as Text
@@ -26,6 +24,7 @@ import System.Console.ANSI.Types (
2624
)
2725
import System.Environment (getArgs, getProgName)
2826
import System.Exit (exitFailure)
27+
import Cardano.DbSync.Error (runOrThrowIO)
2928

3029
main :: IO ()
3130
main = do
@@ -60,7 +59,7 @@ usageExit = do
6059

6160
runHttpGet :: PoolUrl -> Maybe PoolMetaHash -> IO ()
6261
runHttpGet poolUrl mHash =
63-
reportSuccess =<< orDie renderFetchError httpGet
62+
reportSuccess =<< runOrThrowIO (runExceptT httpGet)
6463
where
6564
httpGet :: ExceptT FetchError IO SimplifiedPoolOfflineData
6665
httpGet = do

cardano-db-sync/app/test-http-get-json-metadata.hs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ import Cardano.DbSync.Era.Shelley.Offline.Http (
1717
FetchError (..),
1818
httpGetPoolOfflineData,
1919
parsePoolUrl,
20-
renderFetchError,
2120
)
2221
import Control.Monad (foldM)
2322
import Control.Monad.IO.Class (MonadIO)
@@ -28,7 +27,6 @@ import qualified Data.List as List
2827
import qualified Data.List.Extra as List
2928
import Data.Ord (Down (..))
3029
import Data.Text (Text)
31-
import qualified Data.Text.IO as Text
3230
import Database.Esqueleto.Experimental (
3331
SqlBackend,
3432
from,
@@ -65,7 +63,7 @@ main = do
6563
httpGetPoolOfflineData manager request poolUrl mHash
6664
case eres of
6765
Left err -> do
68-
Text.putStrLn $ renderFetchError err
66+
print err
6967
pure $ classifyFetchError accum err
7068
Right _ ->
7169
pure accum

cardano-db-sync/cardano-db-sync.cabal

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -265,7 +265,6 @@ executable http-get-json-metadata
265265
, http-client-tls
266266
, text
267267
, transformers
268-
, transformers-except
269268

270269
executable test-http-get-json-metadata
271270
default-language: Haskell2010

cardano-db-sync/src/Cardano/DbSync.hs

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ module Cardano.DbSync (
2323
SimplifiedPoolOfflineData (..),
2424
httpGetPoolOfflineData,
2525
parsePoolUrl,
26-
renderFetchError,
2726
) where
2827

2928
import Cardano.BM.Trace (Trace, logError, logInfo, logWarning)
@@ -52,22 +51,18 @@ import Cardano.DbSync.Era.Shelley.Offline.Http (
5251
SimplifiedPoolOfflineData (..),
5352
httpGetPoolOfflineData,
5453
parsePoolUrl,
55-
renderFetchError,
5654
spodJson,
5755
)
58-
import Cardano.DbSync.Error
56+
import Cardano.DbSync.Error (SyncNodeError, runOrThrowIO, hasAbortOnPanicEnv)
5957
import Cardano.DbSync.Ledger.State
6058
import Cardano.DbSync.Rollback (unsafeRollback)
6159
import Cardano.DbSync.Sync (runSyncNodeClient)
6260
import Cardano.DbSync.Tracing.ToObjectOrphans ()
6361
import Cardano.DbSync.Types
64-
import Cardano.DbSync.Util (readAbortOnPanic)
6562
import Cardano.Prelude hiding (Nat, (%))
6663
import Cardano.Slotting.Slot (EpochNo (..))
6764
import Control.Concurrent.Async
6865
import Control.Monad.Extra (whenJust)
69-
import Control.Monad.Trans.Except.Exit (orDie)
70-
import Control.Monad.Trans.Except.Extra (newExceptT)
7166
import qualified Data.Text as Text
7267
import Data.Version (showVersion)
7368
import Database.Persist.Postgresql (ConnectionString, withPostgresqlConn)
@@ -82,7 +77,7 @@ runDbSyncNode metricsSetters knownMigrations params =
8277
withIOManager $ \iomgr -> do
8378
trce <- configureLogging params "db-sync-node"
8479

85-
aop <- readAbortOnPanic
80+
aop <- hasAbortOnPanicEnv
8681
startupReport trce aop params
8782

8883
runDbSync metricsSetters knownMigrations iomgr trce params aop
@@ -97,7 +92,7 @@ runDbSync ::
9792
IO ()
9893
runDbSync metricsSetters knownMigrations iomgr trce params aop = do
9994
-- Read the PG connection info
100-
pgConfig <- orDie Db.renderPGPassError $ newExceptT (Db.readPGPass $ enpPGPassSource params)
95+
pgConfig <- runOrThrowIO (Db.readPGPass $ enpPGPassSource params)
10196

10297
mErrors <- liftIO $ Db.validateMigrations dbMigrationDir knownMigrations
10398
whenJust mErrors $ \(unknown, stage4orNewStage3) ->
@@ -106,7 +101,7 @@ runDbSync metricsSetters knownMigrations iomgr trce params aop = do
106101
else do
107102
let msg = Db.renderMigrationValidateError unknown
108103
logError trce msg
109-
panic msg
104+
throwIO unknown
110105

111106
logInfo trce "Schema migration files validated"
112107

@@ -174,7 +169,7 @@ runSyncNode metricsSetters trce iomgr dbConnString ranMigrations runMigrationFnc
174169
logInfo trce $ "Using alonzo genesis file from: " <> (show . unGenesisFile $ dncAlonzoGenesisFile syncNodeConfig)
175170
Db.runIohkLogging trce $
176171
withPostgresqlConn dbConnString $ \backend -> liftIO $ do
177-
orDie renderSyncNodeError $ do
172+
runOrThrowIO $ runExceptT $ do
178173
genCfg <- readCardanoGenesisConfig syncNodeConfig
179174
logProtocolMagicId trce $ genesisProtocolMagicId genCfg
180175

cardano-db-sync/src/Cardano/DbSync/Api.hs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -383,15 +383,15 @@ mkSyncEnvFromConfig trce connString backend syncOptions genCfg syncNodeParams ra
383383
case genCfg of
384384
GenesisCardano _ bCfg sCfg _
385385
| unProtocolMagicId (Byron.configProtocolMagicId bCfg) /= Shelley.sgNetworkMagic (scConfig sCfg) ->
386-
pure . Left . NECardanoConfig $
386+
pure . Left . SNErrCardanoConfig $
387387
mconcat
388388
[ "ProtocolMagicId "
389389
, DB.textShow (unProtocolMagicId $ Byron.configProtocolMagicId bCfg)
390390
, " /= "
391391
, DB.textShow (Shelley.sgNetworkMagic $ scConfig sCfg)
392392
]
393393
| Byron.gdStartTime (Byron.configGenesisData bCfg) /= Shelley.sgSystemStart (scConfig sCfg) ->
394-
pure . Left . NECardanoConfig $
394+
pure . Left . SNErrCardanoConfig $
395395
mconcat
396396
[ "SystemStart "
397397
, DB.textShow (Byron.gdStartTime $ Byron.configGenesisData bCfg)

cardano-db-sync/src/Cardano/DbSync/Cache/Epoch.hs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ writeEpochBlockDiffToCache ::
7171
ReaderT SqlBackend m (Either SyncNodeError ())
7272
writeEpochBlockDiffToCache cache epCurrent =
7373
case cache of
74-
UninitiatedCache -> pure $ Left $ NEError "writeEpochBlockDiffToCache: Cache is UninitiatedCache"
74+
UninitiatedCache -> pure $ Left $ SNErrDefault "writeEpochBlockDiffToCache: Cache is UninitiatedCache"
7575
Cache ci -> do
7676
cE <- liftIO $ readTVarIO (cEpoch ci)
7777
case (ceMapEpoch cE, ceEpochBlockDiff cE) of
@@ -93,12 +93,12 @@ writeToMapEpochCache syncEnv cache latestEpoch = do
9393
HasLedger hle -> getSecurityParameter $ leProtocolInfo hle
9494
NoLedger nle -> getSecurityParameter $ nleProtocolInfo nle
9595
case cache of
96-
UninitiatedCache -> pure $ Left $ NEError "writeToMapEpochCache: Cache is UninitiatedCache"
96+
UninitiatedCache -> pure $ Left $ SNErrDefault "writeToMapEpochCache: Cache is UninitiatedCache"
9797
Cache ci -> do
9898
-- get EpochBlockDiff so we can use the BlockId we stored when inserting blocks
9999
epochInternalCE <- readEpochBlockDiffFromCache cache
100100
case epochInternalCE of
101-
Nothing -> pure $ Left $ NEError "writeToMapEpochCache: No epochInternalEpochCache"
101+
Nothing -> pure $ Left $ SNErrDefault "writeToMapEpochCache: No epochInternalEpochCache"
102102
Just ei -> do
103103
cE <- liftIO $ readTVarIO (cEpoch ci)
104104
let currentBlockId = ebdBlockId ei

cardano-db-sync/src/Cardano/DbSync/Config.hs

Lines changed: 7 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,10 @@ import qualified Cardano.BM.Setup as Logging
2727
import Cardano.BM.Trace (Trace)
2828
import qualified Cardano.BM.Trace as Logging
2929
import Cardano.DbSync.Config.Cardano
30-
import Cardano.DbSync.Config.Node
30+
import Cardano.DbSync.Config.Node (NodeConfig(..), parseSyncPreConfig, readByteStringFromFile, parseNodeConfig)
3131
import Cardano.DbSync.Config.Shelley
3232
import Cardano.DbSync.Config.Types
33-
import Cardano.DbSync.Util
3433
import Cardano.Prelude
35-
import qualified Data.ByteString.Char8 as BS
36-
import qualified Data.Text as Text
37-
import qualified Data.Yaml as Yaml
3834
import System.FilePath (takeDirectory, (</>))
3935

4036
configureLogging :: SyncNodeParams -> Text -> IO (Trace IO Text)
@@ -48,19 +44,14 @@ configureLogging params loggingName = do
4844

4945
readSyncNodeConfig :: ConfigFile -> IO SyncNodeConfig
5046
readSyncNodeConfig (ConfigFile fp) = do
51-
pcfg <- adjustNodeFilePath . parseSyncPreConfig <$> readByteString fp "DbSync"
52-
ncfg <- parseNodeConfig <$> readByteString (pcNodeConfigFilePath pcfg) "node"
47+
pcfg <- (adjustNodeFilePath . parseSyncPreConfig) =<< readByteStringFromFile fp "DbSync"
48+
ncfg <- parseNodeConfig =<< readByteStringFromFile (pcNodeConfigFilePath pcfg) "node"
5349
coalesceConfig pcfg ncfg (mkAdjustPath pcfg)
5450
where
55-
parseSyncPreConfig :: ByteString -> SyncPreConfig
56-
parseSyncPreConfig bs =
57-
case Yaml.decodeEither' bs of
58-
Left err -> panic $ "readSyncNodeConfig: Error parsing config: " <> textShow err
59-
Right res -> res
60-
61-
adjustNodeFilePath :: SyncPreConfig -> SyncPreConfig
62-
adjustNodeFilePath cfg =
63-
cfg {pcNodeConfigFile = adjustNodeConfigFilePath (takeDirectory fp </>) (pcNodeConfigFile cfg)}
51+
adjustNodeFilePath :: IO SyncPreConfig -> IO SyncPreConfig
52+
adjustNodeFilePath spc = do
53+
cfg <- spc
54+
pure $ cfg {pcNodeConfigFile = adjustNodeConfigFilePath (takeDirectory fp </>) (pcNodeConfigFile cfg)}
6455

6556
coalesceConfig ::
6657
SyncPreConfig ->
@@ -97,8 +88,3 @@ coalesceConfig pcfg ncfg adjustGenesisPath = do
9788

9889
mkAdjustPath :: SyncPreConfig -> (FilePath -> FilePath)
9990
mkAdjustPath cfg fp = takeDirectory (pcNodeConfigFilePath cfg) </> fp
100-
101-
readByteString :: FilePath -> Text -> IO ByteString
102-
readByteString fp cfgType =
103-
catch (BS.readFile fp) $ \(_ :: IOException) ->
104-
panic $ mconcat ["Cannot find the ", cfgType, " configuration file at : ", Text.pack fp]

cardano-db-sync/src/Cardano/DbSync/Config/Alonzo.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ readAlonzoGenesisConfig ::
2626
ExceptT SyncNodeError IO AlonzoGenesis
2727
readAlonzoGenesisConfig enc = do
2828
let file = unGenesisFile $ dncAlonzoGenesisFile enc
29-
firstExceptT (NEAlonzoConfig file . renderAlonzoGenesisError) $
29+
firstExceptT (SNErrAlonzoConfig file . renderAlonzoGenesisError) $
3030
readGenesis (GenesisFile file) Nothing
3131

3232
data AlonzoGenesisError

cardano-db-sync/src/Cardano/DbSync/Config/Byron.hs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
{-# LANGUAGE FlexibleInstances #-}
22
{-# LANGUAGE MultiParamTypeClasses #-}
3-
{-# LANGUAGE OverloadedStrings #-}
43
{-# LANGUAGE RankNTypes #-}
54

65
module Cardano.DbSync.Config.Byron (
@@ -20,8 +19,8 @@ readByronGenesisConfig ::
2019
readByronGenesisConfig enc = do
2120
let file = unGenesisFile $ dncByronGenesisFile enc
2221
genHash <-
23-
firstExceptT NEError
22+
firstExceptT SNErrDefault
2423
. hoistEither
2524
$ decodeAbstractHash (unGenesisHashByron $ dncByronGenesisHash enc)
26-
firstExceptT (NEByronConfig file) $
25+
firstExceptT (SNErrByronConfig file) $
2726
Byron.mkConfigFromFile (dncRequiresNetworkMagic enc) file genHash

0 commit comments

Comments
 (0)