Support omitting the initial channels list
This commit is contained in:
+14
-16
@@ -43,17 +43,15 @@ use series::ChannelStatusSeriesId;
|
||||
use series::SeriesId;
|
||||
use stats::rand_xoshiro::rand_core::RngCore;
|
||||
use stats::rand_xoshiro::rand_core::SeedableRng;
|
||||
use stats::rand_xoshiro::Xoshiro128StarStar;
|
||||
use stats::rand_xoshiro::Xoshiro128PlusPlus;
|
||||
use stats::CaConnStats;
|
||||
use stats::CaProtoStats;
|
||||
use stats::IntervalEma;
|
||||
use stats::XorShift32;
|
||||
use std::collections::BTreeMap;
|
||||
use std::collections::HashMap;
|
||||
use std::collections::VecDeque;
|
||||
use std::net::SocketAddrV4;
|
||||
use std::ops::ControlFlow;
|
||||
use std::pin::pin;
|
||||
use std::pin::Pin;
|
||||
use std::sync::atomic;
|
||||
use std::sync::atomic::AtomicUsize;
|
||||
@@ -322,13 +320,13 @@ fn wait_fut(dt: u64) -> Pin<Box<dyn Future<Output = ()> + Send>> {
|
||||
}
|
||||
|
||||
struct CidStore {
|
||||
rng: XorShift32,
|
||||
rng: Xoshiro128PlusPlus,
|
||||
}
|
||||
|
||||
impl CidStore {
|
||||
fn new(seed: u32) -> Self {
|
||||
Self {
|
||||
rng: XorShift32::new(seed),
|
||||
rng: Xoshiro128PlusPlus::seed_from_u64(seed as _),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -342,18 +340,18 @@ impl CidStore {
|
||||
}
|
||||
|
||||
fn next(&mut self) -> Cid {
|
||||
Cid(self.rng.next())
|
||||
Cid(self.rng.next_u32())
|
||||
}
|
||||
}
|
||||
|
||||
struct SubidStore {
|
||||
rng: XorShift32,
|
||||
rng: Xoshiro128PlusPlus,
|
||||
}
|
||||
|
||||
impl SubidStore {
|
||||
fn new(seed: u32) -> Self {
|
||||
Self {
|
||||
rng: XorShift32::new(seed),
|
||||
rng: Xoshiro128PlusPlus::seed_from_u64(seed as _),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -367,7 +365,7 @@ impl SubidStore {
|
||||
}
|
||||
|
||||
fn next(&mut self) -> Subid {
|
||||
Subid(self.rng.next())
|
||||
Subid(self.rng.next_u32())
|
||||
}
|
||||
}
|
||||
|
||||
@@ -376,6 +374,8 @@ fn info_store_msp_from_time(ts: SystemTime) -> u32 {
|
||||
(dt.as_secs() / 60 * 60) as u32
|
||||
}
|
||||
|
||||
pub type CmdResTx = Sender<Result<(), Error>>;
|
||||
|
||||
#[derive(Debug)]
|
||||
pub enum ConnCommandKind {
|
||||
SeriesLookupResult(Result<ChannelInfoResult, dbpg::seriesbychannel::Error>),
|
||||
@@ -552,7 +552,7 @@ pub struct CaConn {
|
||||
thr_msg_poll: ThrottleTrace,
|
||||
ca_proto_stats: Arc<CaProtoStats>,
|
||||
weird_count: usize,
|
||||
rng: Xoshiro128StarStar,
|
||||
rng: Xoshiro128PlusPlus,
|
||||
}
|
||||
|
||||
#[cfg(DISABLED)]
|
||||
@@ -614,7 +614,7 @@ impl CaConn {
|
||||
}
|
||||
}
|
||||
|
||||
fn ioc_ping_ivl_rng(rng: &mut Xoshiro128StarStar) -> Duration {
|
||||
fn ioc_ping_ivl_rng(rng: &mut Xoshiro128PlusPlus) -> Duration {
|
||||
IOC_PING_IVL * 100 / (70 + (rng.next_u32() % 60))
|
||||
}
|
||||
|
||||
@@ -668,7 +668,7 @@ impl CaConn {
|
||||
}
|
||||
|
||||
fn cmd_check_health(&mut self) {
|
||||
debug!("cmd_check_health");
|
||||
trace!("cmd_check_health");
|
||||
match self.check_channels_alive() {
|
||||
Ok(_) => {}
|
||||
Err(e) => {
|
||||
@@ -743,8 +743,6 @@ impl CaConn {
|
||||
|
||||
fn cmd_channel_add(&mut self, name: String, cssid: ChannelStatusSeriesId) {
|
||||
self.channel_add(name, cssid);
|
||||
// TODO return the result
|
||||
//self.stats.caconn_command_can_not_reply.inc();
|
||||
}
|
||||
|
||||
fn cmd_channel_remove(&mut self, name: String) {
|
||||
@@ -2168,9 +2166,9 @@ impl Stream for CaConn {
|
||||
Pending
|
||||
} else {
|
||||
// TODO error
|
||||
error!("logic error");
|
||||
error!("shutting down, queues not flushed, no progress, no pending");
|
||||
self.stats.logic_error().inc();
|
||||
let e = Error::with_msg_no_trace("shutdown, not done, no progress, no pending");
|
||||
let e = Error::with_msg_no_trace("shutting down, queues not flushed, no progress, no pending");
|
||||
Ready(Some(Err(e)))
|
||||
}
|
||||
}
|
||||
|
||||
+76
-60
@@ -46,6 +46,8 @@ use statemap::ChannelStateValue;
|
||||
use statemap::WithStatusSeriesIdState;
|
||||
use statemap::WithStatusSeriesIdStateInner;
|
||||
use statemap::CHANNEL_STATUS_DUMMY_SCALAR_TYPE;
|
||||
use stats::rand_xoshiro::rand_core::RngCore;
|
||||
use stats::rand_xoshiro::Xoshiro128PlusPlus;
|
||||
use stats::CaConnSetStats;
|
||||
use stats::CaConnStats;
|
||||
use stats::CaProtoStats;
|
||||
@@ -134,7 +136,6 @@ impl CaConnRes {
|
||||
pub struct ChannelAddWithAddr {
|
||||
backend: String,
|
||||
name: String,
|
||||
local_epics_hostname: String,
|
||||
cssid: ChannelStatusSeriesId,
|
||||
addr: SocketAddr,
|
||||
}
|
||||
@@ -143,7 +144,6 @@ pub struct ChannelAddWithAddr {
|
||||
pub struct ChannelAddWithStatusId {
|
||||
backend: String,
|
||||
name: String,
|
||||
local_epics_hostname: String,
|
||||
cssid: ChannelStatusSeriesId,
|
||||
}
|
||||
|
||||
@@ -151,7 +151,7 @@ pub struct ChannelAddWithStatusId {
|
||||
pub struct ChannelAdd {
|
||||
backend: String,
|
||||
name: String,
|
||||
local_epics_hostname: String,
|
||||
restx: crate::ca::conn::CmdResTx,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
@@ -196,7 +196,7 @@ impl fmt::Debug for ChannelStatusesRequest {
|
||||
pub enum ConnSetCmd {
|
||||
ChannelAdd(ChannelAdd),
|
||||
ChannelRemove(ChannelRemove),
|
||||
CheckHealth(Instant),
|
||||
CheckHealth(u32, Instant),
|
||||
Shutdown,
|
||||
ChannelStatuses(ChannelStatusesRequest),
|
||||
}
|
||||
@@ -213,7 +213,7 @@ impl CaConnSetEvent {
|
||||
#[derive(Debug, Clone)]
|
||||
pub enum CaConnSetItem {
|
||||
Error(Error),
|
||||
Healthy(Instant, Instant),
|
||||
Healthy(u32, Instant, Instant),
|
||||
}
|
||||
|
||||
pub struct CaConnSetCtrl {
|
||||
@@ -224,9 +224,15 @@ pub struct CaConnSetCtrl {
|
||||
ca_proto_stats: Arc<CaProtoStats>,
|
||||
ioc_finder_stats: Arc<IocFinderStats>,
|
||||
jh: JoinHandle<Result<(), Error>>,
|
||||
rng: Xoshiro128PlusPlus,
|
||||
idcnt: u32,
|
||||
}
|
||||
|
||||
impl CaConnSetCtrl {
|
||||
pub fn new() -> Self {
|
||||
todo!()
|
||||
}
|
||||
|
||||
pub fn sender(&self) -> Sender<CaConnSetEvent> {
|
||||
self.tx.clone()
|
||||
}
|
||||
@@ -235,12 +241,13 @@ impl CaConnSetCtrl {
|
||||
self.rx.clone()
|
||||
}
|
||||
|
||||
pub async fn add_channel(&self, backend: String, name: String, local_epics_hostname: String) -> Result<(), Error> {
|
||||
let cmd = ChannelAdd {
|
||||
backend,
|
||||
name,
|
||||
local_epics_hostname,
|
||||
};
|
||||
pub async fn add_channel(
|
||||
&self,
|
||||
backend: String,
|
||||
name: String,
|
||||
restx: crate::ca::conn::CmdResTx,
|
||||
) -> Result<(), Error> {
|
||||
let cmd = ChannelAdd { backend, name, restx };
|
||||
let cmd = ConnSetCmd::ChannelAdd(cmd);
|
||||
self.tx.send(CaConnSetEvent::ConnSetCmd(cmd)).await?;
|
||||
Ok(())
|
||||
@@ -259,16 +266,17 @@ impl CaConnSetCtrl {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub async fn check_health(&self) -> Result<(), Error> {
|
||||
let cmd = ConnSetCmd::CheckHealth(Instant::now());
|
||||
pub async fn check_health(&mut self) -> Result<u32, Error> {
|
||||
let id = self.make_id();
|
||||
let cmd = ConnSetCmd::CheckHealth(id, Instant::now());
|
||||
let n = self.tx.len();
|
||||
if n > 0 {
|
||||
debug!("check_health self.tx.len() {:?}", n);
|
||||
}
|
||||
let s = format!("{:?}", cmd);
|
||||
self.tx.send(CaConnSetEvent::ConnSetCmd(cmd)).await?;
|
||||
debug!("check_health enqueued {s}");
|
||||
Ok(())
|
||||
trace!("check_health enqueued {s}");
|
||||
Ok(id)
|
||||
}
|
||||
|
||||
pub async fn join(self) -> Result<(), Error> {
|
||||
@@ -291,6 +299,12 @@ impl CaConnSetCtrl {
|
||||
pub fn ioc_finder_stats(&self) -> &Arc<IocFinderStats> {
|
||||
&self.ioc_finder_stats
|
||||
}
|
||||
|
||||
fn make_id(&mut self) -> u32 {
|
||||
let id = self.idcnt;
|
||||
self.idcnt += 1;
|
||||
self.rng.next_u32() & 0xffff | (id << 16)
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
@@ -441,6 +455,8 @@ impl CaConnSet {
|
||||
ca_proto_stats,
|
||||
ioc_finder_stats,
|
||||
jh,
|
||||
idcnt: 0,
|
||||
rng: stats::xoshiro_from_time(),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -482,51 +498,13 @@ impl CaConnSet {
|
||||
ConnSetCmd::ChannelRemove(x) => self.handle_remove_channel(x),
|
||||
// ConnSetCmd::IocAddrQueryResult(x) => self.handle_ioc_query_result(x).await,
|
||||
// ConnSetCmd::SeriesLookupResult(x) => self.handle_series_lookup_result(x).await,
|
||||
ConnSetCmd::CheckHealth(ts1) => self.handle_check_health(ts1),
|
||||
ConnSetCmd::CheckHealth(id, ts1) => self.handle_check_health(id, ts1),
|
||||
ConnSetCmd::Shutdown => self.handle_shutdown(),
|
||||
ConnSetCmd::ChannelStatuses(x) => self.handle_channel_statuses_req(x),
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
fn handle_ca_conn_event(&mut self, addr: SocketAddr, ev: CaConnEvent) -> Result<(), Error> {
|
||||
match ev.value {
|
||||
CaConnEventValue::None => Ok(()),
|
||||
CaConnEventValue::EchoTimeout => Ok(()),
|
||||
CaConnEventValue::ConnCommandResult(x) => self.handle_conn_command_result(addr, x),
|
||||
CaConnEventValue::QueryItem(item) => {
|
||||
todo!("remove this insert case");
|
||||
// self.storage_insert_queue.push_back(item);
|
||||
Ok(())
|
||||
}
|
||||
CaConnEventValue::ChannelCreateFail(x) => self.handle_channel_create_fail(addr, x),
|
||||
CaConnEventValue::EndOfStream => self.handle_ca_conn_eos(addr),
|
||||
CaConnEventValue::ConnectFail => self.handle_connect_fail(addr),
|
||||
}
|
||||
}
|
||||
|
||||
fn handle_series_lookup_result(&mut self, res: Result<ChannelInfoResult, Error>) -> Result<(), Error> {
|
||||
if self.shutdown_stopping {
|
||||
return Ok(());
|
||||
}
|
||||
trace3!("handle_series_lookup_result {res:?}");
|
||||
match res {
|
||||
Ok(res) => {
|
||||
let add = ChannelAddWithStatusId {
|
||||
backend: res.backend,
|
||||
name: res.channel,
|
||||
local_epics_hostname: self.local_epics_hostname.clone(),
|
||||
cssid: ChannelStatusSeriesId::new(res.series.into_inner().id()),
|
||||
};
|
||||
self.handle_add_channel_with_status_id(add)?;
|
||||
}
|
||||
Err(e) => {
|
||||
warn!("TODO handle error {e}");
|
||||
}
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn handle_add_channel(&mut self, cmd: ChannelAdd) -> Result<(), Error> {
|
||||
if self.shutdown_stopping {
|
||||
trace3!("handle_add_channel but shutdown_stopping");
|
||||
@@ -555,6 +533,46 @@ impl CaConnSet {
|
||||
tx: Box::pin(SeriesLookupSender { tx }),
|
||||
};
|
||||
self.channel_info_query_queue.push_back(item);
|
||||
if let Err(_) = cmd.restx.try_send(Ok(())) {
|
||||
self.stats.command_reply_fail().inc();
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn handle_ca_conn_event(&mut self, addr: SocketAddr, ev: CaConnEvent) -> Result<(), Error> {
|
||||
match ev.value {
|
||||
CaConnEventValue::None => Ok(()),
|
||||
CaConnEventValue::EchoTimeout => Ok(()),
|
||||
CaConnEventValue::ConnCommandResult(x) => self.handle_conn_command_result(addr, x),
|
||||
CaConnEventValue::QueryItem(item) => {
|
||||
todo!("remove this insert case");
|
||||
// self.storage_insert_queue.push_back(item);
|
||||
Ok(())
|
||||
}
|
||||
CaConnEventValue::ChannelCreateFail(x) => self.handle_channel_create_fail(addr, x),
|
||||
CaConnEventValue::EndOfStream => self.handle_ca_conn_eos(addr),
|
||||
CaConnEventValue::ConnectFail => self.handle_connect_fail(addr),
|
||||
}
|
||||
}
|
||||
|
||||
fn handle_series_lookup_result(&mut self, res: Result<ChannelInfoResult, Error>) -> Result<(), Error> {
|
||||
if self.shutdown_stopping {
|
||||
return Ok(());
|
||||
}
|
||||
trace3!("handle_series_lookup_result {res:?}");
|
||||
match res {
|
||||
Ok(res) => {
|
||||
let add = ChannelAddWithStatusId {
|
||||
backend: res.backend,
|
||||
name: res.channel,
|
||||
cssid: ChannelStatusSeriesId::new(res.series.into_inner().id()),
|
||||
};
|
||||
self.handle_add_channel_with_status_id(add)?;
|
||||
}
|
||||
Err(e) => {
|
||||
warn!("TODO handle error {e}");
|
||||
}
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
@@ -721,7 +739,6 @@ impl CaConnSet {
|
||||
name: res.channel,
|
||||
addr: SocketAddr::V4(addr),
|
||||
cssid: status_series_id.clone(),
|
||||
local_epics_hostname: self.local_epics_hostname.clone(),
|
||||
};
|
||||
self.handle_add_channel_with_addr(cmd)?;
|
||||
}
|
||||
@@ -747,8 +764,8 @@ impl CaConnSet {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn handle_check_health(&mut self, ts1: Instant) -> Result<(), Error> {
|
||||
trace2!("handle_check_health");
|
||||
fn handle_check_health(&mut self, id: u32, ts1: Instant) -> Result<(), Error> {
|
||||
trace2!("handle_check_health {id:08x}");
|
||||
if self.shutdown_stopping {
|
||||
return Ok(());
|
||||
}
|
||||
@@ -771,7 +788,7 @@ impl CaConnSet {
|
||||
}
|
||||
|
||||
let ts2 = Instant::now();
|
||||
let item = CaConnSetItem::Healthy(ts1, ts2);
|
||||
let item = CaConnSetItem::Healthy(id, ts1, ts2);
|
||||
self.connset_out_queue.push_back(item);
|
||||
Ok(())
|
||||
}
|
||||
@@ -968,7 +985,7 @@ impl CaConnSet {
|
||||
opts,
|
||||
add.backend.clone(),
|
||||
addr_v4,
|
||||
add.local_epics_hostname,
|
||||
self.local_epics_hostname.clone(),
|
||||
self.storage_insert_tx.as_ref().get_ref().clone(),
|
||||
self.channel_info_query_tx
|
||||
.clone()
|
||||
@@ -1281,7 +1298,6 @@ impl CaConnSet {
|
||||
let cmd = ChannelAddWithAddr {
|
||||
backend: self.backend.clone(),
|
||||
name: ch.id().into(),
|
||||
local_epics_hostname: self.local_epics_hostname.clone(),
|
||||
cssid: status_series_id.clone(),
|
||||
addr: SocketAddr::V4(*addr_v4),
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user