Thanks Daniel,

Works like a charm!

Regards,


From: Daniel-Constantin Mierla <mico...@gmail.com>
Sent: Friday, November 17, 2023 10:17 AM
To: Kamailio (SER) - Users Mailing List <sr-users@lists.kamailio.org>
Cc: Ali Taher <ata...@vanrise.com>
Subject: Re: [SR-Users] Re: pv cache limit is going to be exceeded


Hello,

the way the pseudo-variables were designed makes different definitions for 
$redis(r=>value[i] and $redis(r=>value[j], practically, if you have the index 
going on a large range, then you define a lot of variables. The solution is to 
leverage another pseduo-variable that you set with the index, like:

KSR.pvx.var_seti("i", right);

resultRight = tostring(KSR.pv.get("$redis(r=>value[$var(i)])"));

KSR.pvx.var_seti("i", left);

resultLeft = tostring(KSR.pv.get("$redis(r=>value[$var(i)])"));

Cheers,
Daniel
On 16.11.23 10:46, Ali Taher via sr-users wrote:
Hello all,

If the data returned from redis is of type array, and if I want to iterate 
through all the elements in the array, then I have to get $redis(r=>value[x]) 
for each element, and a pseudo variable for each element is allocated in the 
memory, is that correct?

Regards,


From: Ali Taher via sr-users 
<sr-users@lists.kamailio.org><mailto:sr-users@lists.kamailio.org>
Sent: Wednesday, November 15, 2023 4:51 PM
To: Kamailio (SER) - Users Mailing List 
<sr-users@lists.kamailio.org><mailto:sr-users@lists.kamailio.org>
Cc: Ali Taher <ata...@vanrise.com><mailto:ata...@vanrise.com>
Subject: [SR-Users] pv cache limit is going to be exceeded

Hello all,

I’m using the following Lua script to fetch data from Redis, which is in form 
of list:

function split(str, delimiter)
    for token in string.gmatch(str, "[^" .. delimiter .. "]+") do
        return token
    end
end

function contains(mainString, subString)
    return string.find(mainString, subString, 1, true) ~= nil
end

function longest_match_acode()

                local currentSeconds = os.time()
                local milliseconds = os.clock() * 1000
                local ddate = os.date("%Y-%m-%d %H:%M:%S", currentSeconds) .. 
string.format(".%03d", milliseconds)
                KSR.xlog.xinfo("starting date:" ..ddate)

                local size = 0
                local result

                local acode = "29192"
                local inputbcode = "4474173"
                local delimiter = ":"

                while size == 0 do
                                local currentSeconds = os.time()
                                acode = string.sub(acode, 1, string.len(acode) 
- 1)
                                KSR.ndb_redis.redis_cmd("srvN", "LRANGE price:" 
.. acode .." 0 -1", "r")
                                size = tonumber(KSR.pv.get("$redis(r=>size)"))
                end

                local left = 0
                local right = size - 1

                while left <= right do
                    local currentSeconds = os.time()
        local milliseconds = os.clock() * 1000
        local ddate = os.date("%Y-%m-%d %H:%M:%S", currentSeconds) .. 
string.format(".%03d", milliseconds)

                                resultRight = 
tostring(KSR.pv.get("$redis(r=>value[" .. right .. "])"))
                                resultLeft = 
tostring(KSR.pv.get("$redis(r=>value[" .. left .. "])"))

                                local bcodeLeft = split(resultLeft, delimiter)
                                local bcodeRight = split(resultRight, delimiter)

                                if contains(inputbcode, bcodeRight) then
                                                KSR.xlog.xinfo("Input bcode 
contains bcode value from Redis: " .. resultRight .. " at index: " .. right .. 
" with date: " .. ddate)
                                end

                                if contains(inputbcode, bcodeLeft) then
                                   KSR.xlog.xinfo("Input bcode contains bcode 
value from Redis: " .. resultLeft .. " at index: " .. left .. " with date: " .. 
ddate)
                                end
                                left = left + 1
                                right = right - 1
                end
                local currentSeconds = os.time()
                local milliseconds = os.clock() * 1000
                local ddate = os.date("%Y-%m-%d %H:%M:%S", currentSeconds) .. 
string.format(".%03d", milliseconds)
                KSR.xlog.xinfo("ending date:" ..ddate)

end

function ksr_request_route()

                if KSR.is_INVITE() then
        longest_match_acode()
        KSR.sl.send_reply("404", "Not found");
                end
end

I’m getting the following warning in the log : WARNING: LUA {INVITE}: <core> 
[core/pvapi.c:340]: pv_cache_add(): pv cache limit is going to be exceeded - 
pkg memory may get filled with pv declarations
I think the issue is in the following lines:
resultRight = tostring(KSR.pv.get("$redis(r=>value[" .. right .. "])"))
resultLeft = tostring(KSR.pv.get("$redis(r=>value[" .. left .. "])"))

the list coming from Redis has around 30k items, which I’m iterating through 
using value[x] which is exhausting the pv declaration as per my understanding.
How to overcome this issue? Is it possible to save the list as an array 
variable and then iterate through that array?

Regards,



__________________________________________________________

Kamailio - Users Mailing List - Non Commercial Discussions

To unsubscribe send an email to 
sr-users-le...@lists.kamailio.org<mailto:sr-users-le...@lists.kamailio.org>

Important: keep the mailing list in the recipients, do not reply only to the 
sender!

Edit mailing list options or unsubscribe:

--

Daniel-Constantin Mierla (@ asipto.com)

twitter.com/miconda -- linkedin.com/in/miconda

Kamailio Consultancy and Development Services

Kamailio Advanced Training -- asipto.com
__________________________________________________________
Kamailio - Users Mailing List - Non Commercial Discussions
To unsubscribe send an email to sr-users-le...@lists.kamailio.org
Important: keep the mailing list in the recipients, do not reply only to the 
sender!
Edit mailing list options or unsubscribe:

Reply via email to