]> source.dussan.org Git - rspamd.git/commitdiff
Add busy handler for fuzzy backend to sync workers
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Fri, 6 Nov 2015 20:51:08 +0000 (20:51 +0000)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Fri, 6 Nov 2015 20:51:08 +0000 (20:51 +0000)
src/libserver/fuzzy_backend.c
src/libutil/util.h

index 23c4d6c64b810a39e6c285343318f3a74ceba0aa..d3461752143336a7a77e32022152a2315a8419da 100644 (file)
@@ -37,6 +37,9 @@ struct rspamd_fuzzy_backend {
        rspamd_mempool_t *pool;
 };
 
+static const gdouble sql_sleep_time = 0.1;
+static const guint max_retries = 10;
+
 #define msg_err_fuzzy_backend(...) rspamd_default_log_function (G_LOG_LEVEL_CRITICAL, \
         backend->pool->tag.tagname, backend->pool->tag.uid, \
         G_STRFUNC, \
@@ -244,6 +247,8 @@ rspamd_fuzzy_backend_run_stmt (struct rspamd_fuzzy_backend *backend, int idx, ..
        sqlite3_stmt *stmt;
        int i;
        const char *argtypes;
+       guint retries = 0;
+       struct timespec ts;
 
        if (idx < 0 || idx >= RSPAMD_FUZZY_BACKEND_MAX) {
 
@@ -288,12 +293,20 @@ rspamd_fuzzy_backend_run_stmt (struct rspamd_fuzzy_backend *backend, int idx, ..
        }
 
        va_end (ap);
+
+retry:
        retcode = sqlite3_step (stmt);
 
        if (retcode == prepared_stmts[idx].result) {
                return SQLITE_OK;
        }
        else if (retcode != SQLITE_DONE) {
+               if (retcode == SQLITE_BUSY && retries++ < max_retries) {
+                       double_to_ts (sql_sleep_time, &ts);
+                       nanosleep (&ts, NULL);
+                       goto retry;
+               }
+
                msg_debug_fuzzy_backend ("failed to execute query %s: %d, %s", prepared_stmts[idx].sql,
                                retcode, sqlite3_errmsg (backend->db));
        }
index 06240e19b84cc7cf6f2a939816f648d6c15c3696..31e68a80a8baa321f1c20e93f2d7a1ae7811e631 100644 (file)
@@ -192,6 +192,9 @@ void g_queue_clear (GQueue *queue);
 #define double_to_tv(dbl, tv) do { (tv)->tv_sec = (int)(dbl); (tv)->tv_usec = \
                                                                           ((dbl) - (int)(dbl)) * 1000 * 1000; \
 } while (0)
+#define double_to_ts(dbl, ts) do { (ts)->tv_sec = (int)(dbl); (ts)->tv_nsec = \
+                                       ((dbl) - (int)(dbl)) * 1e9; \
+} while (0)
 #define tv_to_msec(tv) ((tv)->tv_sec * 1000LLU + (tv)->tv_usec / 1000LLU)
 #define tv_to_double(tv) ((tv)->tv_sec + (tv)->tv_usec / 1e6f)
 #define ts_to_usec(ts) ((ts)->tv_sec * 1000000LLU +                                                    \