Skip to content

Commit

Permalink
lua randomseed per worker
Browse files Browse the repository at this point in the history
  • Loading branch information
ElvinEfendi committed Dec 20, 2018
1 parent 66aecbd commit 4896b06
Show file tree
Hide file tree
Showing 6 changed files with 51 additions and 3 deletions.
5 changes: 5 additions & 0 deletions .luacheckrc
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,8 @@ globals = {
'_TEST'
}
exclude_files = {'./rootfs/etc/nginx/lua/test/**/*.lua'}
files["rootfs/etc/nginx/lua/lua_ingress.lua"] = {
ignore = { "122" },
-- TODO(elvinefendi) figure out why this does not work
--read_globals = {"math.randomseed"},
}
2 changes: 1 addition & 1 deletion build/static-check.sh
Original file line number Diff line number Diff line change
Expand Up @@ -25,4 +25,4 @@ fi

hack/verify-all.sh

luacheck -q rootfs/etc/nginx/lua/
luacheck --codes -q rootfs/etc/nginx/lua/
26 changes: 26 additions & 0 deletions rootfs/etc/nginx/lua/lua_ingress.lua
Original file line number Diff line number Diff line change
@@ -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
9 changes: 9 additions & 0 deletions rootfs/etc/nginx/lua/test/lua_ingress_test.lua
Original file line number Diff line number Diff line change
@@ -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)
4 changes: 2 additions & 2 deletions rootfs/etc/nginx/lua/test/run.lua
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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 })
8 changes: 8 additions & 0 deletions rootfs/etc/nginx/template/nginx.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,13 @@ http {
-- init modules
local ok, res

ok, res = pcall(require, "lua_ingress")
if not ok then
error("require failed: " .. tostring(res))
else
lua_ingress = res
end

ok, res = pcall(require, "configuration")
if not ok then
error("require failed: " .. tostring(res))
Expand Down Expand Up @@ -98,6 +105,7 @@ http {
}

init_worker_by_lua_block {
lua_ingress.init_worker()
balancer.init_worker()
{{ if $all.EnableMetrics }}
monitor.init_worker()
Expand Down

0 comments on commit 4896b06

Please sign in to comment.