]> source.dussan.org Git - rspamd.git/commitdiff
Fix converting of old storage.
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Tue, 12 May 2015 11:51:36 +0000 (12:51 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Tue, 12 May 2015 11:51:36 +0000 (12:51 +0100)
src/fuzzy_storage.c
src/libserver/fuzzy_backend.c

index 5e89b9207a5193b7676079bffd1e2a736aec0eef..052cf64c9a4ad0b1d56c9cdef3e1b414f41bfabb 100644 (file)
@@ -385,7 +385,7 @@ start_fuzzy (struct rspamd_worker *worker)
 
 
        if ((ctx->backend = rspamd_fuzzy_backend_open (ctx->hashfile, &err)) == NULL) {
-               msg_err (err->message);
+               msg_err ("cannot open backend: %e", err);
                g_error_free (err);
                exit (EXIT_FAILURE);
        }
index 0d7ce9485e8980476aaa3d0d44d6cfd7c07c772e..c59fa6133b3053a963345dd700e6d91b22c924bb 100644 (file)
@@ -433,37 +433,43 @@ rspamd_fuzzy_backend_convert (const gchar *path, int fd, GError **err)
        (void)lseek (fd, 0, SEEK_SET);
 
        off = sizeof (FUZZY_FILE_MAGIC);
-       if ((map = mmap (NULL, st.st_size - off, PROT_READ, MAP_SHARED, fd,
-                       0)) == MAP_FAILED) {
-               g_set_error (err, rspamd_fuzzy_backend_quark (),
-                               errno, "Cannot mmap file %s: %s",
-                               path, strerror (errno));
-               rspamd_fuzzy_backend_close (nbackend);
-
-               return FALSE;
+       if (off >= st.st_size) {
+               msg_warn ("old fuzzy storage is empty or corrupted, remove it");
        }
+       else {
+               if ((map = mmap (NULL, st.st_size - off, PROT_READ, MAP_SHARED, fd,
+                               0)) == MAP_FAILED) {
+                       g_set_error (err, rspamd_fuzzy_backend_quark (),
+                                       errno, "Cannot mmap file %s: %s",
+                                       path, strerror (errno));
+                       rspamd_fuzzy_backend_close (nbackend);
 
-       end = map + st.st_size;
-       p = map + off;
+                       return FALSE;
+               }
 
-       rspamd_fuzzy_backend_run_simple (RSPAMD_FUZZY_BACKEND_TRANSACTION_START,
+               end = map + st.st_size;
+               p = map + off;
+
+               rspamd_fuzzy_backend_run_simple (RSPAMD_FUZZY_BACKEND_TRANSACTION_START,
                                nbackend, NULL);
-       while (p < end) {
-               n = (struct rspamd_legacy_fuzzy_node *)p;
-               /* Convert node flag, digest, value, time  */
-               if (rspamd_fuzzy_backend_run_stmt (nbackend, RSPAMD_FUZZY_BACKEND_INSERT,
-                               (gint)n->flag, n->h.hash_pipe,
-                               (gint64)n->value, n->time) != SQLITE_OK) {
-                       msg_warn ("Cannot execute init sql %s: %s",
-                                       prepared_stmts[RSPAMD_FUZZY_BACKEND_INSERT].sql,
-                                       sqlite3_errmsg (nbackend->db));
+               while (p < end) {
+                       n = (struct rspamd_legacy_fuzzy_node *)p;
+                       /* Convert node flag, digest, value, time  */
+                       if (rspamd_fuzzy_backend_run_stmt (nbackend, RSPAMD_FUZZY_BACKEND_INSERT,
+                                       (gint)n->flag, n->h.hash_pipe,
+                                       (gint64)n->value, n->time) != SQLITE_OK) {
+                               msg_warn ("Cannot execute init sql %s: %s",
+                                               prepared_stmts[RSPAMD_FUZZY_BACKEND_INSERT].sql,
+                                               sqlite3_errmsg (nbackend->db));
+                       }
+                       p += sizeof (struct rspamd_legacy_fuzzy_node);
                }
-               p += sizeof (struct rspamd_legacy_fuzzy_node);
+
+               munmap (map, st.st_size);
+               rspamd_fuzzy_backend_run_simple (RSPAMD_FUZZY_BACKEND_TRANSACTION_COMMIT,
+                               nbackend, NULL);
        }
 
-       munmap (map, st.st_size);
-       rspamd_fuzzy_backend_run_simple (RSPAMD_FUZZY_BACKEND_TRANSACTION_COMMIT,
-                                       nbackend, NULL);
        rspamd_fuzzy_backend_run_sql (create_index_sql, nbackend, NULL);
        rspamd_fuzzy_backend_close (nbackend);
        rename (tmpdb, path);