maybe_write_binlog (session->learn_classifier, st, statfile, tokens);
msg_info ("learn success for message <%s>, for statfile: %s, sum weight: %.2f",
task->message_id, session->learn_symbol, sum);
+ statfile_pool_plan_invalidate (session->worker->srv->statfile_pool, DEFAULT_STATFILE_INVALIDATE_TIME, DEFAULT_STATFILE_INVALIDATE_JITTER);
free_task (task, FALSE);
i = rspamd_snprintf (out_buf, sizeof (out_buf), "learn ok, sum weight: %.2f" CRLF, sum);
if (!rspamd_dispatcher_write (session->dispatcher, out_buf, i, FALSE, FALSE)) {
classifier->learn_func (ctx, task->worker->srv->statfile_pool, st->symbol, tokens, TRUE, NULL, 1., NULL);
maybe_write_binlog (ctx->cfg, st, statfile, tokens);
+ statfile_pool_plan_invalidate (task->worker->srv->statfile_pool, DEFAULT_STATFILE_INVALIDATE_TIME, DEFAULT_STATFILE_INVALIDATE_JITTER);
}
}
}
{
statfile_pool_t *new;
- new = memory_pool_alloc_shared (pool, sizeof (statfile_pool_t));
- bzero (new, sizeof (statfile_pool_t));
+ new = memory_pool_alloc0 (pool, sizeof (statfile_pool_t));
new->pool = memory_pool_new (memory_pool_get_size ());
new->max = max_size;
- new->files = memory_pool_alloc_shared (new->pool, STATFILES_MAX * sizeof (stat_file_t));
+ new->files = memory_pool_alloc0 (new->pool, STATFILES_MAX * sizeof (stat_file_t));
new->lock = memory_pool_get_mutex (new->pool);
return new;
return header->total_blocks;
}
+
+static void
+statfile_pool_invalidate_callback (int fd, short what, void *ud)
+{
+ statfile_pool_t *pool = ud;
+ stat_file_t *file;
+ int i;
+
+ msg_info ("invalidating %d statfiles", pool->opened);
+
+ for (i = 0; i < pool->opened; i ++) {
+ file = &pool->files[i];
+ msync (file->map, file->len, MS_ASYNC | MS_INVALIDATE);
+ }
+
+}
+
+
+void
+statfile_pool_plan_invalidate (statfile_pool_t *pool, time_t seconds, time_t jitter)
+{
+
+ if (pool->invalidate_event == NULL || ! evtimer_pending (pool->invalidate_event, NULL)) {
+
+ if (pool->invalidate_event == NULL) {
+ pool->invalidate_event = memory_pool_alloc (pool->pool, sizeof (struct event));
+ }
+ pool->invalidate_tv.tv_sec = seconds + g_random_int_range (0, jitter);
+ pool->invalidate_tv.tv_usec = 0;
+ evtimer_set (pool->invalidate_event, statfile_pool_invalidate_callback, pool);
+ evtimer_add (pool->invalidate_event, &pool->invalidate_tv);
+ msg_info ("invalidate of statfile pool is planned in %d seconds", (int)pool->invalidate_tv.tv_sec);
+ }
+}
#define STATFILE_SECTION_URLS 3
#define STATFILE_SECTION_REGEXP 4
+#define DEFAULT_STATFILE_INVALIDATE_TIME 30
+#define DEFAULT_STATFILE_INVALIDATE_JITTER 30
+
/**
* Common statfile header
*/
size_t occupied; /**< current size */
memory_pool_t *pool; /**< memory pool object */
memory_pool_mutex_t *lock; /**< mutex */
+ struct event *invalidate_event; /**< event for pool invalidation */
+ struct timeval invalidate_tv;
} statfile_pool_t;
/**
*/
uint64_t statfile_get_total_blocks (stat_file_t *file);
+
+/**
+ * Plan statfile pool invalidation
+ */
+void statfile_pool_plan_invalidate (statfile_pool_t *pool, time_t seconds, time_t jitter);
+
#endif
const char *value;
ls = GMIME_OBJECT (task->message)->headers;
+ iter = g_mime_header_iter_new ();
if (g_mime_header_list_get_iter (ls, iter)) {
while (g_mime_header_iter_is_valid (iter)) {
new = memory_pool_alloc (pool, sizeof (token_node_t));
name = g_mime_header_iter_get_name (iter);
value = g_mime_header_iter_get_value (iter);
- headername.begin = name;
+ headername.begin = (u_char *)name;
headername.len = strlen (name);
- headervalue.begin = value;
+ headervalue.begin = (u_char *)value;
headervalue.len = strlen (value);
new->h1 = fstrhash (&headername) * primes[0];
new->h2 = fstrhash (&headervalue) * primes[1];
}
}
}
+ g_mime_header_iter_free (iter);
#endif
return TRUE;
}