[Cluster-devel] [PATCH] Make fence_xvm's TTL configurable

Fabio M. Di Nitto fabbione at ubuntu.com
Wed Jan 30 05:12:32 UTC 2008


Hi Lon,

On Tue, 29 Jan 2008, Lon Hohberger wrote:

> fence_xvm's multicast TTL is statically set to 2.  On machines where a
> router is in-between, this can cause failures due to the router dropping
> the packets.

do I understand right that we use multicast because we don't know where 
the target of the message is or who is...?

If so, this can be considered _almost_ equivalent to rfc2608.txt that 
suggests different values of TTL in "discovery mode" and strongly 
encourage to have a configurable TTL in the client.

So the patch looks good, I think tho a good compromise would be a TTL of 
4/8 that will address automatically over 99.9% of our userbase without 
the need of a config change.

Fabio

>
> -- Lon
>
> Index: agents/xvm/fence_xvm.c
> ===================================================================
> RCS file: /cvs/cluster/cluster/fence/agents/xvm/fence_xvm.c,v
> retrieving revision 1.7
> diff -u -r1.7 fence_xvm.c
> --- agents/xvm/fence_xvm.c	17 Oct 2007 18:27:27 -0000	1.7
> +++ agents/xvm/fence_xvm.c	29 Jan 2008 21:42:50 -0000
> @@ -155,7 +155,8 @@
> 			mc_sock = ipv4_send_sk(ipa->ipa_address, args->addr,
> 					       args->port,
> 					       (struct sockaddr *)&tgt4,
> -					       sizeof(struct sockaddr_in));
> +					       sizeof(struct sockaddr_in),
> +					       args->ttl);
> 			tgt = (struct sockaddr *)&tgt4;
> 			tgt_len = sizeof(tgt4);
>
> @@ -163,7 +164,8 @@
> 			mc_sock = ipv6_send_sk(ipa->ipa_address, args->addr,
> 					       args->port,
> 					       (struct sockaddr *)&tgt6,
> -					       sizeof(struct sockaddr_in6));
> +					       sizeof(struct sockaddr_in6),
> +					       args->ttl);
> 			tgt = (struct sockaddr *)&tgt6;
> 			tgt_len = sizeof(tgt6);
> 		} else {
> @@ -317,7 +319,7 @@
> main(int argc, char **argv)
> {
> 	fence_xvm_args_t args;
> -	char *my_options = "di:a:p:r:C:c:k:H:uo:t:?hV";
> +	char *my_options = "di:a:p:T:r:C:c:k:H:uo:t:?hV";
>
> 	args_init(&args);
> 	if (argc == 1) {
> Index: agents/xvm/mcast.c
> ===================================================================
> RCS file: /cvs/cluster/cluster/fence/agents/xvm/mcast.c,v
> retrieving revision 1.3
> diff -u -r1.3 mcast.c
> --- agents/xvm/mcast.c	17 Oct 2007 18:27:27 -0000	1.3
> +++ agents/xvm/mcast.c	29 Jan 2008 21:42:50 -0000
> @@ -111,7 +111,7 @@
>  */
> int
> ipv4_send_sk(char *send_addr, char *addr, int port, struct sockaddr *tgt,
> -	     socklen_t tgt_len)
> +	     socklen_t tgt_len, int ttl)
> {
> 	int val;
> 	struct ip_mreq mreq;
> @@ -182,8 +182,8 @@
> 	/*
> 	 * set time to live to 2 hops.
> 	 */
> -	dbg_printf(4, "Setting TTL to 2 for fd%d\n", sock);
> -	val = 2;
> +	dbg_printf(4, "Setting TTL to %d for fd%d\n", ttl, sock);
> +	val = ttl;
> 	if (setsockopt(sock, SOL_IP, IP_MULTICAST_TTL, &val,
> 		       sizeof(val)))
> 		printf("warning: setting TTL failed %s\n", strerror(errno));
> @@ -278,7 +278,7 @@
>  */
> int
> ipv6_send_sk(char *send_addr, char *addr, int port, struct sockaddr *tgt,
> -	     socklen_t tgt_len)
> +	     socklen_t tgt_len, int ttl)
> {
> 	int val;
> 	struct ipv6_mreq mreq;
> @@ -361,7 +361,7 @@
> 	/*
> 	 * set time to live to 2 hops.
> 	 */
> -	val = 2;
> +	val = ttl;
> 	if (setsockopt(sock, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, &val,
> 		       sizeof(val)))
> 		printf("warning: setting TTL failed %s\n", strerror(errno));
> Index: agents/xvm/mcast.h
> ===================================================================
> RCS file: /cvs/cluster/cluster/fence/agents/xvm/mcast.h,v
> retrieving revision 1.1
> diff -u -r1.1 mcast.h
> --- agents/xvm/mcast.h	5 Oct 2006 16:11:36 -0000	1.1
> +++ agents/xvm/mcast.h	29 Jan 2008 21:42:50 -0000
> @@ -24,9 +24,11 @@
>
> int ipv4_recv_sk(char *addr, int port);
> int ipv4_send_sk(char *src_addr, char *addr, int port,
> -		 struct sockaddr *src, socklen_t slen);
> +		 struct sockaddr *src, socklen_t slen,
> +		 int ttl);
> int ipv6_recv_sk(char *addr, int port);
> int ipv6_send_sk(char *src_addr, char *addr, int port,
> -		 struct sockaddr *src, socklen_t slen);
> +		 struct sockaddr *src, socklen_t slen,
> +		 int ttl);
>
> #endif
> Index: agents/xvm/options.c
> ===================================================================
> RCS file: /cvs/cluster/cluster/fence/agents/xvm/options.c,v
> retrieving revision 1.6
> diff -u -r1.6 options.c
> --- agents/xvm/options.c	7 Jan 2008 05:52:28 -0000	1.6
> +++ agents/xvm/options.c	29 Jan 2008 21:42:50 -0000
> @@ -96,6 +96,17 @@
>
>
> static inline void
> +assign_ttl(fence_xvm_args_t *args, struct arg_info *arg, char *value)
> +{
> +	int ttl;
> +	ttl = atoi(value);
> +	if (ttl < 1 || ttl > 255)
> +		ttl = 2;
> +	args->ttl = ttl;
> +}
> +
> +
> +static inline void
> assign_port(fence_xvm_args_t *args, struct arg_info *arg, char *value)
> {
> 	args->port = atoi(value);
> @@ -260,6 +271,7 @@
> }
>
>
> +
> /** ALL valid command line and stdin arguments for this fencing agent */
> static struct arg_info _arg_info[] = {
> 	{ '\xff', NULL, "agent",
> @@ -286,6 +298,10 @@
> 	  "Multicast address (default=225.0.0.12 / ff02::3:1)",
> 	  assign_address },
>
> +	{ 'T', "-T <ttl>", "multicast_ttl",
> +	  "Multicast time-to-live (in hops; default=2)",
> +	  assign_ttl },
> +
> 	{ 'p', "-p <port>", "port",
> 	  "IP port (default=1229)",
> 	  assign_port },
> @@ -399,6 +415,7 @@
> 	args->retr_time = 20;
> 	args->flags = 0;
> 	args->debug = 0;
> +	args->ttl = 2;
> }
>
>
> Index: agents/xvm/options.h
> ===================================================================
> RCS file: /cvs/cluster/cluster/fence/agents/xvm/options.h,v
> retrieving revision 1.3
> diff -u -r1.3 options.h
> --- agents/xvm/options.h	26 Jun 2007 17:23:41 -0000	1.3
> +++ agents/xvm/options.h	29 Jan 2008 21:42:50 -0000
> @@ -45,6 +45,7 @@
> 	int retr_time;
> 	arg_flags_t flags;
> 	int debug;
> +	int ttl;
> } fence_xvm_args_t;
>
> /* Private structure for commandline / stdin fencing args */
>
>


--
I'm going to make him an offer he can't refuse.




More information about the Cluster-devel mailing list