]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
Rework upstreams initialization
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Fri, 20 Nov 2015 17:03:51 +0000 (17:03 +0000)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Fri, 20 Nov 2015 17:03:51 +0000 (17:03 +0000)
src/controller.c
src/http_proxy.c
src/libserver/cfg_utils.c
src/libutil/upstream.c
src/libutil/upstream.h
src/smtp_proxy.c
src/worker.c
test/rspamd_upstream_test.c

index 31274f5d69b299f35969f56805b50c9459a1b706..c0783ce9db18e4a9c60ce1a99bc18fa331dba028 100644 (file)
@@ -2550,9 +2550,8 @@ start_controller_worker (struct rspamd_worker *worker)
                        ctx->ev_base,
                        worker->srv->cfg);
 
-       worker->srv->cfg->ups_ctx = rspamd_upstreams_library_init (ctx->resolver->r,
-                       ctx->ev_base);
-       rspamd_upstreams_library_config (worker->srv->cfg, worker->srv->cfg->ups_ctx);
+       rspamd_upstreams_library_config (worker->srv->cfg, worker->srv->cfg->ups_ctx,
+                       ctx->ev_base, ctx->resolver->r);
        /* Maps events */
        rspamd_map_watch (worker->srv->cfg, ctx->ev_base);
        rspamd_symbols_cache_start_refresh (worker->srv->cfg->cache, ctx->ev_base);
index a5290de635cf1629c39e786bee1ab57f464c03bd..c35c02bd1d0576478af3e2038c0d73600e1bfe85 100644 (file)
@@ -459,9 +459,8 @@ start_http_proxy (struct rspamd_worker *worker)
                        worker->srv->cfg);
        double_to_tv (ctx->timeout, &ctx->io_tv);
 
-       ctx->cfg->ups_ctx = rspamd_upstreams_library_init (ctx->resolver->r,
-                       ctx->ev_base);
-       rspamd_upstreams_library_config (worker->srv->cfg, ctx->cfg->ups_ctx);
+       rspamd_upstreams_library_config (worker->srv->cfg, ctx->cfg->ups_ctx,
+                       ctx->ev_base, ctx->resolver->r);
 
        /* XXX: stupid default */
        ctx->keys_cache = rspamd_keypair_cache_new (256);
index ce704f8cf181f3d624ca56b9c6a8a7a1b53cfca9..53ce5add4624b89fb8e27fd96224cb624733a530 100644 (file)
@@ -197,6 +197,7 @@ rspamd_config_new (void)
 
        cfg->lua_state = rspamd_lua_init (cfg);
        cfg->cache = rspamd_symbols_cache_new (cfg);
+       cfg->ups_ctx = rspamd_upstreams_library_init ();
 
        REF_INIT_RETAIN (cfg, rspamd_config_free);
 
index 2218220b688d72accfc33e0be64f077295b64fd7..5ef913f45ea8ee54f585e6fc7d93500af51ca848 100644 (file)
@@ -79,6 +79,7 @@ struct upstream_ctx {
        gdouble dns_timeout;
        guint dns_retransmits;
        GQueue *upstreams;
+       gboolean configured;
        ref_entry_t ref;
 };
 
@@ -92,8 +93,12 @@ static guint default_dns_retransmits = 2;
 
 void
 rspamd_upstreams_library_config (struct rspamd_config *cfg,
-               struct upstream_ctx *ctx)
+               struct upstream_ctx *ctx, struct event_base *ev_base,
+               struct rdns_resolver *resolver)
 {
+       g_assert (ctx != NULL);
+       g_assert (cfg != NULL);
+
        if (cfg->upstream_error_time) {
                ctx->error_time = cfg->upstream_error_time;
        }
@@ -109,6 +114,10 @@ rspamd_upstreams_library_config (struct rspamd_config *cfg,
        if (cfg->dns_timeout) {
                ctx->dns_timeout = cfg->dns_timeout;
        }
+
+       ctx->ev_base = ev_base;
+       ctx->res = resolver;
+       ctx->configured = TRUE;
 }
 
 static void
@@ -131,8 +140,7 @@ rspamd_upstream_ctx_dtor (struct upstream_ctx *ctx)
 }
 
 struct upstream_ctx *
-rspamd_upstreams_library_init (struct rdns_resolver *resolver,
-               struct event_base *base)
+rspamd_upstreams_library_init (void)
 {
        struct upstream_ctx *ctx;
 
@@ -144,8 +152,6 @@ rspamd_upstreams_library_init (struct rdns_resolver *resolver,
        ctx->revive_jitter = default_revive_jitter;
        ctx->revive_time = default_revive_time;
 
-       ctx->res = resolver;
-       ctx->ev_base = base;
        ctx->upstreams = g_queue_new ();
        REF_INIT_RETAIN (ctx, rspamd_upstream_ctx_dtor);
 
@@ -302,7 +308,7 @@ rspamd_upstream_set_inactive (struct upstream_list *ls, struct upstream *up)
        g_ptr_array_remove_index (ls->alive, up->active_idx);
        up->active_idx = -1;
 
-       if (up->ctx->res != NULL) {
+       if (up->ctx->res != NULL && up->ctx->configured) {
                /* Resolve name of the upstream one more time */
                if (up->name[0] != '/') {
                        REF_RETAIN (up);
@@ -318,7 +324,7 @@ rspamd_upstream_set_inactive (struct upstream_list *ls, struct upstream *up)
 
        REF_RETAIN (up);
        evtimer_set (&up->ev, rspamd_upstream_revive_cb, up);
-       if (up->ctx->ev_base != NULL) {
+       if (up->ctx->ev_base != NULL && up->ctx->configured) {
                event_base_set (up->ctx->ev_base, &up->ev);
        }
 
index 4e48a42894c728b72205a2a483d5e8f754e08d05..a22a44589a7dbf8cba5af328d850bb223198386a 100644 (file)
@@ -25,15 +25,15 @@ struct upstream_ctx;
  * Init upstreams library
  * @param resolver
  */
-struct upstream_ctx* rspamd_upstreams_library_init (struct rdns_resolver *resolver,
-               struct event_base *base);
+struct upstream_ctx* rspamd_upstreams_library_init (void);
 
 /**
  * Configure attributes of upstreams library
  * @param cfg
  */
 void rspamd_upstreams_library_config (struct rspamd_config *cfg,
-               struct upstream_ctx *ctx);
+               struct upstream_ctx *ctx, struct event_base *ev_base,
+               struct rdns_resolver *resolver);
 
 /**
  * Upstream error logic
index 390ca292b5eb25b59881ca2e5a5fe95a19bc796a..74c1da4c758ea338552ce04836dc2dc820efab58 100644 (file)
@@ -1073,9 +1073,8 @@ start_smtp_proxy (struct rspamd_worker *worker)
                        ctx->ev_base,
                        worker->srv->cfg);
 
-       worker->srv->cfg->ups_ctx = rspamd_upstreams_library_init (ctx->resolver->r,
-                       ctx->ev_base);
-       rspamd_upstreams_library_config (worker->srv->cfg, worker->srv->cfg->ups_ctx);
+       rspamd_upstreams_library_config (worker->srv->cfg, worker->srv->cfg->ups_ctx,
+                       ctx->ev_base, ctx->resolver->r);
        /* Set umask */
        umask (S_IWGRP | S_IWOTH | S_IROTH | S_IRGRP);
 
index cd63a4e003294776ee7cf8f045b1e28e646676ed..e6362484823764715f694efc2214bf7cf2d52aa8 100644 (file)
@@ -352,9 +352,8 @@ start_worker (struct rspamd_worker *worker)
                        ctx->ev_base,
                        worker->srv->cfg);
 
-       ctx->cfg->ups_ctx = rspamd_upstreams_library_init (ctx->resolver->r,
-                       ctx->ev_base);
-       rspamd_upstreams_library_config (worker->srv->cfg, ctx->cfg->ups_ctx);
+       rspamd_upstreams_library_config (worker->srv->cfg, ctx->cfg->ups_ctx,
+                       ctx->ev_base, ctx->resolver->r);
 
        /* XXX: stupid default */
        ctx->keys_cache = rspamd_keypair_cache_new (256);
index 0cf163322648aefc9c632992a568fece69c1e41a..6ed14dbf58a5529ace754fea05cc3d3d4803f769 100644 (file)
@@ -74,9 +74,7 @@ rspamd_upstream_test_func (void)
        struct timeval tv;
        rspamd_inet_addr_t *addr, *next_addr, *paddr;
 
-       cfg = (struct rspamd_config *)g_malloc (sizeof (struct rspamd_config));
-       bzero (cfg, sizeof (struct rspamd_config));
-       cfg->cfg_pool = rspamd_mempool_new (rspamd_mempool_suggest_size (), NULL);
+       cfg = rspamd_config_new ();
        cfg->dns_retransmits = 2;
        cfg->dns_timeout = 0.5;
        cfg->upstream_max_errors = 1;
@@ -84,9 +82,7 @@ rspamd_upstream_test_func (void)
        cfg->upstream_error_time = 2;
 
        resolver = dns_resolver_init (NULL, ev_base, cfg);
-
-       cfg->ups_ctx = rspamd_upstreams_library_init (resolver->r, ev_base);
-       rspamd_upstreams_library_config (cfg, cfg->ups_ctx);
+       rspamd_upstreams_library_config (cfg, cfg->ups_ctx, ev_base, resolver->r);
 
        ls = rspamd_upstreams_create (cfg->ups_ctx);
        g_assert (rspamd_upstreams_parse_line (ls, test_upstream_list, 443, NULL));
@@ -170,4 +166,5 @@ rspamd_upstream_test_func (void)
        g_assert (rspamd_upstreams_alive (ls) == 3);
 
        rspamd_upstreams_destroy (ls);
+       REF_RELEASE (cfg);
 }