disable: cache the disabled-command set (config_gen-tagged HashSet) instead of re-splitting disabled_commands on every non-oper command — the hottest hook in the server; re-parses only on rehash
This commit is contained in:
parent
78be7279b0
commit
09b4adabbf
1 changed files with 23 additions and 4 deletions
|
|
@ -2,11 +2,19 @@
|
|||
//! `disabled_commands = LIST WHO KNOCK` (space-separated; repeatable). A disabled
|
||||
//! command replies with `421` as if it didn't exist. Off unless configured.
|
||||
|
||||
use crate::map::HashSet;
|
||||
use crate::module::{ModResult, Module};
|
||||
use crate::numeric::ERR_UNKNOWNCOMMAND;
|
||||
use crate::server::Server;
|
||||
use crate::Uid;
|
||||
|
||||
/// The disabled-command set, parsed once and re-parsed only when the config changes.
|
||||
#[derive(Default)]
|
||||
struct DisabledCache {
|
||||
gen: u64,
|
||||
cmds: HashSet<String>, // uppercased command names
|
||||
}
|
||||
|
||||
pub struct Disable;
|
||||
|
||||
impl Module for Disable {
|
||||
|
|
@ -25,11 +33,22 @@ impl Module for Disable {
|
|||
if srv.is_oper(uid) {
|
||||
return ModResult::Passthru;
|
||||
}
|
||||
// (re)build the set only when the config generation changes, not per command
|
||||
let gen = srv.config_gen;
|
||||
let stale = srv.ext.get::<DisabledCache>().map(|c| c.gen != gen).unwrap_or(true);
|
||||
if stale {
|
||||
let cmds: HashSet<String> = srv
|
||||
.conf_all("disabled_commands")
|
||||
.iter()
|
||||
.flat_map(|line| line.split_whitespace())
|
||||
.map(|c| c.to_ascii_uppercase())
|
||||
.collect();
|
||||
srv.ext.set(DisabledCache { gen, cmds });
|
||||
}
|
||||
let disabled = srv
|
||||
.conf_all("disabled_commands")
|
||||
.iter()
|
||||
.flat_map(|line| line.split_whitespace())
|
||||
.any(|c| c.eq_ignore_ascii_case(cmd));
|
||||
.ext
|
||||
.get::<DisabledCache>()
|
||||
.is_some_and(|c| c.cmds.contains(&cmd.to_ascii_uppercase()));
|
||||
if disabled {
|
||||
srv.numeric(
|
||||
uid,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue