lua randomseed per worker

This commit is contained in:
Elvin Efendi 2018-12-19 17:46:53 +04:00
parent 66aecbd0b2
commit 4896b064ca
6 changed files with 51 additions and 3 deletions

View file

@ -0,0 +1,26 @@
local _M = {}
local seeds = {}
local original_randomseed = math.randomseed
math.randomseed = function(seed)
local pid = ngx.worker.pid()
if seeds[pid] then
ngx.log(ngx.WARN,
string.format("ignoring math.randomseed(%d) since PRNG is already seeded for worker %d", seed, pid))
return
end
original_randomseed(seed)
seeds[pid] = seed
end
local function randomseed()
math.randomseed(ngx.time() + ngx.worker.pid())
end
function _M.init_worker()
randomseed()
end
return _M

View file

@ -0,0 +1,9 @@
describe("lua_ingress", function()
it("patches math.randomseed to not be called more than once per worker", function()
local s = spy.on(ngx, "log")
math.randomseed(100)
assert.spy(s).was_called_with(ngx.WARN,
string.format("ignoring math.randomseed(%d) since PRNG is already seeded for worker %d", 100, ngx.worker.pid()))
end)
end)

View file

@ -1,4 +1,5 @@
local ffi = require("ffi")
local lua_ingress = require("lua_ingress")
-- without this we get errors such as "attempt to redefine XXX"
local old_cdef = ffi.cdef
@ -32,7 +33,6 @@ end
ngx.log = function(...) end
ngx.print = function(...) end
-- TODO(elvinefendi) once this is implemented for production (should be!), share the same code
math.randomseed(ngx.time() + ngx.worker.pid())
lua_ingress.init_worker()
require "busted.runner"({ standalone = false })