time-warp-0.1.1.2: Distributed systems execution emulation

Copyright(c) Serokell, 2016
LicenseGPL-3 (see the file LICENSE)
MaintainerSerokell <hi@serokell.io>
Stabilityexperimental
PortabilityPOSIX, GHC
Safe HaskellNone
LanguageHaskell2010

Control.TimeWarp.Rpc.PureRpc

Description

Defines network-emulated implementation of MonadRpc. Threads and time are also emulated via TimedT.

Synopsis

Documentation

data PureRpc m a Source #

Implementation of RPC protocol for emulation, allows to manually define network nastiness via Delays datatype. TCP model is used.

List of known issues:

  • Method, once being declared in net, can't be removed. Even throwTo won't help.
  • In implementation, remote method is actually inlined at call position, so instance WithNamedLogger would refer to caller's logger name, not server's one.

Instances

MonadTrans PureRpc Source # 

Methods

lift :: Monad m => m a -> PureRpc m a #

MonadState s m => MonadState s (PureRpc m) Source # 

Methods

get :: PureRpc m s #

put :: s -> PureRpc m () #

state :: (s -> (a, s)) -> PureRpc m a #

Monad (PureRpc m) Source # 

Methods

(>>=) :: PureRpc m a -> (a -> PureRpc m b) -> PureRpc m b #

(>>) :: PureRpc m a -> PureRpc m b -> PureRpc m b #

return :: a -> PureRpc m a #

fail :: String -> PureRpc m a #

Functor (PureRpc m) Source # 

Methods

fmap :: (a -> b) -> PureRpc m a -> PureRpc m b #

(<$) :: a -> PureRpc m b -> PureRpc m a #

Applicative (PureRpc m) Source # 

Methods

pure :: a -> PureRpc m a #

(<*>) :: PureRpc m (a -> b) -> PureRpc m a -> PureRpc m b #

(*>) :: PureRpc m a -> PureRpc m b -> PureRpc m b #

(<*) :: PureRpc m a -> PureRpc m b -> PureRpc m a #

MonadThrow m => MonadThrow (PureRpc m) Source # 

Methods

throwM :: Exception e => e -> PureRpc m a #

MonadIO m => MonadIO (PureRpc m) Source # 

Methods

liftIO :: IO a -> PureRpc m a #

MonadCatch m => MonadCatch (PureRpc m) Source # 

Methods

catch :: Exception e => PureRpc m a -> (e -> PureRpc m a) -> PureRpc m a #

(MonadIO m, MonadCatch m) => MonadMask (PureRpc m) Source # 

Methods

mask :: ((forall a. PureRpc m a -> PureRpc m a) -> PureRpc m b) -> PureRpc m b #

uninterruptibleMask :: ((forall a. PureRpc m a -> PureRpc m a) -> PureRpc m b) -> PureRpc m b #

WithNamedLogger (PureRpc m) Source # 
(MonadIO m, MonadCatch m) => MonadTimed (PureRpc m) Source # 
(MonadIO m, MonadCatch m) => MonadRpc (PureRpc m) Source # 
type ThreadId (PureRpc m) Source # 

runPureRpc :: (MonadIO m, MonadCatch m, DelaysSpecifier delays) => StdGen -> delays -> PureRpc m a -> m a Source #

Launches distributed scenario, emulating work of network.

class DelaysSpecifier d where Source #

Describes network nastiness.

Minimal complete definition

toDelays

Methods

toDelays :: d -> Delays Source #

Instances

DelaysSpecifier () Source #

Connection is never established.

Methods

toDelays :: () -> Delays Source #

DelaysSpecifier Microsecond Source #

Specifies permanent connection delay.

DelaysSpecifier Delays Source #

Detailed description of network nastiness.

DelaysSpecifier (Microsecond, Microsecond) Source #

Connection delay varies is specified range.

newtype Delays Source #

Allows to describe most complicated behaviour of network.

Examples:

  • Always 1 second delay:
Delays $ \_ _ -> return $ ConnectedIn (interval 1 sec)
  • Delay varies between 1 and 5 seconds (with granularity of 1 mcs):
Delays $ \_ _ -> ConnectedIn <$> getRandomTR (interval 1 sec, interval 5 sec)
  • For first 10 seconds after scenario start connection is established with probability of 1/6:
Delays $ \_ time -> do
    p <- getRandomR (0, 5)
    if (p == 0) && (time <= interval 10 sec)
        then return $ ConnectedIn 0
        else return NeverConnected
  • Node with address isolatedAddr is not accessible:
Delays $ \serverAddr _ ->
    return if serverAddr == isolatedAddr
           then NeverConnected
           else ConnectedIn 0

Constructors

Delays 

Fields

Instances

Show Delays Source # 
Default Delays Source #

Describes reliable network.

Methods

def :: Delays #

DelaysSpecifier Delays Source #

Detailed description of network nastiness.

data ConnectionOutcome Source #

Describes obstructions occured on executing RPC request.

Constructors

ConnectedIn Microsecond

Connection established in specified amout of time.

NeverConnected

Connection would be never established, client hangs.

getRandomTR :: MonadRandom m => (Microsecond, Microsecond) -> m Microsecond Source #

Return a randomly-selected time value in specified range.