diff options
author | Mikhail Galanin <mgalanin@mimecast.com> | 2018-09-11 11:07:58 +0100 |
---|---|---|
committer | Mikhail Galanin <mgalanin@mimecast.com> | 2018-09-11 11:07:58 +0100 |
commit | 09551bcf6ad0033e5e56e53b9d2e7b05d4d91996 (patch) | |
tree | 31284f84ec39c68c672ffb8ddf4f9a205573bd02 /lualib/lua_redis.lua | |
parent | 2ee5f7e4cdadb324aa16af67491f56a1f6fdb412 (diff) | |
parent | 36aac959a763a1fdd82b9056b43962d4ea898e38 (diff) | |
download | rspamd-09551bcf6ad0033e5e56e53b9d2e7b05d4d91996.tar.gz rspamd-09551bcf6ad0033e5e56e53b9d2e7b05d4d91996.zip |
Merge branch 'master' into redis-coroutines
Diffstat (limited to 'lualib/lua_redis.lua')
-rw-r--r-- | lualib/lua_redis.lua | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/lualib/lua_redis.lua b/lualib/lua_redis.lua index 3c7bcd3b6..e9ef33a9b 100644 --- a/lualib/lua_redis.lua +++ b/lualib/lua_redis.lua @@ -1029,4 +1029,94 @@ end exports.redis_connect_sync = redis_connect_sync +--[[[ +-- @function lua_redis.request(redis_params, attrs, req) +-- Sends a request to Redis (modern API) +-- @param redis_params a table of redis server parameters +-- @param attrs a table of redis request attributes (e.g. task, or ev_base + cfg + session) +-- @param req a table of request: a command + command options +--]] + +exports.request = function(redis_params, attrs, req) + local lua_util = require "lua_util" + + if not attrs or not redis_params or not req then + logger.errx('invalid arguments for redis request') + return false,nil,nil + end + + if not (attrs.task or (attrs.config and attrs.ev_base)) then + logger.errx('invalid attributes for redis request') + return false,nil,nil + end + + local opts = lua_util.shallowcopy(attrs) + + local log_obj = opts.task or opts.config + + local addr + + if opts.callback then + -- Wrap callback + local callback = opts.callback + local function rspamd_redis_make_request_cb(err, data) + if err then + addr:fail() + else + addr:ok() + end + callback(err, data, addr) + end + opts.callback = rspamd_redis_make_request_cb + end + + local rspamd_redis = require "rspamd_redis" + local is_write = opts.is_write + + if opts.key then + if is_write then + addr = redis_params['write_servers']:get_upstream_by_hash(attrs.key) + else + addr = redis_params['read_servers']:get_upstream_by_hash(attrs.key) + end + else + if is_write then + addr = redis_params['write_servers']:get_upstream_master_slave(attrs.key) + else + addr = redis_params['read_servers']:get_upstream_round_robin(attrs.key) + end + end + + if not addr then + logger.errx(log_obj, 'cannot select server to make redis request') + end + + opts.host = addr:get_addr() + opts.timeout = redis_params.timeout + + if type(req) == 'string' then + opts.cmd = req + else + -- XXX: modifies the input table + opts.cmd = table.remove(req, 1); + opts.args = req + end + + if redis_params.password then + opts.password = redis_params.password + end + + if redis_params.db then + opts.dbname = redis_params.db + end + + local ret,conn = rspamd_redis.make_request(opts) + if not ret then + logger.errx(log_obj, 'cannot execute redis request') + addr:fail() + end + + return ret,conn,addr +end + return exports |