]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
[Rework] Get rid of GLib structures
authorVsevolod Stakhov <vsevolod@rspamd.com>
Sun, 29 Jan 2023 21:40:01 +0000 (21:40 +0000)
committerVsevolod Stakhov <vsevolod@rspamd.com>
Sun, 29 Jan 2023 21:40:01 +0000 (21:40 +0000)
src/libserver/fuzzy_backend/fuzzy_backend.c
src/libserver/fuzzy_backend/fuzzy_backend.h
src/libserver/fuzzy_backend/fuzzy_backend_redis.c
src/libserver/fuzzy_backend/fuzzy_backend_redis.h

index 2d4f75f60dee381654bc275ef2c496575a776034..3ad0040f2cbb5175e991112b36d7f0678456b01b 100644 (file)
@@ -35,7 +35,7 @@ static void rspamd_fuzzy_backend_check_sqlite (struct rspamd_fuzzy_backend *bk,
                rspamd_fuzzy_check_cb cb, void *ud,
                void *subr_ud);
 static void rspamd_fuzzy_backend_update_sqlite (struct rspamd_fuzzy_backend *bk,
-               GArray *updates, const gchar *src,
+               struct fuzzy_peer_cmd *peer_cmd, gsize ar_len, const gchar *src,
                rspamd_fuzzy_update_cb cb, void *ud,
                void *subr_ud);
 static void rspamd_fuzzy_backend_count_sqlite (struct rspamd_fuzzy_backend *bk,
@@ -54,23 +54,24 @@ static void rspamd_fuzzy_backend_close_sqlite (struct rspamd_fuzzy_backend *bk,
 
 struct rspamd_fuzzy_backend_subr {
        void* (*init) (struct rspamd_fuzzy_backend *bk, const ucl_object_t *obj,
-                       struct rspamd_config *cfg,
-                       GError **err);
+                                  struct rspamd_config *cfg,
+                                  GError **err);
        void (*check) (struct rspamd_fuzzy_backend *bk,
-                       const struct rspamd_fuzzy_cmd *cmd,
-                       rspamd_fuzzy_check_cb cb, void *ud,
-                       void *subr_ud);
+                                  const struct rspamd_fuzzy_cmd *cmd,
+                                  rspamd_fuzzy_check_cb cb, void *ud,
+                                  void *subr_ud);
        void (*update) (struct rspamd_fuzzy_backend *bk,
-                       GArray *updates, const gchar *src,
-                       rspamd_fuzzy_update_cb cb, void *ud,
-                       void *subr_ud);
+                                       struct fuzzy_peer_cmd *peer_cmd, gsize ar_len,
+                                       const gchar *src,
+                                       rspamd_fuzzy_update_cb cb, void *ud,
+                                       void *subr_ud);
        void (*count) (struct rspamd_fuzzy_backend *bk,
-                       rspamd_fuzzy_count_cb cb, void *ud,
-                       void *subr_ud);
+                                  rspamd_fuzzy_count_cb cb, void *ud,
+                                  void *subr_ud);
        void (*version) (struct rspamd_fuzzy_backend *bk,
-                       const gchar *src,
-                       rspamd_fuzzy_version_cb cb, void *ud,
-                       void *subr_ud);
+                                        const gchar *src,
+                                        rspamd_fuzzy_version_cb cb, void *ud,
+                                        void *subr_ud);
        const gchar* (*id) (struct rspamd_fuzzy_backend *bk, void *subr_ud);
        void (*periodic) (struct rspamd_fuzzy_backend *bk, void *subr_ud);
        void (*close) (struct rspamd_fuzzy_backend *bk, void *subr_ud);
@@ -154,9 +155,10 @@ rspamd_fuzzy_backend_check_sqlite (struct rspamd_fuzzy_backend *bk,
 
 static void
 rspamd_fuzzy_backend_update_sqlite (struct rspamd_fuzzy_backend *bk,
-               GArray *updates, const gchar *src,
-               rspamd_fuzzy_update_cb cb, void *ud,
-               void *subr_ud)
+                                                                       struct fuzzy_peer_cmd *peer_cmd, gsize ar_len,
+                                                                       const gchar *src,
+                                                                       rspamd_fuzzy_update_cb cb, void *ud,
+                                                                       void *subr_ud)
 {
        struct rspamd_fuzzy_backend_sqlite *sq = subr_ud;
        gboolean success = FALSE;
@@ -167,8 +169,8 @@ rspamd_fuzzy_backend_update_sqlite (struct rspamd_fuzzy_backend *bk,
        guint nupdates = 0, nadded = 0, ndeleted = 0, nextended = 0, nignored = 0;
 
        if (rspamd_fuzzy_backend_sqlite_prepare_update (sq, src)) {
-               for (i = 0; i < updates->len; i ++) {
-                       io_cmd = &g_array_index (updates, struct fuzzy_peer_cmd, i);
+               for (i = 0; i < ar_len; i ++) {
+                       io_cmd = &peer_cmd[i];
 
                        if (io_cmd->is_shingle) {
                                cmd = &io_cmd->cmd.shingle.basic;
@@ -347,18 +349,19 @@ rspamd_fuzzy_digest_equal (gconstpointer v, gconstpointer v2)
        return memcmp (v, v2, rspamd_cryptobox_HASHBYTES) == 0;
 }
 
+KHASH_INIT(fuzzy_dedup, guchar *, struct fuzzy_peer_cmd *, 1, rspamd_fuzzy_digest_hash, rspamd_fuzzy_digest_equal);
+
 static void
-rspamd_fuzzy_backend_deduplicate_queue (GArray *updates)
+rspamd_fuzzy_backend_deduplicate_queue (struct fuzzy_peer_cmd *peer_cmd, gsize ar_len)
 {
-       GHashTable *seen = g_hash_table_new (rspamd_fuzzy_digest_hash,
-                       rspamd_fuzzy_digest_equal);
+       khash_t(fuzzy_dedup) *seen = kh_init(fuzzy_dedup);
        struct fuzzy_peer_cmd *io_cmd, *found;
        struct rspamd_fuzzy_cmd *cmd;
        guchar *digest;
        guint i;
 
-       for (i = 0; i < updates->len; i ++) {
-               io_cmd = &g_array_index (updates, struct fuzzy_peer_cmd, i);
+       for (i = 0; i < ar_len; i ++) {
+               io_cmd = &peer_cmd[i];
 
                if (io_cmd->is_shingle) {
                        cmd = &io_cmd->cmd.shingle.basic;
@@ -369,15 +372,21 @@ rspamd_fuzzy_backend_deduplicate_queue (GArray *updates)
 
                digest = cmd->digest;
 
-               found = g_hash_table_lookup (seen, digest);
+               khiter_t k;
 
-               if (found == NULL) {
+               k = kh_get(fuzzy_dedup, seen, digest);
+
+               if (k == kh_end(seen)) {
                        /* Add to the seen list, if not a duplicate (huh?) */
                        if (cmd->cmd != FUZZY_DUP) {
-                               g_hash_table_insert (seen, digest, io_cmd);
+                               int _ret;
+                               k = kh_put(fuzzy_dedup, seen, digest, &_ret);
+                               kh_value(seen, k) = io_cmd;
                        }
                }
                else {
+                       found = kh_value(seen, k);
+
                        if (found->cmd.normal.flag != cmd->flag) {
                                /* TODO: deal with flags better at some point */
                                continue;
@@ -393,7 +402,7 @@ rspamd_fuzzy_backend_deduplicate_queue (GArray *updates)
                                }
                                else if (found->cmd.normal.cmd == FUZZY_REFRESH) {
                                        /* Seen refresh command, remove it as write has higher priority */
-                                       g_hash_table_replace (seen, digest, io_cmd);
+                                       kh_value(seen, k) = io_cmd;
                                        found->cmd.normal.cmd = FUZZY_DUP;
                                }
                                else if (found->cmd.normal.cmd == FUZZY_DEL) {
@@ -417,7 +426,7 @@ rspamd_fuzzy_backend_deduplicate_queue (GArray *updates)
                                break;
                        case FUZZY_DEL:
                                /* Delete has priority over all other commands */
-                               g_hash_table_replace (seen, digest, io_cmd);
+                               kh_value(seen, k) = io_cmd;
                                found->cmd.normal.cmd = FUZZY_DUP;
                                break;
                        default:
@@ -426,20 +435,20 @@ rspamd_fuzzy_backend_deduplicate_queue (GArray *updates)
                }
        }
 
-       g_hash_table_unref (seen);
+       kh_destroy(fuzzy_dedup, seen);
 }
 
 void
 rspamd_fuzzy_backend_process_updates (struct rspamd_fuzzy_backend *bk,
-               GArray *updates, const gchar *src, rspamd_fuzzy_update_cb cb,
+                                                                         struct fuzzy_peer_cmd *peer_cmd, gsize ar_len,
+                                                                         const gchar *src, rspamd_fuzzy_update_cb cb,
                void *ud)
 {
        g_assert (bk != NULL);
-       g_assert (updates != NULL);
 
-       if (updates) {
-               rspamd_fuzzy_backend_deduplicate_queue (updates);
-               bk->subr->update (bk, updates, src, cb, ud, bk->subr_ud);
+       if (peer_cmd) {
+               rspamd_fuzzy_backend_deduplicate_queue (peer_cmd, ar_len);
+               bk->subr->update (bk, peer_cmd, ar_len, src, cb, ud, bk->subr_ud);
        }
        else if (cb) {
                cb (TRUE, 0, 0, 0, 0, ud);
index 7de5c12fe94e03ff85a2edaa7f00c5cb15190783..3987f3bffcfce6b34148333fffc0fdfcc78bbae5 100644 (file)
@@ -32,7 +32,7 @@ struct rspamd_config;
  */
 typedef void (*rspamd_fuzzy_check_cb) (struct rspamd_fuzzy_reply *rep, void *ud);
 
-typedef void (*rspamd_fuzzy_update_cb) (gboolean success,
+typedef void (*rspamd_fuzzy_update_cb) (bool success,
                                                                                guint nadded,
                                                                                guint ndeleted,
                                                                                guint nextended,
@@ -75,7 +75,8 @@ void rspamd_fuzzy_backend_check (struct rspamd_fuzzy_backend *bk,
  * @param src
  */
 void rspamd_fuzzy_backend_process_updates (struct rspamd_fuzzy_backend *bk,
-                                                                                  GArray *updates, const gchar *src, rspamd_fuzzy_update_cb cb,
+                                                                                  struct fuzzy_peer_cmd *peer_cmd, gsize ar_len,
+                                                                                  const gchar *src, rspamd_fuzzy_update_cb cb,
                                                                                   void *ud);
 
 /**
index 0b7953bfe9f184fe763e3cfd2a609e16910a309f..344d443b2ed1c4f9d4f0b4408963637a23b44aba 100644 (file)
@@ -1413,9 +1413,9 @@ rspamd_fuzzy_redis_update_callback (redisAsyncContext *c, gpointer r,
 
 void
 rspamd_fuzzy_backend_update_redis (struct rspamd_fuzzy_backend *bk,
-               GArray *updates, const gchar *src,
-               rspamd_fuzzy_update_cb cb, void *ud,
-               void *subr_ud)
+                                                                  struct fuzzy_peer_cmd *peer_cmd, gsize ar_len, const gchar *src,
+                                                                  rspamd_fuzzy_update_cb cb, void *ud,
+                                                                  void *subr_ud)
 {
        struct rspamd_fuzzy_backend_redis *backend = subr_ud;
        struct rspamd_fuzzy_redis_session *session;
@@ -1465,8 +1465,8 @@ rspamd_fuzzy_backend_update_redis (struct rspamd_fuzzy_backend *bk,
 
        nargs = 4;
 
-       for (i = 0; i < updates->len; i ++) {
-               io_cmd = &g_array_index (updates, struct fuzzy_peer_cmd, i);
+       for (i = 0; i < ar_len; i ++) {
+               io_cmd = &peer_cmd[i];
 
                if (io_cmd->is_shingle) {
                        cmd = &io_cmd->cmd.shingle.basic;
@@ -1560,8 +1560,8 @@ rspamd_fuzzy_backend_update_redis (struct rspamd_fuzzy_backend *bk,
                /* Now split the rest of commands in packs and emit them command by command */
                cur_shift = 1;
 
-               for (i = 0; i < updates->len; i ++) {
-                       io_cmd = &g_array_index (updates, struct fuzzy_peer_cmd, i);
+               for (i = 0; i < ar_len; i ++) {
+                       io_cmd = &peer_cmd[i];
 
                        if (!rspamd_fuzzy_update_append_command (bk, session, io_cmd,
                                        &cur_shift)) {
index 544b20f608a77539dc9605ca60a0191cf091841d..c625f3e49eddd8d898c22efd3498884a153fa8ce 100644 (file)
@@ -38,7 +38,8 @@ void rspamd_fuzzy_backend_check_redis (struct rspamd_fuzzy_backend *bk,
                                                                           void *subr_ud);
 
 void rspamd_fuzzy_backend_update_redis (struct rspamd_fuzzy_backend *bk,
-                                                                               GArray *updates, const gchar *src,
+                                                                               struct fuzzy_peer_cmd *peer_cmd, gsize ar_len,
+                                                                               const gchar *src,
                                                                                rspamd_fuzzy_update_cb cb, void *ud,
                                                                                void *subr_ud);