use std::sync::Arc;
use futures::sync::oneshot;
use crate::{
AppData, AppDataResponse, AppError, NodeId,
messages::{
ClientError, ClientPayload, ClientPayloadResponse,
Entry, ResponseMode,
},
};
pub(crate) const CLIENT_RPC_RX_ERR: &str = "Client RPC channel receiver was unexpectedly closed.";
pub(crate) const CLIENT_RPC_TX_ERR: &str = "Client RPC channel sender was unexpectedly closed.";
pub(crate) enum ApplyLogsTask<D: AppData, R: AppDataResponse, E: AppError> {
Outstanding,
Entry {
entry: Arc<Entry<D>>,
chan: Option<oneshot::Sender<Result<ClientPayloadResponse<R>, ClientError<D, R, E>>>>,
},
}
pub(crate) struct ClientPayloadWithChan<D: AppData, R: AppDataResponse, E: AppError> {
pub tx: oneshot::Sender<Result<ClientPayloadResponse<R>, ClientError<D, R, E>>>,
pub rpc: ClientPayload<D, R, E>,
}
impl<D: AppData, R: AppDataResponse, E: AppError> ClientPayloadWithChan<D, R, E> {
pub(crate) fn upgrade(self, index: u64, term: u64) -> ClientPayloadWithIndex<D, R, E> {
ClientPayloadWithIndex::new(self, index, term)
}
}
pub(crate) struct ClientPayloadWithIndex<D: AppData, R: AppDataResponse, E: AppError> {
pub tx: oneshot::Sender<Result<ClientPayloadResponse<R>, ClientError<D, R, E>>>,
entry: Arc<Entry<D>>,
pub response_mode: ResponseMode,
pub index: u64,
pub term: u64,
}
impl<D: AppData, R: AppDataResponse, E: AppError> ClientPayloadWithIndex<D, R, E> {
pub(self) fn new(payload: ClientPayloadWithChan<D, R, E>, index: u64, term: u64) -> Self {
let entry = Arc::new(Entry{index: index, term: term, payload: payload.rpc.entry.clone()});
Self{tx: payload.tx, entry, response_mode: payload.rpc.response_mode, index, term}
}
pub(crate) fn downgrade(self) -> ClientPayloadWithChan<D, R, E> {
let entry = match Arc::try_unwrap(self.entry) {
Ok(entry) => entry.payload,
Err(arc) => arc.payload.clone(),
};
ClientPayloadWithChan{tx: self.tx, rpc: ClientPayload::new_base(entry, self.response_mode)}
}
pub(crate) fn entry(&self) -> Arc<Entry<D>> {
self.entry.clone()
}
}
#[derive(Debug)]
pub(crate) enum DependencyAddr {
RaftInternal,
RaftNetwork,
RaftStorage,
}
pub(crate) enum UpdateCurrentLeader {
Unknown,
OtherNode(NodeId),
ThisNode,
}