]> source.dussan.org Git - rspamd.git/commitdiff
[Feature] Add universal function to make a proper redis request
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Wed, 22 Jun 2016 13:38:16 +0000 (14:38 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Wed, 22 Jun 2016 13:38:16 +0000 (14:38 +0100)
src/lua/global_functions.lua

index 0aacd3989649c44e7a7b855c6884db6073c2105d..b68c5d5825968c34adf88fd3f32ff507f1ae65eb 100644 (file)
@@ -47,6 +47,8 @@ function rspamd_parse_redis_server(module_name)
       end
       if options['db'] then
         ret['db'] = options['db']
+      elseif options['dbname'] then
+        ret['db'] = options['dbname']
       end
       if options['password'] then
         ret['password'] = options['password']
@@ -89,6 +91,59 @@ function rspamd_parse_redis_server(module_name)
   return ret
 end
 
+-- Performs async call to redis hiding all complexity inside function
+-- task - rspamd_task
+-- redis_params - valid params returned by rspamd_parse_redis_server
+-- key - key to select upstream or nil to select round-robin/master-slave
+-- is_write - true if need to write to redis server
+-- callback - function to be called upon request is completed
+-- command - redis command
+-- args - table of arguments
+function rspamd_redis_make_request(task, redis_params, key, is_write, callback, command, args)
+  if not task or not redis_params or not callback or not command then
+    return false,nil,nil
+  end
+
+  local addr
+
+  if key then
+    if is_write then
+      addr = redis_params['write_servers']:get_upstream_by_hash(key)
+    else
+      addr = redis_params['read_servers']:get_upstream_by_hash(key)
+    end
+  else
+    if is_write then
+      addr = redis_params['write_servers']:get_upstream_master_slave(key)
+    else
+      addr = redis_params['read_servers']:get_upstream_round_robin(key)
+    end
+  end
+
+  if not addr then
+    logger.errx(task, 'cannot select server to make redis request')
+  end
+
+  local options = {
+    task = task,
+    callback = callback,
+    host = addr:get_addr(),
+    timeout = redis_params['timeout'],
+    cmd = command,
+    args = args
+  }
+
+  if redis_params['password'] then
+    options['password'] = redis_params['password']
+  end
+
+  if redis_params['db'] then
+    options['dbname'] = redis_params['db']
+  end
+
+  return rspamd_redis.make_request(options),addr
+end
+
 function rspamd_str_split(s, sep)
   local lpeg = require "lpeg"
   sep = lpeg.P(sep)