use super::{AlignmentContext, Invoker, ProtobufRpcEngine2, ProtocolInfo, RpcEngine};
use crate::{conf::Configuration, io::retry::RetryPolicy, security::UserGroupInformation};
use atomic::Atomic;
use std::{net::SocketAddr, rc::Rc, sync::Arc};
#[derive(Clone)]
#[repr(u8)]
pub enum RpcKind {
RpcBuiltin,
RpcWritable,
RpcProtocolBuffer,
}
pub trait RpcProtocol<T: RpcProtocol = Self> {
fn get_protocol_info() -> &'static ProtocolInfo;
fn from(invoker: Invoker<T>) -> Self;
}
pub struct RPC;
impl RPC {
pub const RPC_SERVICE_CLASS_DEFAULT: u8 = 0;
pub fn get_protocol_name<T: RpcProtocol>() -> &'static str {
T::get_protocol_info().protocol_name
}
pub fn get_protocol_version<T: RpcProtocol>() -> u64 {
T::get_protocol_info().protocol_version
}
fn get_protocol_engine<T: RpcProtocol>(_conf: &Configuration) -> impl RpcEngine {
ProtobufRpcEngine2
}
pub fn get_protocol_proxy<T: RpcProtocol>(
addr: &SocketAddr,
ticket: &UserGroupInformation,
conf: &Configuration,
rpc_timeout: i32,
connection_retry_policy: Option<Rc<dyn RetryPolicy>>,
fallback_to_simple_auth: Option<Arc<Atomic<bool>>>,
alignment_context: Option<Rc<dyn AlignmentContext>>,
) -> anyhow::Result<T> {
Self::get_protocol_engine::<T>(conf).get_proxy(
addr,
ticket,
conf,
rpc_timeout,
connection_retry_policy,
fallback_to_simple_auth,
alignment_context,
)
}
}