libraft-0.4.1.0: Raft consensus algorithm

Safe HaskellNone
LanguageHaskell2010

Raft.Client

Contents

Synopsis

Raft Interface

class RaftSendClient m sm v where Source #

Interface for Raft nodes to send messages to clients

TODO It would be really nice if RSMP was a superclass, but currently this can't happen because of cyclic imports.

Methods

sendClient :: ClientId -> ClientResponse sm v -> m () Source #

Instances
(Monad m, RaftSendClient m sm v) => RaftSendClient (RaftPostgresT m) sm v Source # 
Instance details

Defined in Raft.Log.PostgreSQL

(MonadIO m, MonadMask m, RaftSendClient m sm v) => RaftSendClient (RaftPersistFileStoreT m) sm v Source # 
Instance details

Defined in Examples.Raft.FileStore.Persistent

(Monad m, RaftSendClient m sm v) => RaftSendClient (RaftLogFileStoreT m) sm v Source # 
Instance details

Defined in Examples.Raft.FileStore.Log

(MonadMask m, MonadCatch m, MonadIO m, Serialize sm, Serialize v) => RaftSendClient (RaftSocketT sm v m) sm v Source # 
Instance details

Defined in Examples.Raft.Socket.Node

Methods

sendClient :: ClientId -> ClientResponse sm v -> RaftSocketT sm v m () Source #

class Show (RaftRecvClientError m v) => RaftRecvClient m v where Source #

Interface for Raft nodes to receive messages from clients

Associated Types

type RaftRecvClientError m v Source #

newtype SerialNum Source #

Constructors

SerialNum Natural 
Instances
Enum SerialNum Source # 
Instance details

Defined in Raft.Types

Eq SerialNum Source # 
Instance details

Defined in Raft.Types

Num SerialNum Source # 
Instance details

Defined in Raft.Types

Ord SerialNum Source # 
Instance details

Defined in Raft.Types

Read SerialNum Source # 
Instance details

Defined in Raft.Types

Show SerialNum Source # 
Instance details

Defined in Raft.Types

Generic SerialNum Source # 
Instance details

Defined in Raft.Types

Associated Types

type Rep SerialNum :: Type -> Type #

Serialize SerialNum Source # 
Instance details

Defined in Raft.Types

type Rep SerialNum Source # 
Instance details

Defined in Raft.Types

type Rep SerialNum = D1 (MetaData "SerialNum" "Raft.Types" "libraft-0.4.1.0-EJnveHOf7pz4UG8saKrZJp" True) (C1 (MetaCons "SerialNum" PrefixI False) (S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 Natural)))

Client Requests

data ClientRequest v Source #

Representation of a client request coupled with the client id

Constructors

ClientRequest ClientId (ClientReq v) 
Instances
Show v => Show (ClientRequest v) Source # 
Instance details

Defined in Raft.Client

Generic (ClientRequest v) Source # 
Instance details

Defined in Raft.Client

Associated Types

type Rep (ClientRequest v) :: Type -> Type #

Serialize v => Serialize (ClientRequest v) Source # 
Instance details

Defined in Raft.Client

type Rep (ClientRequest v) Source # 
Instance details

Defined in Raft.Client

type Rep (ClientRequest v) = D1 (MetaData "ClientRequest" "Raft.Client" "libraft-0.4.1.0-EJnveHOf7pz4UG8saKrZJp" False) (C1 (MetaCons "ClientRequest" PrefixI False) (S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 ClientId) :*: S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 (ClientReq v))))

data ClientReq v Source #

Representation of a client request

Constructors

ClientReadReq ClientReadReq

Request the latest state of the state machine

ClientWriteReq SerialNum v

Write a command

Instances
Show v => Show (ClientReq v) Source # 
Instance details

Defined in Raft.Client

Generic (ClientReq v) Source # 
Instance details

Defined in Raft.Client

Associated Types

type Rep (ClientReq v) :: Type -> Type #

Methods

from :: ClientReq v -> Rep (ClientReq v) x #

to :: Rep (ClientReq v) x -> ClientReq v #

Serialize v => Serialize (ClientReq v) Source # 
Instance details

Defined in Raft.Client

Methods

put :: Putter (ClientReq v) #

get :: Get (ClientReq v) #

type Rep (ClientReq v) Source # 
Instance details

Defined in Raft.Client

data ClientReadReq Source #

Instances
Show ClientReadReq Source # 
Instance details

Defined in Raft.Client

Generic ClientReadReq Source # 
Instance details

Defined in Raft.Client

Associated Types

type Rep ClientReadReq :: Type -> Type #

Serialize ClientReadReq Source # 
Instance details

Defined in Raft.Client

type Rep ClientReadReq Source # 
Instance details

Defined in Raft.Client

type Rep ClientReadReq = D1 (MetaData "ClientReadReq" "Raft.Client" "libraft-0.4.1.0-EJnveHOf7pz4UG8saKrZJp" False) (C1 (MetaCons "ClientReadEntries" PrefixI False) (S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 ReadEntriesSpec)) :+: C1 (MetaCons "ClientReadStateMachine" PrefixI False) (U1 :: Type -> Type))

data ReadEntriesSpec Source #

Instances
Show ReadEntriesSpec Source # 
Instance details

Defined in Raft.Log

Generic ReadEntriesSpec Source # 
Instance details

Defined in Raft.Log

Associated Types

type Rep ReadEntriesSpec :: Type -> Type #

Serialize ReadEntriesSpec Source # 
Instance details

Defined in Raft.Log

type Rep ReadEntriesSpec Source # 
Instance details

Defined in Raft.Log

Client Responses

data ClientResponse sm v Source #

The datatype sent back to the client as an actual response

Constructors

ClientReadResponse (ClientReadResp sm v)

Respond with the latest state of the state machine.

ClientWriteResponse ClientWriteResp

Respond with the index of the entry appended to the log

ClientRedirectResponse ClientRedirResp

Respond with the node id of the current leader

Instances
(Show sm, Show v) => Show (ClientResponse sm v) Source # 
Instance details

Defined in Raft.Client

Generic (ClientResponse sm v) Source # 
Instance details

Defined in Raft.Client

Associated Types

type Rep (ClientResponse sm v) :: Type -> Type #

Methods

from :: ClientResponse sm v -> Rep (ClientResponse sm v) x #

to :: Rep (ClientResponse sm v) x -> ClientResponse sm v #

(Serialize sm, Serialize v) => Serialize (ClientResponse sm v) Source # 
Instance details

Defined in Raft.Client

Methods

put :: Putter (ClientResponse sm v) #

get :: Get (ClientResponse sm v) #

type Rep (ClientResponse sm v) Source # 
Instance details

Defined in Raft.Client

data ClientRespSpec sm Source #

Specification for the data inside a ClientResponse

Instances
Show sm => Show (ClientRespSpec sm) Source # 
Instance details

Defined in Raft.Client

Generic (ClientRespSpec sm) Source # 
Instance details

Defined in Raft.Client

Associated Types

type Rep (ClientRespSpec sm) :: Type -> Type #

Methods

from :: ClientRespSpec sm -> Rep (ClientRespSpec sm) x #

to :: Rep (ClientRespSpec sm) x -> ClientRespSpec sm #

Serialize sm => Serialize (ClientRespSpec sm) Source # 
Instance details

Defined in Raft.Client

type Rep (ClientRespSpec sm) Source # 
Instance details

Defined in Raft.Client

data ClientReadRespSpec sm Source #

Instances
Show sm => Show (ClientReadRespSpec sm) Source # 
Instance details

Defined in Raft.Client

Generic (ClientReadRespSpec sm) Source # 
Instance details

Defined in Raft.Client

Associated Types

type Rep (ClientReadRespSpec sm) :: Type -> Type #

Serialize sm => Serialize (ClientReadRespSpec sm) Source # 
Instance details

Defined in Raft.Client

type Rep (ClientReadRespSpec sm) Source # 
Instance details

Defined in Raft.Client

type Rep (ClientReadRespSpec sm) = D1 (MetaData "ClientReadRespSpec" "Raft.Client" "libraft-0.4.1.0-EJnveHOf7pz4UG8saKrZJp" False) (C1 (MetaCons "ClientReadRespSpecEntries" PrefixI False) (S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 ReadEntriesSpec)) :+: C1 (MetaCons "ClientReadRespSpecStateMachine" PrefixI False) (S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 sm)))

data ClientReadResp sm v Source #

Representation of a read response to a client

Instances
(Show sm, Show v) => Show (ClientReadResp sm v) Source # 
Instance details

Defined in Raft.Client

Generic (ClientReadResp sm v) Source # 
Instance details

Defined in Raft.Client

Associated Types

type Rep (ClientReadResp sm v) :: Type -> Type #

Methods

from :: ClientReadResp sm v -> Rep (ClientReadResp sm v) x #

to :: Rep (ClientReadResp sm v) x -> ClientReadResp sm v #

(Serialize sm, Serialize v) => Serialize (ClientReadResp sm v) Source # 
Instance details

Defined in Raft.Client

Methods

put :: Putter (ClientReadResp sm v) #

get :: Get (ClientReadResp sm v) #

type Rep (ClientReadResp sm v) Source # 
Instance details

Defined in Raft.Client

type Rep (ClientReadResp sm v) = D1 (MetaData "ClientReadResp" "Raft.Client" "libraft-0.4.1.0-EJnveHOf7pz4UG8saKrZJp" False) (C1 (MetaCons "ClientReadRespStateMachine" PrefixI False) (S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 sm)) :+: (C1 (MetaCons "ClientReadRespEntry" PrefixI False) (S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 (Entry v))) :+: C1 (MetaCons "ClientReadRespEntries" PrefixI False) (S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 (Entries v)))))

data ClientWriteResp Source #

Representation of a write response to a client

Constructors

ClientWriteResp Index SerialNum

Index of the entry appended to the log due to the previous client request

Instances
Show ClientWriteResp Source # 
Instance details

Defined in Raft.Client

Generic ClientWriteResp Source # 
Instance details

Defined in Raft.Client

Associated Types

type Rep ClientWriteResp :: Type -> Type #

Serialize ClientWriteResp Source # 
Instance details

Defined in Raft.Client

type Rep ClientWriteResp Source # 
Instance details

Defined in Raft.Client

data ClientRedirResp Source #

Representation of a redirect response to a client

Instances
Show ClientRedirResp Source # 
Instance details

Defined in Raft.Client

Generic ClientRedirResp Source # 
Instance details

Defined in Raft.Client

Associated Types

type Rep ClientRedirResp :: Type -> Type #

Serialize ClientRedirResp Source # 
Instance details

Defined in Raft.Client

type Rep ClientRedirResp Source # 
Instance details

Defined in Raft.Client

type Rep ClientRedirResp = D1 (MetaData "ClientRedirResp" "Raft.Client" "libraft-0.4.1.0-EJnveHOf7pz4UG8saKrZJp" False) (C1 (MetaCons "ClientRedirResp" PrefixI False) (S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 CurrentLeader)))

Client Interface

class Monad m => RaftClientSend m v where Source #

Associated Types

type RaftClientSendError m v Source #

Instances
RaftClientSend m v => RaftClientSend (RaftClientT s v m) v Source # 
Instance details

Defined in Raft.Client

Associated Types

type RaftClientSendError (RaftClientT s v m) v :: Type Source #

(Serialize s, Serialize v, MonadIO m) => RaftClientSend (RaftClientRespChanT s v m) v Source # 
Instance details

Defined in Examples.Raft.Socket.Client

Associated Types

type RaftClientSendError (RaftClientRespChanT s v m) v :: Type Source #

class Monad m => RaftClientRecv m sm v | m sm -> v where Source #

Associated Types

type RaftClientRecvError m sm Source #

Instances
RaftClientRecv m s v => RaftClientRecv (RaftClientT s v m) s v Source # 
Instance details

Defined in Raft.Client

Associated Types

type RaftClientRecvError (RaftClientT s v m) s :: Type Source #

(Serialize s, Serialize v, MonadIO m) => RaftClientRecv (RaftClientRespChanT s v m) s v Source # 
Instance details

Defined in Examples.Raft.Socket.Client

Associated Types

type RaftClientRecvError (RaftClientRespChanT s v m) s :: Type Source #

data RaftClientState Source #

Each client may have at most one command outstanding at a time and commands must be dispatched in serial number order.

Instances
Monad m => MonadState RaftClientState (RaftClientT s v m) Source # 
Instance details

Defined in Raft.Client

data RaftClientEnv Source #

Constructors

RaftClientEnv 
Instances
Monad m => MonadReader RaftClientEnv (RaftClientT s v m) Source # 
Instance details

Defined in Raft.Client

Methods

ask :: RaftClientT s v m RaftClientEnv #

local :: (RaftClientEnv -> RaftClientEnv) -> RaftClientT s v m a -> RaftClientT s v m a #

reader :: (RaftClientEnv -> a) -> RaftClientT s v m a #

data RaftClientT s v m a Source #

Instances
MonadBase IO m => MonadBase IO (RaftClientT s v m) Source # 
Instance details

Defined in Raft.Client

Methods

liftBase :: IO α -> RaftClientT s v m α #

MonadBaseControl IO m => MonadBaseControl IO (RaftClientT s v m) Source # 
Instance details

Defined in Raft.Client

Associated Types

type StM (RaftClientT s v m) a :: Type #

Methods

liftBaseWith :: (RunInBase (RaftClientT s v m) IO -> IO a) -> RaftClientT s v m a #

restoreM :: StM (RaftClientT s v m) a -> RaftClientT s v m a #

Monad m => MonadState RaftClientState (RaftClientT s v m) Source # 
Instance details

Defined in Raft.Client

Monad m => MonadReader RaftClientEnv (RaftClientT s v m) Source # 
Instance details

Defined in Raft.Client

Methods

ask :: RaftClientT s v m RaftClientEnv #

local :: (RaftClientEnv -> RaftClientEnv) -> RaftClientT s v m a -> RaftClientT s v m a #

reader :: (RaftClientEnv -> a) -> RaftClientT s v m a #

MonadTrans (RaftClientT s v) Source # 
Instance details

Defined in Raft.Client

Methods

lift :: Monad m => m a -> RaftClientT s v m a #

MonadTransControl (RaftClientT s v) Source # 
Instance details

Defined in Raft.Client

Associated Types

type StT (RaftClientT s v) a :: Type #

Methods

liftWith :: Monad m => (Run (RaftClientT s v) -> m a) -> RaftClientT s v m a #

restoreT :: Monad m => m (StT (RaftClientT s v) a) -> RaftClientT s v m a #

Monad m => Monad (RaftClientT s v m) Source # 
Instance details

Defined in Raft.Client

Methods

(>>=) :: RaftClientT s v m a -> (a -> RaftClientT s v m b) -> RaftClientT s v m b #

(>>) :: RaftClientT s v m a -> RaftClientT s v m b -> RaftClientT s v m b #

return :: a -> RaftClientT s v m a #

fail :: String -> RaftClientT s v m a #

Functor m => Functor (RaftClientT s v m) Source # 
Instance details

Defined in Raft.Client

Methods

fmap :: (a -> b) -> RaftClientT s v m a -> RaftClientT s v m b #

(<$) :: a -> RaftClientT s v m b -> RaftClientT s v m a #

MonadFail m => MonadFail (RaftClientT s v m) Source # 
Instance details

Defined in Raft.Client

Methods

fail :: String -> RaftClientT s v m a #

Monad m => Applicative (RaftClientT s v m) Source # 
Instance details

Defined in Raft.Client

Methods

pure :: a -> RaftClientT s v m a #

(<*>) :: RaftClientT s v m (a -> b) -> RaftClientT s v m a -> RaftClientT s v m b #

liftA2 :: (a -> b -> c) -> RaftClientT s v m a -> RaftClientT s v m b -> RaftClientT s v m c #

(*>) :: RaftClientT s v m a -> RaftClientT s v m b -> RaftClientT s v m b #

(<*) :: RaftClientT s v m a -> RaftClientT s v m b -> RaftClientT s v m a #

MonadPlus m => Alternative (RaftClientT s v m) Source # 
Instance details

Defined in Raft.Client

Methods

empty :: RaftClientT s v m a #

(<|>) :: RaftClientT s v m a -> RaftClientT s v m a -> RaftClientT s v m a #

some :: RaftClientT s v m a -> RaftClientT s v m [a] #

many :: RaftClientT s v m a -> RaftClientT s v m [a] #

MonadPlus m => MonadPlus (RaftClientT s v m) Source # 
Instance details

Defined in Raft.Client

Methods

mzero :: RaftClientT s v m a #

mplus :: RaftClientT s v m a -> RaftClientT s v m a -> RaftClientT s v m a #

MonadIO m => MonadIO (RaftClientT s v m) Source # 
Instance details

Defined in Raft.Client

Methods

liftIO :: IO a -> RaftClientT s v m a #

MonadThrow m => MonadThrow (RaftClientT s v m) Source # 
Instance details

Defined in Raft.Client

Methods

throwM :: Exception e => e -> RaftClientT s v m a #

MonadCatch m => MonadCatch (RaftClientT s v m) Source # 
Instance details

Defined in Raft.Client

Methods

catch :: Exception e => RaftClientT s v m a -> (e -> RaftClientT s v m a) -> RaftClientT s v m a #

MonadMask m => MonadMask (RaftClientT s v m) Source # 
Instance details

Defined in Raft.Client

Methods

mask :: ((forall a. RaftClientT s v m a -> RaftClientT s v m a) -> RaftClientT s v m b) -> RaftClientT s v m b #

uninterruptibleMask :: ((forall a. RaftClientT s v m a -> RaftClientT s v m a) -> RaftClientT s v m b) -> RaftClientT s v m b #

generalBracket :: RaftClientT s v m a -> (a -> ExitCase b -> RaftClientT s v m c) -> (a -> RaftClientT s v m b) -> RaftClientT s v m (b, c) #

MonadException m => MonadException (RaftClientT s v m) Source # 
Instance details

Defined in Raft.Client

Methods

controlIO :: (RunIO (RaftClientT s v m) -> IO (RaftClientT s v m a)) -> RaftClientT s v m a #

RaftClientSend m v => RaftClientSend (RaftClientT s v m) v Source # 
Instance details

Defined in Raft.Client

Associated Types

type RaftClientSendError (RaftClientT s v m) v :: Type Source #

RaftClientRecv m s v => RaftClientRecv (RaftClientT s v m) s v Source # 
Instance details

Defined in Raft.Client

Associated Types

type RaftClientRecvError (RaftClientT s v m) s :: Type Source #

type StT (RaftClientT s v) a Source # 
Instance details

Defined in Raft.Client

type StM (RaftClientT s v m) a Source # 
Instance details

Defined in Raft.Client

type StM (RaftClientT s v m) a = ComposeSt (RaftClientT s v) m a
type RaftClientRecvError (RaftClientT s v m) s Source # 
Instance details

Defined in Raft.Client

type RaftClientSendError (RaftClientT s v m) v Source # 
Instance details

Defined in Raft.Client

clientRead :: (RaftClientSend m v, RaftClientRecv m s v) => ClientReadReq -> RaftClientT s v m (Either (RaftClientError s v m) (ClientReadResp s v)) Source #

Send a read request to the curent leader and wait for a response

clientReadFrom :: (RaftClientSend m v, RaftClientRecv m s v) => NodeId -> ClientReadReq -> RaftClientT s v m (Either (RaftClientError s v m) (ClientReadResp s v)) Source #

Send a read request to a specific raft node, regardless of leader, and wait for a response.

clientWrite :: (RaftClientSend m v, RaftClientRecv m s v) => v -> RaftClientT s v m (Either (RaftClientError s v m) ClientWriteResp) Source #

Send a write request to the current leader and wait for a response

clientWriteTo :: (RaftClientSend m v, RaftClientRecv m s v) => NodeId -> v -> RaftClientT s v m (Either (RaftClientError s v m) ClientWriteResp) Source #

Send a read request to a specific raft node, regardless of leader, and wait for a response.

retryOnRedirect :: MonadBaseControl IO m => RaftClientT s v m (Either (RaftClientError s v m) r) -> RaftClientT s v m (Either (RaftClientError s v m) r) Source #

Given a blocking client send/receive, retry if the received value is not expected