commit 1f7e6fa: [Minor] Statistics_dump: Support compression when dump

Vsevolod Stakhov vsevolod at highsecure.ru
Tue Apr 27 13:42:03 UTC 2021


Author: Vsevolod Stakhov
Date: 2021-04-27 14:30:44 +0100
URL: https://github.com/rspamd/rspamd/commit/1f7e6fab4cefebd90b5c5870abd687a588eb232a

[Minor] Statistics_dump: Support compression when dump

---
 lualib/rspamadm/statistics_dump.lua | 44 ++++++++++++++++++++++++++++++++++---
 1 file changed, 41 insertions(+), 3 deletions(-)

diff --git a/lualib/rspamadm/statistics_dump.lua b/lualib/rspamadm/statistics_dump.lua
index c21230a20..ec8892002 100644
--- a/lualib/rspamadm/statistics_dump.lua
+++ b/lualib/rspamadm/statistics_dump.lua
@@ -17,6 +17,9 @@ limitations under the License.
 local lua_redis = require "lua_redis"
 local rspamd_logger = require "rspamd_logger"
 local argparse = require "argparse"
+local rspamd_zstd = require "rspamd_zstd"
+local rspamd_text = require "rspamd_text"
+local ucl = require "ucl"
 
 local N = "statistics_dump"
 local E = {}
@@ -139,6 +142,8 @@ local function check_redis_classifier(cls, cfg)
 end
 
 local function dump_handler(opts)
+  io.write('[\n')
+
   for _,cls in ipairs(classifiers) do
     local res,conn = lua_redis.redis_connect_sync(cls.redis_params, false)
 
@@ -148,6 +153,10 @@ local function dump_handler(opts)
     end
 
     local cursor = 0
+    local compress_ctx
+    if opts.compress then
+      compress_ctx = rspamd_zstd.compress_ctx()
+    end
 
     repeat
       conn:add_cmd('SCAN', {tostring(cursor),
@@ -164,6 +173,7 @@ local function dump_handler(opts)
 
       local elts = results[2]
       local tokens = {}
+      local out = {}
 
       for _,e in ipairs(elts) do
         conn:add_cmd('HGETALL', {e})
@@ -177,14 +187,42 @@ local function dump_handler(opts)
         local r, hash_content = all_results[i], all_results[i + 1]
 
         if r then
-          tokens[elts[(i + 1)/2]] = hash_content
+          -- List to a hash map
+          local data = {}
+          for j=1,#hash_content,2 do
+            data[hash_content[j]] = hash_content[j + 1]
+          end
+          tokens[#tokens + 1] = {key = elts[(i + 1)/2], data = data}
         end
       end
 
-      for hkey,tok in pairs(tokens) do
-        rspamd_logger.messagex('%s: %s', hkey, tok)
+      -- Output keeping track of the commas
+      for i,d in ipairs(tokens) do
+        if i == #tokens then
+          out[#out + 1] = rspamd_logger.slog('{"%s": %s}\n', d.key,
+              ucl.to_format(d.data, "json-compact"))
+        else
+          out[#out + 1] = rspamd_logger.slog('{"%s": %s},\n', d.key,
+              ucl.to_format(d.data, "json-compact"))
+        end
+
       end
 
+      if cursor == 0 then
+        out[#out + 1] = ']\n'
+      end
+
+      if compress_ctx then
+        if cursor == 0 then
+          compress_ctx:stream(rspamd_text.fromtable(out), 'end'):write()
+        else
+          compress_ctx:stream(rspamd_text.fromtable(out), 'flush'):write()
+        end
+      else
+        for _,o in ipairs(out) do
+          io.write(o)
+        end
+      end
     until cursor == 0
   end
 end


More information about the Commits mailing list