]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
Rework rotation for upstreams
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Sat, 21 Nov 2015 13:20:37 +0000 (13:20 +0000)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Sat, 21 Nov 2015 13:20:37 +0000 (13:20 +0000)
src/libutil/upstream.c
src/libutil/upstream.h

index 33c5e4403f3a3977e8dfe4bd73949350b6353592..0054be93a7b87ae03fe3cffebf7e5574890f4747 100644 (file)
@@ -741,11 +741,10 @@ rspamd_upstream_get_hashed (struct upstream_list *ups, const guint8 *key, guint
 
 struct upstream*
 rspamd_upstream_get (struct upstream_list *ups,
-               enum rspamd_upstream_rotation type, ...)
+               enum rspamd_upstream_rotation default_type,
+               const guchar *key, gsize keylen)
 {
-       va_list ap;
-       const guint8 *key;
-       guint keylen;
+       enum rspamd_upstream_rotation type;
 
        rspamd_mutex_lock (ups->lock);
        if (ups->alive->len == 0) {
@@ -754,14 +753,18 @@ rspamd_upstream_get (struct upstream_list *ups,
        }
        rspamd_mutex_unlock (ups->lock);
 
+       type = ups->rot_alg != RSPAMD_UPSTREAM_UNDEF ? ups->rot_alg : default_type;
+
+       if (type == RSPAMD_UPSTREAM_HASHED && (keylen == 0 || key == NULL)) {
+               /* Cannot use hashed rotation when no key is specified, switch to random */
+               type = RSPAMD_UPSTREAM_RANDOM;
+       }
+
        switch (type) {
+       default:
        case RSPAMD_UPSTREAM_RANDOM:
                return rspamd_upstream_get_random (ups);
        case RSPAMD_UPSTREAM_HASHED:
-               va_start (ap, type);
-               key = va_arg (ap, const guint8 *);
-               keylen = va_arg (ap, guint);
-               va_end (ap);
                return rspamd_upstream_get_hashed (ups, key, keylen);
        case RSPAMD_UPSTREAM_ROUND_ROBIN:
                return rspamd_upstream_get_round_robin (ups, TRUE);
index c239a0e34afc7a6e04a59d25590d7aed44177256..4694900bb69250c5920c867faafbb6a72f499bab 100644 (file)
@@ -147,7 +147,8 @@ const gchar* rspamd_upstream_name (struct upstream *up);
  * @return
  */
 struct upstream* rspamd_upstream_get (struct upstream_list *ups,
-               enum rspamd_upstream_rotation type, ...);
+               enum rspamd_upstream_rotation default_type,
+               const guchar *key, gsize keylen);
 
 #endif /* UPSTREAM_H */
 /*