update option level

This commit is contained in:
yggverse 2025-06-28 20:40:36 +03:00
parent 9643adbe99
commit 57dfe79568
3 changed files with 62 additions and 72 deletions

View file

@ -39,7 +39,9 @@ impl Connection {
"[{}] < [{}] request `{q}`...", "[{}] < [{}] request `{q}`...",
self.address.server, self.address.client self.address.server, self.address.client
)); ));
self.session.request.add(&self.address.client, &q); if let Some(ref i) = self.session.request {
i.add(&self.address.client, &q)
}
self.session self.session
.clone() .clone()
.public .public
@ -74,14 +76,14 @@ impl Connection {
&if is_root { &if is_root {
self.session.template.welcome( self.session.template.welcome(
Some(s), Some(s),
Some(self.session.request.count()), self.session.request.as_ref().map(|i| i.count()),
Some(self.session.request.total(None)), self.session.request.as_ref().map(|i| i.total(None)),
) )
} else { } else {
self.session.template.index( self.session.template.index(
Some(s), Some(s),
Some(self.session.request.count()), self.session.request.as_ref().map(|i| i.count()),
Some(self.session.request.total(Some(q))), self.session.request.as_ref().map(|i| i.total(Some(q))),
) )
} }
} }

View file

@ -11,7 +11,7 @@ pub struct Session {
pub access_log: AccessLog, pub access_log: AccessLog,
pub debug: Debug, pub debug: Debug,
pub public: Public, pub public: Public,
pub request: Request, pub request: Option<Request>,
pub template: Template, pub template: Template,
} }
@ -22,13 +22,15 @@ impl Session {
access_log: AccessLog::init(config)?, access_log: AccessLog::init(config)?,
debug: Debug::init(config)?, debug: Debug::init(config)?,
public: Public::init(config)?, public: Public::init(config)?,
request: Request::init( request: if template.welcome.contains("{hosts}")
// do not int request collector if its features not in use
template.welcome.contains("{hosts}")
|| template.welcome.contains("{hits}") || template.welcome.contains("{hits}")
|| template.index.contains("{hosts}") || template.index.contains("{hosts}")
|| template.index.contains("{hits}"), || template.index.contains("{hits}")
), {
Some(Request::new())
} else {
None // do not int request collector if its features not in use
},
template, template,
}) })
} }

View file

@ -9,28 +9,23 @@ use std::{
/// Collect peer requests for stats and visitors count /// Collect peer requests for stats and visitors count
pub struct Request { pub struct Request {
index: Option<RwLock<HashMap<IpAddr, Vec<Query>>>>, index: RwLock<HashMap<IpAddr, Vec<Query>>>,
// prevent log file overflow by recording error events once // prevent log file overflow by recording error events once
is_max_peers_reported: RwLock<bool>, is_max_peers_reported: RwLock<bool>,
is_max_peer_queries_reported: RwLock<bool>, is_max_peer_queries_reported: RwLock<bool>,
} }
impl Request { impl Request {
pub fn init(is_enabled: bool) -> Self { pub fn new() -> Self {
Self { Self {
index: if is_enabled { index: RwLock::new(HashMap::with_capacity(100)),
Some(RwLock::new(HashMap::with_capacity(100)))
} else {
None
},
is_max_peers_reported: RwLock::new(false), is_max_peers_reported: RwLock::new(false),
is_max_peer_queries_reported: RwLock::new(false), is_max_peer_queries_reported: RwLock::new(false),
} }
} }
pub fn add(&self, peer: &SocketAddr, query: &str) { pub fn add(&self, peer: &SocketAddr, query: &str) {
if let Some(ref this) = self.index { let mut index = self.index.write().unwrap();
let mut index = this.write().unwrap();
// Critical limits to forcefully free one memory slot(s) for the new record // Critical limits to forcefully free one memory slot(s) for the new record
// * the query len is already limited by the read buffer (1024 bytes * LIMIT) // * the query len is already limited by the read buffer (1024 bytes * LIMIT)
@ -52,9 +47,7 @@ impl Request {
let mut r = self.is_max_peer_queries_reported.write().unwrap(); let mut r = self.is_max_peer_queries_reported.write().unwrap();
if !*r { if !*r {
*r = true; *r = true;
eprintln!( eprintln!("Max queries limit ({INDEX_MAX_PEER_QUERIES}) reached for `{peer}`");
"Max queries limit ({INDEX_MAX_PEER_QUERIES}) reached for `{peer}`"
);
} }
queries.truncate(INDEX_MAX_PEER_QUERIES - 1) // free last slot for one query queries.truncate(INDEX_MAX_PEER_QUERIES - 1) // free last slot for one query
} }
@ -74,20 +67,14 @@ impl Request {
.and_modify(|c| c.push(Query::new(query))) .and_modify(|c| c.push(Query::new(query)))
.or_insert(vec![Query::new(query)]); .or_insert(vec![Query::new(query)]);
} }
}
pub fn count(&self) -> usize { pub fn count(&self) -> usize {
if let Some(ref i) = self.index { self.index.read().unwrap().len()
i.read().unwrap().len()
} else {
0
}
} }
pub fn total(&self, query_prefix: Option<&str>) -> usize { pub fn total(&self, query_prefix: Option<&str>) -> usize {
let mut t = 0; let mut t = 0;
if let Some(ref i) = self.index { for queries in self.index.read().unwrap().values() {
for queries in i.read().unwrap().values() {
match query_prefix { match query_prefix {
Some(p) => { Some(p) => {
for q in queries { for q in queries {
@ -99,7 +86,6 @@ impl Request {
None => t += queries.len(), None => t += queries.len(),
} }
} }
}
t t
} }
} }