{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Ouroboros.Consensus.Node.Exit
(
ExitFailure
, exitReasontoExitFailure
, ExitReason (..)
, toExitReason
) where
import Control.Exception (AsyncException (..), SomeException,
fromException)
import Control.Monad.Class.MonadAsync (ExceptionInLinkedThread (..))
import Ouroboros.Consensus.Storage.ChainDB.API (ChainDbFailure (..))
import Ouroboros.Consensus.Storage.FS.API.Types (FsError (..),
FsErrorType (..))
import Ouroboros.Consensus.Storage.ImmutableDB.API (ImmutableDBError)
import qualified Ouroboros.Consensus.Storage.ImmutableDB.API as ImmutableDB
import Ouroboros.Consensus.Storage.VolatileDB (VolatileDBError)
import qualified Ouroboros.Consensus.Storage.VolatileDB as VolatileDB
import Ouroboros.Consensus.Node.DbMarker (DbMarkerError)
type ExitFailure = Int
exitReasontoExitFailure :: ExitReason -> ExitFailure
exitReasontoExitFailure :: ExitReason -> ExitFailure
exitReasontoExitFailure = \case
ExitReason
ConfigurationError -> ExitFailure
3
ExitReason
WrongDatabase -> ExitFailure
4
ExitReason
DiskFull -> ExitFailure
5
ExitReason
InsufficientPermissions -> ExitFailure
6
ExitReason
NoNetwork -> ExitFailure
7
ExitReason
Killed -> ExitFailure
1
ExitReason
DatabaseCorruption -> ExitFailure
2
ExitReason
Other -> ExitFailure
2
data ExitReason =
Killed
| ConfigurationError
| WrongDatabase
| DiskFull
| InsufficientPermissions
| NoNetwork
| DatabaseCorruption
| Other
toExitReason :: SomeException -> ExitReason
toExitReason :: SomeException -> ExitReason
toExitReason SomeException
e
| Just (AsyncException
e' :: AsyncException) <- SomeException -> Maybe AsyncException
forall e. Exception e => SomeException -> Maybe e
fromException SomeException
e
= case AsyncException
e' of
AsyncException
ThreadKilled -> ExitReason
Killed
AsyncException
UserInterrupt -> ExitReason
Killed
AsyncException
_ -> ExitReason
Other
| Just (ExceptionInLinkedThread String
_ SomeException
e') <- SomeException -> Maybe ExceptionInLinkedThread
forall e. Exception e => SomeException -> Maybe e
fromException SomeException
e
= SomeException -> ExitReason
toExitReason SomeException
e'
| Just (DbMarkerError
_ :: DbMarkerError) <- SomeException -> Maybe DbMarkerError
forall e. Exception e => SomeException -> Maybe e
fromException SomeException
e
= ExitReason
WrongDatabase
| Just (ChainDbFailure
e' :: ChainDbFailure) <- SomeException -> Maybe ChainDbFailure
forall e. Exception e => SomeException -> Maybe e
fromException SomeException
e
= case ChainDbFailure
e' of
LgrDbFailure FsError
fe -> FsError -> ExitReason
fsError FsError
fe
ChainDbFailure
_ -> ExitReason
DatabaseCorruption
| Just (VolatileDBError
e' :: VolatileDBError) <- SomeException -> Maybe VolatileDBError
forall e. Exception e => SomeException -> Maybe e
fromException SomeException
e
= case VolatileDBError
e' of
VolatileDB.UnexpectedFailure UnexpectedFailure
uf -> UnexpectedFailure -> ExitReason
volatileDbUnexpectedFailure UnexpectedFailure
uf
VolatileDBError
_ -> ExitReason
Other
| Just (ImmutableDBError
e' :: ImmutableDBError) <- SomeException -> Maybe ImmutableDBError
forall e. Exception e => SomeException -> Maybe e
fromException SomeException
e
= case ImmutableDBError
e' of
ImmutableDB.UnexpectedFailure UnexpectedFailure
uf -> UnexpectedFailure -> ExitReason
immutableDbUnexpectedFailure UnexpectedFailure
uf
ImmutableDBError
_ -> ExitReason
Other
| Just (FsError
e' :: FsError) <- SomeException -> Maybe FsError
forall e. Exception e => SomeException -> Maybe e
fromException SomeException
e
= FsError -> ExitReason
fsError FsError
e'
| Bool
otherwise
= ExitReason
Other
where
immutableDbUnexpectedFailure :: ImmutableDB.UnexpectedFailure -> ExitReason
immutableDbUnexpectedFailure :: UnexpectedFailure -> ExitReason
immutableDbUnexpectedFailure = \case
ImmutableDB.FileSystemError FsError
fe -> FsError -> ExitReason
fsError FsError
fe
UnexpectedFailure
_ -> ExitReason
DatabaseCorruption
volatileDbUnexpectedFailure :: VolatileDB.UnexpectedFailure -> ExitReason
volatileDbUnexpectedFailure :: UnexpectedFailure -> ExitReason
volatileDbUnexpectedFailure = \case
VolatileDB.FileSystemError FsError
fe -> FsError -> ExitReason
fsError FsError
fe
UnexpectedFailure
_ -> ExitReason
DatabaseCorruption
fsError :: FsError -> ExitReason
fsError :: FsError -> ExitReason
fsError FsError { FsErrorType
fsErrorType :: FsError -> FsErrorType
fsErrorType :: FsErrorType
fsErrorType } = case FsErrorType
fsErrorType of
FsErrorType
FsDeviceFull -> ExitReason
DiskFull
FsErrorType
FsInsufficientPermissions -> ExitReason
InsufficientPermissions
FsErrorType
_ -> ExitReason
DatabaseCorruption