in kong/kong/globalpatches.lua [275:375]
_G.math.randomseed = function()
local pid = ngx.worker.pid()
local id
local is_seeded
local phase = ngx.get_phase()
if phase == "init" then
id = "master"
is_seeded = seeded.master
else
id = ngx.worker.id()
is_seeded = seeded[pid]
end
if is_seeded then
ngx.log(ngx.DEBUG, debug.traceback("attempt to seed already seeded random number " ..
"generator on process #" .. tostring(pid), 2))
return
end
if not options.cli and (phase ~= "init_worker" and phase ~= "init") then
ngx.log(ngx.WARN, debug.traceback("math.randomseed() must be called in " ..
"init or init_worker context", 2))
end
local seed
local bytes, err = util.get_rand_bytes(8)
if bytes then
ngx.log(ngx.DEBUG, "seeding PRNG from OpenSSL RAND_bytes()")
local t = {}
for i = 1, #bytes do
local byte = string.byte(bytes, i)
t[#t+1] = byte
end
local str = table.concat(t)
if #str > 12 then
str = string.sub(str, 1, 12)
end
seed = tonumber(str)
else
ngx.log(ngx.ERR, "could not seed from OpenSSL RAND_bytes, seeding ",
"PRNG with time and process id instead (this can ",
"result to duplicated seeds): ", err)
seed = ngx.now() * 1000 + pid
end
if not options.cli then
local kong_shm = ngx.shared.kong
if id == "master" then
local worker_count = ngx.worker.count()
local old_worker_count = kong_shm:get("worker:count")
if old_worker_count and old_worker_count > worker_count then
for i = worker_count, old_worker_count - 1 do
local old_worker_pid = kong_shm:get("pids:" .. i)
if old_worker_pid then
seeded[old_worker_pid] = nil
kong_shm:delete("pids:" .. i)
kong_shm:delete("kong:mem:" .. old_worker_pid)
end
end
end
if old_worker_count ~= worker_count then
local ok, err = kong_shm:safe_set("worker:count", worker_count)
if not ok then
ngx.log(ngx.WARN, "could not store worker count in kong shm: ", err)
end
end
seeded.master = true
else
local old_worker_pid = kong_shm:get("pids:" .. id)
if old_worker_pid then
seeded[old_worker_pid] = nil
kong_shm:delete("kong:mem:" .. old_worker_pid)
end
local ok, err = kong_shm:safe_set("pids:" .. id, pid)
if not ok then
ngx.log(ngx.WARN, "could not store process id in kong shm: ", err)
end
seeded[pid] = true
end
end
return randomseed(seed)
end