Safe Haskell | None |
---|---|
Language | Haskell2010 |
Synopsis
- class RaftSendClient m sm v where
- sendClient :: ClientId -> ClientResponse sm v -> m ()
- class Show (RaftRecvClientError m v) => RaftRecvClient m v where
- type RaftRecvClientError m v
- receiveClient :: m (Either (RaftRecvClientError m v) (ClientRequest v))
- newtype SerialNum = SerialNum Natural
- data ClientRequest v = ClientRequest ClientId (ClientReq v)
- data ClientReq v
- data ClientReadReq
- data ReadEntriesSpec
- data ClientResponse sm v
- data ClientRespSpec sm
- data ClientReadRespSpec sm
- data ClientReadResp sm v
- data ClientWriteResp = ClientWriteResp Index SerialNum
- data ClientRedirResp = ClientRedirResp CurrentLeader
- class Monad m => RaftClientSend m v where
- type RaftClientSendError m v
- raftClientSend :: NodeId -> ClientRequest v -> m (Either (RaftClientSendError m v) ())
- class Monad m => RaftClientRecv m sm v | m sm -> v where
- type RaftClientRecvError m sm
- raftClientRecv :: m (Either (RaftClientRecvError m sm) (ClientResponse sm v))
- data RaftClientState = RaftClientState {}
- data RaftClientEnv = RaftClientEnv {}
- initRaftClientState :: Set NodeId -> StdGen -> RaftClientState
- data RaftClientT s v m a
- runRaftClientT :: Monad m => RaftClientEnv -> RaftClientState -> RaftClientT s v m a -> m a
- data RaftClientError s v m where
- RaftClientSendError :: RaftClientSendError m v -> RaftClientError s v m
- RaftClientRecvError :: RaftClientRecvError m s -> RaftClientError s v m
- RaftClientTimeout :: Text -> RaftClientError s v m
- RaftClientUnexpectedReadResp :: ClientReadResp s v -> RaftClientError s v m
- RaftClientUnexpectedWriteResp :: ClientWriteResp -> RaftClientError s v m
- RaftClientUnexpectedRedirect :: ClientRedirResp -> RaftClientError s v m
- clientRead :: (RaftClientSend m v, RaftClientRecv m s v) => ClientReadReq -> RaftClientT s v m (Either (RaftClientError s v m) (ClientReadResp s v))
- clientReadFrom :: (RaftClientSend m v, RaftClientRecv m s v) => NodeId -> ClientReadReq -> RaftClientT s v m (Either (RaftClientError s v m) (ClientReadResp s v))
- clientReadTimeout :: (MonadBaseControl IO m, RaftClientSend m v, RaftClientRecv m s v) => Int -> ClientReadReq -> RaftClientT s v m (Either (RaftClientError s v m) (ClientReadResp s v))
- clientWrite :: (RaftClientSend m v, RaftClientRecv m s v) => v -> RaftClientT s v m (Either (RaftClientError s v m) ClientWriteResp)
- clientWriteTo :: (RaftClientSend m v, RaftClientRecv m s v) => NodeId -> v -> RaftClientT s v m (Either (RaftClientError s v m) ClientWriteResp)
- clientWriteTimeout :: (MonadBaseControl IO m, RaftClientSend m v, RaftClientRecv m s v) => Int -> v -> RaftClientT s v m (Either (RaftClientError s v m) ClientWriteResp)
- retryOnRedirect :: MonadBaseControl IO m => RaftClientT s v m (Either (RaftClientError s v m) r) -> RaftClientT s v m (Either (RaftClientError s v m) r)
- clientAddNode :: Monad m => NodeId -> RaftClientT s v m ()
- clientGetNodes :: Monad m => RaftClientT s v m (Set NodeId)
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.
sendClient :: ClientId -> ClientResponse sm v -> m () Source #
Instances
(Monad m, RaftSendClient m sm v) => RaftSendClient (RaftPostgresT m) sm v Source # | |
Defined in Raft.Log.PostgreSQL sendClient :: ClientId -> ClientResponse sm v -> RaftPostgresT m () Source # | |
(MonadIO m, MonadMask m, RaftSendClient m sm v) => RaftSendClient (RaftPersistFileStoreT m) sm v Source # | |
Defined in Examples.Raft.FileStore.Persistent sendClient :: ClientId -> ClientResponse sm v -> RaftPersistFileStoreT m () Source # | |
(Monad m, RaftSendClient m sm v) => RaftSendClient (RaftLogFileStoreT m) sm v Source # | |
Defined in Examples.Raft.FileStore.Log sendClient :: ClientId -> ClientResponse sm v -> RaftLogFileStoreT m () Source # | |
(MonadMask m, MonadCatch m, MonadIO m, Serialize sm, Serialize v) => RaftSendClient (RaftSocketT sm v m) sm v Source # | |
Defined in Examples.Raft.Socket.Node 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
type RaftRecvClientError m v Source #
receiveClient :: m (Either (RaftRecvClientError m v) (ClientRequest v)) Source #
Instances
Instances
Enum SerialNum Source # | |
Defined in Raft.Types succ :: SerialNum -> SerialNum # pred :: SerialNum -> SerialNum # fromEnum :: SerialNum -> Int # enumFrom :: SerialNum -> [SerialNum] # enumFromThen :: SerialNum -> SerialNum -> [SerialNum] # enumFromTo :: SerialNum -> SerialNum -> [SerialNum] # enumFromThenTo :: SerialNum -> SerialNum -> SerialNum -> [SerialNum] # | |
Eq SerialNum Source # | |
Num SerialNum Source # | |
Ord SerialNum Source # | |
Defined in Raft.Types | |
Read SerialNum Source # | |
Show SerialNum Source # | |
Generic SerialNum Source # | |
Serialize SerialNum Source # | |
type Rep SerialNum Source # | |
Defined in Raft.Types |
Client Requests
data ClientRequest v Source #
Representation of a client request coupled with the client id
Instances
Show v => Show (ClientRequest v) Source # | |
Defined in Raft.Client showsPrec :: Int -> ClientRequest v -> ShowS # show :: ClientRequest v -> String # showList :: [ClientRequest v] -> ShowS # | |
Generic (ClientRequest v) Source # | |
Defined in Raft.Client type Rep (ClientRequest v) :: Type -> Type # from :: ClientRequest v -> Rep (ClientRequest v) x # to :: Rep (ClientRequest v) x -> ClientRequest v # | |
Serialize v => Serialize (ClientRequest v) Source # | |
Defined in Raft.Client put :: Putter (ClientRequest v) # get :: Get (ClientRequest v) # | |
type Rep (ClientRequest v) Source # | |
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)))) |
Representation of a client request
ClientReadReq ClientReadReq | Request the latest state of the state machine |
ClientWriteReq SerialNum v | Write a command |
Instances
Show v => Show (ClientReq v) Source # | |
Generic (ClientReq v) Source # | |
Serialize v => Serialize (ClientReq v) Source # | |
type Rep (ClientReq v) Source # | |
Defined in Raft.Client type Rep (ClientReq v) = D1 (MetaData "ClientReq" "Raft.Client" "libraft-0.4.1.0-EJnveHOf7pz4UG8saKrZJp" False) (C1 (MetaCons "ClientReadReq" PrefixI False) (S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 ClientReadReq)) :+: C1 (MetaCons "ClientWriteReq" PrefixI False) (S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 SerialNum) :*: S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 v))) |
data ClientReadReq Source #
Instances
Show ClientReadReq Source # | |
Defined in Raft.Client showsPrec :: Int -> ClientReadReq -> ShowS # show :: ClientReadReq -> String # showList :: [ClientReadReq] -> ShowS # | |
Generic ClientReadReq Source # | |
Defined in Raft.Client type Rep ClientReadReq :: Type -> Type # from :: ClientReadReq -> Rep ClientReadReq x # to :: Rep ClientReadReq x -> ClientReadReq # | |
Serialize ClientReadReq Source # | |
Defined in Raft.Client put :: Putter ClientReadReq # get :: Get ClientReadReq # | |
type Rep ClientReadReq Source # | |
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 # | |
Defined in Raft.Log showsPrec :: Int -> ReadEntriesSpec -> ShowS # show :: ReadEntriesSpec -> String # showList :: [ReadEntriesSpec] -> ShowS # | |
Generic ReadEntriesSpec Source # | |
Defined in Raft.Log type Rep ReadEntriesSpec :: Type -> Type # from :: ReadEntriesSpec -> Rep ReadEntriesSpec x # to :: Rep ReadEntriesSpec x -> ReadEntriesSpec # | |
Serialize ReadEntriesSpec Source # | |
Defined in Raft.Log put :: Putter ReadEntriesSpec # get :: Get ReadEntriesSpec # | |
type Rep ReadEntriesSpec Source # | |
Defined in Raft.Log type Rep ReadEntriesSpec = D1 (MetaData "ReadEntriesSpec" "Raft.Log" "libraft-0.4.1.0-EJnveHOf7pz4UG8saKrZJp" False) (C1 (MetaCons "ByIndex" PrefixI False) (S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 Index)) :+: C1 (MetaCons "ByIndices" PrefixI False) (S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 IndexInterval))) |
Client Responses
data ClientResponse sm v Source #
The datatype sent back to the client as an actual response
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
data ClientRespSpec sm Source #
Specification for the data inside a ClientResponse
ClientReadRespSpec (ClientReadRespSpec sm) | |
ClientWriteRespSpec Index SerialNum | |
ClientRedirRespSpec CurrentLeader |
Instances
data ClientReadRespSpec sm Source #
Instances
data ClientReadResp sm v Source #
Representation of a read response to a client
Instances
data ClientWriteResp Source #
Representation of a write response to a client
ClientWriteResp Index SerialNum | Index of the entry appended to the log due to the previous client request |
Instances
Show ClientWriteResp Source # | |
Defined in Raft.Client showsPrec :: Int -> ClientWriteResp -> ShowS # show :: ClientWriteResp -> String # showList :: [ClientWriteResp] -> ShowS # | |
Generic ClientWriteResp Source # | |
Defined in Raft.Client type Rep ClientWriteResp :: Type -> Type # from :: ClientWriteResp -> Rep ClientWriteResp x # to :: Rep ClientWriteResp x -> ClientWriteResp # | |
Serialize ClientWriteResp Source # | |
Defined in Raft.Client put :: Putter ClientWriteResp # get :: Get ClientWriteResp # | |
type Rep ClientWriteResp Source # | |
Defined in Raft.Client type Rep ClientWriteResp = D1 (MetaData "ClientWriteResp" "Raft.Client" "libraft-0.4.1.0-EJnveHOf7pz4UG8saKrZJp" False) (C1 (MetaCons "ClientWriteResp" PrefixI False) (S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 Index) :*: S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 SerialNum))) |
data ClientRedirResp Source #
Representation of a redirect response to a client
Instances
Show ClientRedirResp Source # | |
Defined in Raft.Client showsPrec :: Int -> ClientRedirResp -> ShowS # show :: ClientRedirResp -> String # showList :: [ClientRedirResp] -> ShowS # | |
Generic ClientRedirResp Source # | |
Defined in Raft.Client type Rep ClientRedirResp :: Type -> Type # from :: ClientRedirResp -> Rep ClientRedirResp x # to :: Rep ClientRedirResp x -> ClientRedirResp # | |
Serialize ClientRedirResp Source # | |
Defined in Raft.Client put :: Putter ClientRedirResp # get :: Get ClientRedirResp # | |
type Rep ClientRedirResp Source # | |
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 #
type RaftClientSendError m v Source #
raftClientSend :: NodeId -> ClientRequest v -> m (Either (RaftClientSendError m v) ()) Source #
Instances
RaftClientSend m v => RaftClientSend (RaftClientT s v m) v Source # | |
Defined in Raft.Client type RaftClientSendError (RaftClientT s v m) v :: Type Source # raftClientSend :: NodeId -> ClientRequest v -> RaftClientT s v m (Either (RaftClientSendError (RaftClientT s v m) v) ()) Source # | |
(Serialize s, Serialize v, MonadIO m) => RaftClientSend (RaftClientRespChanT s v m) v Source # | |
Defined in Examples.Raft.Socket.Client type RaftClientSendError (RaftClientRespChanT s v m) v :: Type Source # raftClientSend :: NodeId -> ClientRequest v -> RaftClientRespChanT s v m (Either (RaftClientSendError (RaftClientRespChanT s v m) v) ()) Source # |
class Monad m => RaftClientRecv m sm v | m sm -> v where Source #
type RaftClientRecvError m sm Source #
raftClientRecv :: m (Either (RaftClientRecvError m sm) (ClientResponse sm v)) Source #
Instances
RaftClientRecv m s v => RaftClientRecv (RaftClientT s v m) s v Source # | |
Defined in Raft.Client type RaftClientRecvError (RaftClientT s v m) s :: Type Source # raftClientRecv :: RaftClientT s v m (Either (RaftClientRecvError (RaftClientT s v m) s) (ClientResponse s v)) Source # | |
(Serialize s, Serialize v, MonadIO m) => RaftClientRecv (RaftClientRespChanT s v m) s v Source # | |
Defined in Examples.Raft.Socket.Client type RaftClientRecvError (RaftClientRespChanT s v m) s :: Type Source # raftClientRecv :: RaftClientRespChanT s v m (Either (RaftClientRecvError (RaftClientRespChanT s v m) s) (ClientResponse s v)) 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 # | |
Defined in Raft.Client get :: RaftClientT s v m RaftClientState # put :: RaftClientState -> RaftClientT s v m () # state :: (RaftClientState -> (a, RaftClientState)) -> RaftClientT s v m a # |
data RaftClientEnv Source #
Instances
Monad m => MonadReader RaftClientEnv (RaftClientT s v m) Source # | |
Defined in Raft.Client 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 # |
initRaftClientState :: Set NodeId -> StdGen -> RaftClientState Source #
data RaftClientT s v m a Source #
Instances
runRaftClientT :: Monad m => RaftClientEnv -> RaftClientState -> RaftClientT s v m a -> m a Source #
data RaftClientError s v m where Source #
RaftClientSendError :: RaftClientSendError m v -> RaftClientError s v m | |
RaftClientRecvError :: RaftClientRecvError m s -> RaftClientError s v m | |
RaftClientTimeout :: Text -> RaftClientError s v m | |
RaftClientUnexpectedReadResp :: ClientReadResp s v -> RaftClientError s v m | |
RaftClientUnexpectedWriteResp :: ClientWriteResp -> RaftClientError s v m | |
RaftClientUnexpectedRedirect :: ClientRedirResp -> RaftClientError s v m |
Instances
(Show s, Show v, Show (RaftClientSendError m v), Show (RaftClientRecvError m s)) => Show (RaftClientError s v m) Source # | |
Defined in Raft.Client showsPrec :: Int -> RaftClientError s v m -> ShowS # show :: RaftClientError s v m -> String # showList :: [RaftClientError s v m] -> ShowS # |
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.
clientReadTimeout :: (MonadBaseControl IO m, RaftClientSend m v, RaftClientRecv m s v) => Int -> ClientReadReq -> RaftClientT s v m (Either (RaftClientError s v m) (ClientReadResp s v)) Source #
clientRead
but with a timeout
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.
clientWriteTimeout :: (MonadBaseControl IO m, RaftClientSend m v, RaftClientRecv m s v) => Int -> v -> RaftClientT s v m (Either (RaftClientError s v m) ClientWriteResp) Source #
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
clientAddNode :: Monad m => NodeId -> RaftClientT s v m () Source #
clientGetNodes :: Monad m => RaftClientT s v m (Set NodeId) Source #