]> source.dussan.org Git - rspamd.git/commitdiff
[Feature] Add versions to fuzzy storage
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Fri, 13 May 2016 14:58:01 +0000 (15:58 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Fri, 13 May 2016 14:58:01 +0000 (15:58 +0100)
src/fuzzy_storage.c
src/libserver/fuzzy_backend.c
src/libserver/fuzzy_backend.h

index f43cb3f440d8a9961f66bf9379d8ccdf4751c56a..7803307b0fffe0df8d05142c279535b352928d20 100644 (file)
@@ -209,6 +209,7 @@ rspamd_fuzzy_process_updates_queue (struct rspamd_fuzzy_storage_ctx *ctx)
        struct rspamd_fuzzy_cmd *cmd;
        gpointer ptr;
        guint nupdates = 0;
+       time_t now = time (NULL);
 
        if (ctx->updates_pending &&
                        g_queue_get_length (ctx->updates_pending) > 0 &&
@@ -227,7 +228,7 @@ rspamd_fuzzy_process_updates_queue (struct rspamd_fuzzy_storage_ctx *ctx)
                        }
 
                        if (cmd->cmd == FUZZY_WRITE) {
-                               rspamd_fuzzy_backend_add (ctx->backend, ptr);
+                               rspamd_fuzzy_backend_add (ctx->backend, ptr, now);
                        }
                        else {
                                rspamd_fuzzy_backend_del (ctx->backend, ptr);
@@ -248,7 +249,8 @@ rspamd_fuzzy_process_updates_queue (struct rspamd_fuzzy_storage_ctx *ctx)
                        }
 
                        g_queue_clear (ctx->updates_pending);
-                       msg_info ("updated fuzzy storage: %ud updates processed", nupdates);
+                       msg_info ("updated fuzzy storage: %ud updates processed, version: %d",
+                                       nupdates, rspamd_fuzzy_backend_version (ctx->backend));
                }
                else {
                        msg_err ("cannot commit update transaction to fuzzy backend, "
index a13d27f0924f0018c19bf0b1d18d3ef9434b3c5e..26e595e5f5fc64541b422b0662ae4947c03f8943 100644 (file)
@@ -93,6 +93,7 @@ enum rspamd_fuzzy_statement_idx {
        RSPAMD_FUZZY_BACKEND_EXPIRE,
        RSPAMD_FUZZY_BACKEND_VACUUM,
        RSPAMD_FUZZY_BACKEND_DELETE_ORPHANED,
+       RSPAMD_FUZZY_BACKEND_VERSION,
        RSPAMD_FUZZY_BACKEND_MAX
 };
 static struct rspamd_fuzzy_stmts {
@@ -212,6 +213,13 @@ static struct rspamd_fuzzy_stmts {
                .stmt = NULL,
                .result = SQLITE_DONE
        },
+       {
+               .idx = RSPAMD_FUZZY_BACKEND_VERSION,
+               .sql = "PRAGMA user_version;",
+               .args = "",
+               .stmt = NULL,
+               .result = SQLITE_ROW
+       },
 };
 
 static GQuark
@@ -624,7 +632,8 @@ rspamd_fuzzy_backend_prepare_update (struct rspamd_fuzzy_backend *backend)
 
 gboolean
 rspamd_fuzzy_backend_add (struct rspamd_fuzzy_backend *backend,
-               const struct rspamd_fuzzy_cmd *cmd)
+               const struct rspamd_fuzzy_cmd *cmd,
+               time_t timestamp)
 {
        int rc, i;
        gint64 id, flag;
@@ -680,7 +689,7 @@ rspamd_fuzzy_backend_add (struct rspamd_fuzzy_backend *backend,
                                (gint) cmd->flag,
                                cmd->digest,
                                (gint64) cmd->value,
-                               (gint64) time (NULL));
+                               (gint64) timestamp);
 
                if (rc == SQLITE_OK) {
                        if (cmd->shingles_count > 0) {
@@ -722,7 +731,9 @@ rspamd_fuzzy_backend_add (struct rspamd_fuzzy_backend *backend,
 gboolean
 rspamd_fuzzy_backend_finish_update (struct rspamd_fuzzy_backend *backend)
 {
-       gint rc, wal_frames, wal_checkpointed;
+       gint rc, wal_frames, wal_checkpointed, ver;
+       gint64 version = 0;
+       gchar version_buf[128];
 
        rc = rspamd_fuzzy_backend_run_stmt (backend, TRUE,
                        RSPAMD_FUZZY_BACKEND_TRANSACTION_COMMIT);
@@ -745,6 +756,17 @@ rspamd_fuzzy_backend_finish_update (struct rspamd_fuzzy_backend *backend)
                }
        }
 
+       /* Get and update version */
+       ver = rspamd_fuzzy_backend_version (backend);
+       ++ver;
+       rspamd_snprintf (version_buf, sizeof (version_buf), "PRAGMA user_version=%d;",
+                       ver);
+
+       if (sqlite3_exec (backend->db, version_buf, NULL, NULL, NULL) != SQLITE_OK) {
+                       msg_err_fuzzy_backend ("cannot set database version to %L: %s",
+                                       version, sqlite3_errmsg (backend->db));
+       }
+
        return TRUE;
 }
 
@@ -953,6 +975,24 @@ rspamd_fuzzy_backend_count (struct rspamd_fuzzy_backend *backend)
        return 0;
 }
 
+gint
+rspamd_fuzzy_backend_version (struct rspamd_fuzzy_backend *backend)
+{
+       gint ret = 0;
+
+       if (backend) {
+               if (rspamd_fuzzy_backend_run_stmt (backend, FALSE,
+                               RSPAMD_FUZZY_BACKEND_VERSION) == SQLITE_OK) {
+                       ret = sqlite3_column_int64 (
+                                       prepared_stmts[RSPAMD_FUZZY_BACKEND_VERSION].stmt, 0);
+               }
+
+               rspamd_fuzzy_backend_cleanup_stmt (backend, RSPAMD_FUZZY_BACKEND_VERSION);
+       }
+
+       return ret;
+}
+
 gsize
 rspamd_fuzzy_backend_expired (struct rspamd_fuzzy_backend *backend)
 {
index 04da9bbba813ca1dd0678bd0c87d120072560084..bcd199d1a4a1b4958fdd328102052a22ed3629a8 100644 (file)
@@ -56,7 +56,8 @@ gboolean rspamd_fuzzy_backend_prepare_update (struct rspamd_fuzzy_backend *backe
  */
 gboolean rspamd_fuzzy_backend_add (
                struct rspamd_fuzzy_backend *backend,
-               const struct rspamd_fuzzy_cmd *cmd);
+               const struct rspamd_fuzzy_cmd *cmd,
+               time_t timestamp);
 
 /**
  * Delete digest from the database
@@ -89,6 +90,7 @@ gboolean rspamd_fuzzy_backend_sync (struct rspamd_fuzzy_backend *backend,
 void rspamd_fuzzy_backend_close (struct rspamd_fuzzy_backend *backend);
 
 gsize rspamd_fuzzy_backend_count (struct rspamd_fuzzy_backend *backend);
+gint rspamd_fuzzy_backend_version (struct rspamd_fuzzy_backend *backend);
 gsize rspamd_fuzzy_backend_expired (struct rspamd_fuzzy_backend *backend);
 
 const gchar * rspamd_fuzzy_backend_id (struct rspamd_fuzzy_backend *backend);