为了订阅redis-sentinel的+switch-master频道信息以更新shared dict中redis master的ip和端口
我在init_worker_by_lua中使用ngx.timer.at调用了这样一个函数(他的caller做了if premature then return等判断)
redis_subscribe = function()
local l = lock:new('redis_lock', {timeout = 0, exptime = 0})
local elapsed, err = l:lock('redis_watchdog')
if not elapsed then
return
end
local sentinel = redis:new()
sentinel:set_timeout(1000)
local ok, err = sentinel:connect('10.0.0.1', 26379)
if not ok then
ngx.log(ngx.WARN, "failed to connect to redis-sentinel: ", err)
l:unlock()
return
end
local res, err = sentinel:subscribe('+switch-master')
if not res then
ngx.log(ngx.WARN, "failed to subscribe: ", err)
sentinel:close()
l:unlock()
return
end
while true do
local res, err = sentinel:read_reply()
ngx.log(ngx.WARN, 'res=', res, ', err=', err, ', exiting=', ngx.worker.exiting())
if not res and err ~= "timeout" then
ngx.log(ngx.WARN, "failed to read reply: ", err)
sentinel:close()
l:unlock()
return
end
if res then
ngx.log(ngx.WARN, 'received publish')
redis_check()
return
end
end
return
end
每次reload都会出现一个进程显示worker process is shutting down
gdb bt:
#0 0x0000003f782e8e43 in __epoll_wait_nocancel () from /lib64/libc.so.6
#1 0x000000000043a158 in ngx_epoll_process_events (cycle=0x1cb3ef0, timer=1000, flags=1) at src/event/modules/ngx_epoll_module.c:580
#2 0x0000000000431e95 in ngx_process_events_and_timers (cycle=0x1cb3ef0) at src/event/ngx_event.c:248
#3 0x0000000000438488 in ngx_worker_process_cycle (cycle=0x1cb3ef0, data="" optimized out>) at src/os/unix/ngx_process_cycle.c:822
#4 0x0000000000436ad7 in ngx_spawn_process (cycle=0x1cb3ef0, proc=0x4383c0 <ngx_worker_process_cycle>, data="" name=0x4f9c33 "worker process", respawn=-3) at src/os/unix/ngx_process.c:198
#5 0x00000000004385fc in ngx_start_worker_processes (cycle=0x1cb3ef0, n=1, type=-3) at src/os/unix/ngx_process_cycle.c:368
#6 0x0000000000438cc4 in ngx_master_process_cycle (cycle=0x1cb3ef0) at src/os/unix/ngx_process_cycle.c:140
#7 0x000000000041a686 in main (argc=<value optimized out>, argv=<value optimized out>) at src/core/nginx.c:407
read_reply()处打的日志显示
2014/09/27 02:27:34 [warn] 30888#0: [lua] redis_master.lua:56: redis_subscribe(): res=nil, err=timeout, exiting=true, context: ngx.timer
exiting=true,不知为何无法正常退出?
如果不调用这个函数,就是ok的了。
nginx 1.7.5,git 最新master分支的lua module和lua resty redis模块。