LVS
lvs-users
Google
 
Web LinuxVirtualServer.org

Re: [lvs-users] WRR: no destination available:

To: support@xxxxxxxxxxxxxxxx, "LinuxVirtualServer.org users mailing list." <lvs-users@xxxxxxxxxxxxxxxxxxxxxx>
Subject: Re: [lvs-users] WRR: no destination available:
Cc: Julian Anastasov <ja@xxxxxx>
From: Simon Horman <horms@xxxxxxxxxxxx>
Date: Mon, 17 May 2010 08:11:36 +0900
On Fri, May 14, 2010 at 12:36:58PM +0100, Nick Chalk wrote:
> Hello Simon.
> 
> On 5 May 2010 08:22, Simon Horman <horms@xxxxxxxxxxxx> wrote:
> > Getting OPS upstream is on my todo list. So if you have a patch
> > then I'm very interested in it.
> 
> Apologies for the delay - attached is an updated version of the OPS
> patch which applies against kernel 2.6.32.7.
> 
> It's basically Julian Anastasov's patches, with minor changes to fit
> the new kernel. We've tested it locally, and have a customer testing
> fairly high traffic levels through OPS.

Thanks,

This looks good, though I have a few minor comments below.
Could you address them and then repost with a Signed-off-by line?

> diff -ur linux-2.6.32.7/include/linux/ip_vs.h 
> linux-2.6.32.7-ops/include/linux/ip_vs.h
> --- linux-2.6.32.7/include/linux/ip_vs.h      2010-01-28 23:06:20.000000000 
> +0000
> +++ linux-2.6.32.7-ops/include/linux/ip_vs.h  2010-04-28 23:40:56.000000000 
> +0100
> @@ -19,7 +19,7 @@
>   */
>  #define IP_VS_SVC_F_PERSISTENT       0x0001          /* persistent port */
>  #define IP_VS_SVC_F_HASHED   0x0002          /* hashed entry */
> -
> +#define IP_VS_SVC_F_ONEPACKET        0x0004          /* one-packet 
> scheduling */

I'd prefer to keep the blank line here.

>  /*
>   *      Destination Server Flags
>   */
> @@ -85,7 +85,7 @@
>  #define IP_VS_CONN_F_SEQ_MASK        0x0600          /* in/out sequence mask 
> */
>  #define IP_VS_CONN_F_NO_CPORT        0x0800          /* no client port set 
> yet */
>  #define IP_VS_CONN_F_TEMPLATE        0x1000          /* template, not 
> connection */
> -
> +#define IP_VS_CONN_F_ONE_PACKET      0x2000          /* forward only one 
> packet */

Ditto

>  #define IP_VS_SCHEDNAME_MAXLEN       16
>  #define IP_VS_IFNAME_MAXLEN  16
>  
> diff -ur linux-2.6.32.7/Makefile linux-2.6.32.7-ops/Makefile
> --- linux-2.6.32.7/Makefile   2010-01-28 23:06:20.000000000 +0000
> +++ linux-2.6.32.7-ops/Makefile       2010-04-28 23:47:39.000000000 +0100
> @@ -1,7 +1,7 @@
>  VERSION = 2
>  PATCHLEVEL = 6
>  SUBLEVEL = 32
> -EXTRAVERSION = .7
> +EXTRAVERSION = .7-ops
>  NAME = Man-Eating Seals of Antiquity
>  
>  # *DOCUMENTATION*

Please remove the above fragment, its not appropriate for merging.

> diff -ur linux-2.6.32.7/net/netfilter/ipvs/ip_vs_conn.c 
> linux-2.6.32.7-ops/net/netfilter/ipvs/ip_vs_conn.c
> --- linux-2.6.32.7/net/netfilter/ipvs/ip_vs_conn.c    2010-01-28 
> 23:06:20.000000000 +0000
> +++ linux-2.6.32.7-ops/net/netfilter/ipvs/ip_vs_conn.c        2010-05-14 
> 10:09:48.000000000 +0100
> @@ -142,6 +142,9 @@
>       unsigned hash;
>       int ret;
>  
> +     if (cp->flags & IP_VS_CONN_F_ONE_PACKET)
> +             return 0;
> +
>       /* Hash by protocol, client address and port */
>       hash = ip_vs_conn_hashkey(cp->af, cp->protocol, &cp->caddr, cp->cport);
>  
> @@ -339,8 +342,9 @@
>   */
>  void ip_vs_conn_put(struct ip_vs_conn *cp)
>  {
> -     /* reset it expire in its timeout */
> -     mod_timer(&cp->timer, jiffies+cp->timeout);
> +     unsigned long t = (cp->flags & IP_VS_CONN_F_ONE_PACKET) ?
> +             0 : cp->timeout;
> +     mod_timer(&cp->timer, jiffies+t);
>  
>       __ip_vs_conn_put(cp);
>  }
> @@ -633,7 +637,7 @@
>       /*
>        *      unhash it if it is hashed in the conn table
>        */
> -     if (!ip_vs_conn_unhash(cp))
> +     if (!ip_vs_conn_unhash(cp) && !(cp->flags & IP_VS_CONN_F_ONE_PACKET))
>               goto expire_later;
>  
>       /*
> diff -ur linux-2.6.32.7/net/netfilter/ipvs/ip_vs_core.c 
> linux-2.6.32.7-ops/net/netfilter/ipvs/ip_vs_core.c
> --- linux-2.6.32.7/net/netfilter/ipvs/ip_vs_core.c    2010-01-28 
> 23:06:20.000000000 +0000
> +++ linux-2.6.32.7-ops/net/netfilter/ipvs/ip_vs_core.c        2010-05-14 
> 10:11:17.000000000 +0100
> @@ -189,7 +189,8 @@
>       struct ip_vs_iphdr iph;
>       struct ip_vs_dest *dest;
>       struct ip_vs_conn *ct;
> -     __be16  dport;                  /* destination port to forward */
> +     __be16  dport;

The change immediately above seems unnecessary.

> +     __be16  flags;                  /* destination port to forward */
>       union nf_inet_addr snet;        /* source network of the client,
>                                          after masking */
>  
> @@ -336,6 +337,10 @@
>               dport = ports[1];
>       }
>  
> +     flags = (svc->flags & IP_VS_SVC_F_ONEPACKET
> +              && iph.protocol == IPPROTO_UDP)?
> +             IP_VS_CONN_F_ONE_PACKET : 0;
> +
>       /*
>        *    Create a new connection according to the template
>        */
> @@ -343,7 +348,7 @@
>                           &iph.saddr, ports[0],
>                           &iph.daddr, ports[1],
>                           &dest->addr, dport,
> -                         0,
> +                         flags,
>                           dest);
>       if (cp == NULL) {
>               ip_vs_conn_put(ct);
> @@ -373,7 +378,7 @@
>       struct ip_vs_conn *cp = NULL;
>       struct ip_vs_iphdr iph;
>       struct ip_vs_dest *dest;
> -     __be16 _ports[2], *pptr;
> +     __be16 _ports[2], *pptr, flags;
>  
>       ip_vs_fill_iphdr(svc->af, skb_network_header(skb), &iph);
>       pptr = skb_header_pointer(skb, iph.len, sizeof(_ports), _ports);
> @@ -403,6 +408,10 @@
>               return NULL;
>       }
>  
> +     flags = (svc->flags & IP_VS_SVC_F_ONEPACKET
> +              && iph.protocol == IPPROTO_UDP)?
> +             IP_VS_CONN_F_ONE_PACKET : 0;
> +
>       /*
>        *    Create a connection entry.
>        */
> @@ -410,7 +419,7 @@
>                           &iph.saddr, pptr[0],
>                           &iph.daddr, pptr[1],
>                           &dest->addr, dest->port ? dest->port : pptr[1],
> -                         0,
> +                         flags,
>                           dest);
>       if (cp == NULL)
>               return NULL;
> @@ -460,6 +469,9 @@
>       if (sysctl_ip_vs_cache_bypass && svc->fwmark && unicast) {
>               int ret, cs;
>               struct ip_vs_conn *cp;
> +             __u16 flags = (svc->flags & IP_VS_SVC_F_ONEPACKET &&
> +                             iph.protocol == IPPROTO_UDP)?
> +                             IP_VS_CONN_F_ONE_PACKET : 0;
>               union nf_inet_addr daddr =  { .all = { 0, 0, 0, 0 } };
>  
>               ip_vs_service_put(svc);
> @@ -470,7 +482,7 @@
>                                   &iph.saddr, pptr[0],
>                                   &iph.daddr, pptr[1],
>                                   &daddr, 0,
> -                                 IP_VS_CONN_F_BYPASS,
> +                                 IP_VS_CONN_F_BYPASS | flags,
>                                   NULL);
>               if (cp == NULL)
>                       return NF_DROP;
> diff -ur linux-2.6.32.7/net/netfilter/ipvs/ip_vs_ctl.c 
> linux-2.6.32.7-ops/net/netfilter/ipvs/ip_vs_ctl.c
> --- linux-2.6.32.7/net/netfilter/ipvs/ip_vs_ctl.c     2010-01-28 
> 23:06:20.000000000 +0000
> +++ linux-2.6.32.7-ops/net/netfilter/ipvs/ip_vs_ctl.c 2010-04-28 
> 23:40:56.000000000 +0100
> @@ -1863,14 +1863,16 @@
>                                          svc->scheduler->name);
>                       else
>  #endif
> -                             seq_printf(seq, "%s  %08X:%04X %s ",
> +                             seq_printf(seq, "%s  %08X:%04X %s %s ",
>                                          ip_vs_proto_name(svc->protocol),
>                                          ntohl(svc->addr.ip),
>                                          ntohs(svc->port),
> -                                        svc->scheduler->name);
> +                                        svc->scheduler->name,
> +                                        (svc->flags & 
> IP_VS_SVC_F_ONEPACKET)?"ops ":"");

There seems to be some unnecessary spaces between two tabs on
the line above.

>               } else {
> -                     seq_printf(seq, "FWM  %08X %s ",
> -                                svc->fwmark, svc->scheduler->name);
> +                     seq_printf(seq, "FWM  %08X %s %s",
> +                                svc->fwmark, svc->scheduler->name,
> +                                (svc->flags & IP_VS_SVC_F_ONEPACKET)?"ops 
> ":"");
>               }
>  
>               if (svc->flags & IP_VS_SVC_F_PERSISTENT)


_______________________________________________
Please read the documentation before posting - it's available at:
http://www.linuxvirtualserver.org/

LinuxVirtualServer.org mailing list - lvs-users@xxxxxxxxxxxxxxxxxxxxxx
Send requests to lvs-users-request@xxxxxxxxxxxxxxxxxxxxxx
or go to http://lists.graemef.net/mailman/listinfo/lvs-users

<Prev in Thread] Current Thread [Next in Thread>