[prev in list] [next in list] [prev in thread] [next in thread]
List: keepalived-devel
Subject: Re: [Keepalived-devel] [PATCH] add ability to configure checker parameters in vs
From: Alexey Andriyanov <alan () al-an ! info>
Date: 2014-08-16 9:11:21
Message-ID: 53EF2039.5090400 () al-an ! info
[Download RAW message or body]
See comments in-line
15.08.2014 14:46, Bjørnar Ness пишет:
> When using TUN or DR, parameters such as connect_ip,
> connect_port and so on are often duplicated in all checker
> config-blocks.
>
> This patch adds possibility to define defaults for these settings
> in virtual_server block, which can be overwritten in checker blocks.
If we decide to solve the config size problem, shouldn't we focus first on the \
checker's parameters, like check method, URL and so on? They are usually the same for \
all the real servers no matter do we use DR/TUN or not.
>
> patch attached..
>
> -- Bj(/)rnar
>
>
> keepalived-def_conn_opts.diff
>
>
> diff --git a/keepalived/check/check_api.c b/keepalived/check/check_api.c
> index 6df05a2..209a742 100644
> --- a/keepalived/check/check_api.c
> +++ b/keepalived/check/check_api.c
> @@ -75,13 +75,20 @@ queue_checker(void (*free_func) (void *), void (*dump_func) \
> (void *) , conn_opts_t *co)
> {
> virtual_server_t *vs = LIST_TAIL_DATA(check_data->vs);
> + conn_opts_t *def_co = vs->def_co;
> real_server_t *rs = LIST_TAIL_DATA(vs->rs);
> checker_t *checker = (checker_t *) MALLOC(sizeof (checker_t));
>
> /* Set default dst = RS, timeout = 5 */
> if (co) {
> - co->dst = rs->addr;
> - co->connection_to = 5 * TIMER_HZ;
I suggest to make def_co a member struct, not a pointer. In that case the following \
if would not be necessary, and unconditional memcpy could be used. The \
def_co.connection_to would be always set to the default value. Only the RS address \
assignment would stay conditional here.
> + /* copy conn_opts from vs to current checker if set */
> + if(def_co)
> + memcpy(co, def_co, sizeof(struct _conn_opts));
> + else
> + co->connection_to = 5 * TIMER_HZ;
> +
> + if(! vs->def_co_ip_set)
> + co->dst = rs->addr;
> }
>
> checker->free_func = free_func;
> diff --git a/keepalived/check/check_data.c b/keepalived/check/check_data.c
> index 5cc2ed8..a226527 100644
> --- a/keepalived/check/check_data.c
> +++ b/keepalived/check/check_data.c
> @@ -159,6 +159,7 @@ free_vs(void *data)
> free_list(vs->rs);
> FREE_PTR(vs->quorum_up);
> FREE_PTR(vs->quorum_down);
> + FREE_PTR(vs->def_co);
this would not be necessary, too
> FREE(vs);
> }
> static void
> @@ -241,6 +242,8 @@ alloc_vs(char *ip, char *port)
> new->delay_loop = KEEPALIVED_DEFAULT_DELAY;
> strncpy(new->timeout_persistence, "0", 1);
> new->virtualhost = NULL;
> + new->def_co = NULL;
> + new->def_co_ip_set = 0;
here we would assign the default connection_to, without duplicating of this constant \
in def_co_timeout_handler.
> new->alpha = 0;
> new->omega = 0;
> new->quorum_up = NULL;
> diff --git a/keepalived/check/check_parser.c b/keepalived/check/check_parser.c
> index cc270ab..3cd20dc 100644
> --- a/keepalived/check/check_parser.c
> +++ b/keepalived/check/check_parser.c
> @@ -163,6 +163,77 @@ virtualhost_handler(vector_t *strvec)
> vs->virtualhost = set_value(strvec);
> }
>
> +conn_opts_t *
> +def_co_get(virtual_server_t *vs)
> +{
> + conn_opts_t *co;
> +
> + if(vs->def_co)
> + return vs->def_co;
> +
> + co = CHECKER_NEW_CO();
> + vs->def_co = co;
> + /* Set default timeout = 5 */
> + co->connection_to = 5 * TIMER_HZ;
> +
> + return co;
> +}
> +static void
> +def_co_ip_handler(vector_t *strvec)
> +{
> + virtual_server_t *vs = LIST_TAIL_DATA(check_data->vs);
> + conn_opts_t *co = def_co_get(vs);
> +
> + inet_stosockaddr(vector_slot(strvec,1), 0, &co->dst);
> + vs->def_co_ip_set = 1;
> +}
> +static void
> +def_co_port_handler(vector_t *strvec)
> +{
> + virtual_server_t *vs = LIST_TAIL_DATA(check_data->vs);
> + conn_opts_t *co = def_co_get(vs);
> +
> + checker_set_dst_port(&co->dst, htons(CHECKER_VALUE_INT(strvec)));
> +}
> +static void
> +def_co_srcip_handler(vector_t *strvec)
> +{
> + virtual_server_t *vs = LIST_TAIL_DATA(check_data->vs);
> + conn_opts_t *co = def_co_get(vs);
> +
> + inet_stosockaddr(vector_slot(strvec, 1), 0, &co->bindto);
> +}
> +static void
> +def_co_srcport_handler(vector_t *strvec)
> +{
> + virtual_server_t *vs = LIST_TAIL_DATA(check_data->vs);
> + conn_opts_t *co = def_co_get(vs);
> +
> + checker_set_dst_port(&co->bindto, htons(CHECKER_VALUE_INT(strvec)));
> +}
> +static void
> +def_co_timeout_handler(vector_t *strvec)
> +{
> + virtual_server_t *vs = LIST_TAIL_DATA(check_data->vs);
> + conn_opts_t *co = def_co_get(vs);
> +
> + co->connection_to = CHECKER_VALUE_INT(strvec) * TIMER_HZ;
> +
> + /* do not allow 0 timeout */
> + if(! co->connection_to)
> + co->connection_to = TIMER_HZ;
> +}
> +#ifdef _WITH_SO_MARK_
> +static void
> +def_co_fwmark_handler(vector_t *strvec)
> +{
> + virtual_server_t *vs = LIST_TAIL_DATA(check_data->vs);
> + conn_opts_t *co = def_co_get(vs);
> +
> + co->fwmark = CHECKER_VALUE_INT(strvec);
> +}
> +#endif
> +
> /* Sorry Servers handlers */
> static void
> ssvr_handler(vector_t *strvec)
> @@ -312,6 +383,15 @@ check_init_keywords(void)
> install_keyword("ops", &ops_handler);
> install_keyword("virtualhost", &virtualhost_handler);
>
> + install_keyword("connect_ip", &def_co_ip_handler);
> + install_keyword("connect_port", &def_co_port_handler);
> + install_keyword("bindto", &def_co_srcip_handler);
> + install_keyword("bind_port", &def_co_srcport_handler);
> + install_keyword("connect_timeout", &def_co_timeout_handler);
> +#ifdef _WITH_SO_MARK_
> + install_keyword("fwmark", &def_co_fwmark_handler);
> +#endif
Here we duplicate the connection options list. I think we can invent a method to use \
universal connpots handlers, thus def_*_handler functions would not appear and the \
install_connect_keywords() call could be used here. To do so, the global var \
containing a pointer to the current conn_opts_t structure could be used.
> +
> /* Pool regression detection and handling. */
> install_keyword("alpha", &alpha_handler);
> install_keyword("omega", &omega_handler);
> diff --git a/keepalived/include/check_data.h b/keepalived/include/check_data.h
> index f634633..e4a3ecd 100644
> --- a/keepalived/include/check_data.h
> +++ b/keepalived/include/check_data.h
> @@ -49,6 +49,7 @@
>
> /* Typedefs */
> typedef unsigned int checker_id_t;
> +typedef struct _conn_opts conn_opts_t;
May be just move the conn_opt_t definition to the check_data.h ?
>
> /* Daemon dynamic data structure definition */
> #define MAX_TIMEOUT_LENGTH 5
> @@ -124,6 +125,8 @@ typedef struct _virtual_server {
> uint32_t nat_mask;
> uint32_t granularity_persistence;
> char *virtualhost;
> + conn_opts_t *def_co;
> + int def_co_ip_set;
def_co_ip_set field is not necessary, we could check if af != AF_UNSPEC
> list rs;
> int alive;
> unsigned alpha; /* Alpha mode enabled. */
>
>
>
> ------------------------------------------------------------------------------
--
Best regards,
Alexey
------------------------------------------------------------------------------
_______________________________________________
Keepalived-devel mailing list
Keepalived-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/keepalived-devel
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic