wedhornsipgate created an issue (kamailio/kamailio#4426)

**Description:**

We're missing a KEMI function in the htable module that provides the same 
functionality as the PV function `$shtcn(table=>pattern)` to count the number 
of keys in an htable that match a given pattern (prefix/suffix/regex). The goal 
is to let KEMI scripts perform pattern counts without constructing dynamic PV 
expressions, which currently causes unbounded pv_cache growth in PKG memory.

**Use case / motivation:**

We implemented rolling-window rate limiting by writing short-lived, per-call 
entries into an htable and then counting keys that match a number-derived 
pattern. Using $shtcn() works well for the logic, but in KEMI (JS/TypeScript) 
we must call it via pv.gete("$shtcn(...)"). Because the PV string varies per 
INVITE (different pattern/key each time), these dynamic PV expressions 
accumulate in the PV cache, growing PKG/private memory over time.

We’d like a native KEMI function to perform the same count/match so we can 
avoid the PV layer entirely.

**Environment**

Kamailio: 5.8.6 on Debian 12

Scripting: KEMI (JavaScript/TypeScript)

Symptom: steady PKG/private memory increase over ~24h under load when using 
pv.gete("$shtcn(...)"). Disabling the $shtcn() call stops the growth.

Related log line: the one discussed in 
[#3440](https://github.com/kamailio/kamailio/issues/3440) (“pv cache … pkg 
memory may get filled with pv declarations”).

Current line in our script:

```if (ksr.pv.gete(`$shtcn(${htable_count}=>%~${number})`) > threshold) { ... 
}```


**Current workaround**

Restarting the Kamailio every day or disabling rate limit on instances with 
KEMI.

**Idea for API**

Minimal, PV-parity:

```
// KEMI export
int shtcn_match(str table, str pattern, int mode /* 0=exact, 1=prefix, 
2=suffix, 3=regex */);
```


JS example:

`const n = KSR.htable.shtcn_match("from_number_count", number, 3); // regex`


More explicit helpers (avoids integer modes):

```
KSR.htable.shtcn_exact(table, key)      -> int
KSR.htable.shtcn_prefix(table, prefix)  -> int
KSR.htable.shtcn_suffix(table, suffix)  -> int
KSR.htable.shtcn_regex(table, pattern)  -> int
```


**Behavioral notes / expectations**

Should mirror $shtcn() semantics where reasonable (esp. regex behavior), but 
returning an integer directly to KEMI.

Must not allocate PV expressions or interact with pv_cache.


**Why this belongs in htable KEMI**

$shtcn() is already offered at the PV level; parity in KEMI keeps feature 
consistency across scripting engines.

It enables memory-safe implementations of rolling-window rate limits and 
similar patterns (without touching PV).

**Alternatives considered**

Replace pattern counting with per-bucket counters (sht_inc), which leads to 
other problems like increment/decrement handling and locking. 

Use ratelimit/pike modules—useful for IP/method limits, but our use case is 
PAI/From/To based and currently hinges on pattern counts.

**Acceptance criteria**

A KEMI function exists to count matching keys in an htable without PV parsing.

Verified that repeated calls with dynamic patterns do not grow PV cache / PKG 
memory.

Basic tests for exact/prefix/suffix/regex modes (and skip_expired if 
implemented).

Thank you!

This would let KEMI users keep $shtcn()-style logic with the same performance 
characteristics, but without the PV-cache side effects.

-- 
Reply to this email directly or view it on GitHub:
https://github.com/kamailio/kamailio/issues/4426
You are receiving this because you are subscribed to this thread.

Message ID: <kamailio/kamailio/issues/[email protected]>
_______________________________________________
Kamailio - Development Mailing List -- [email protected]
To unsubscribe send an email to [email protected]
Important: keep the mailing list in the recipients, do not reply only to the 
sender!

Reply via email to