On 2010-12-03, Godesi <dabhee...@aim.com> wrote:
> relay web {

Try applying this diff from -current and rebuilding relayd.
It is an inline diff, if your mail client has problems giving
you valid plaintext then try pasting it from a web-based
mailing list archive instead.

I think the diff will probably apply fairly cleanly as I don't
think there have been big changes in relayd since 4.7, but I am not
certain. If you don't know how or have problems patching/building,
hopefully someone else will have time to explain things, or you
could try a -current snapshot which includes this already.

Also check that the following limits are sufficiently high for
the number of TCP connections:

login.conf, "daemon" class, openfiles-cur
sysctl kern.maxfiles

---------------------
PatchSet 489 
Date: 2010/12/20 12:38:06
Author: dhill
Branch: HEAD
Tag: (none) 
Log:
Only set SO_REUSEPORT for listening ports.

Fixes "Address already in use" errors seen on high load.

OK reyk@ pyr@

Members: 
        check_tcp.c:1.38->1.39 
        relay.c:1.127->1.128 

Index: src/usr.sbin/relayd/check_tcp.c
diff -u src/usr.sbin/relayd/check_tcp.c:1.38 
src/usr.sbin/relayd/check_tcp.c:1.39
--- src/usr.sbin/relayd/check_tcp.c:1.38        Tue Nov 30 14:38:45 2010
+++ src/usr.sbin/relayd/check_tcp.c     Mon Dec 20 12:38:06 2010
@@ -50,7 +50,6 @@
 check_tcp(struct ctl_tcp_event *cte)
 {
        int                      s;
-       int                      type;
        socklen_t                len;
        struct timeval           tv;
        struct linger            lng;
@@ -79,10 +78,6 @@
 
        bzero(&lng, sizeof(lng));
        if (setsockopt(s, SOL_SOCKET, SO_LINGER, &lng, sizeof(lng)) == -1)
-               goto bad;
-
-       type = 1;
-       if (setsockopt(s, SOL_SOCKET, SO_REUSEPORT, &type, sizeof(type)) == -1)
                goto bad;
 
        if (cte->host->conf.ttl > 0) {
Index: src/usr.sbin/relayd/relay.c
diff -u src/usr.sbin/relayd/relay.c:1.127 src/usr.sbin/relayd/relay.c:1.128
--- src/usr.sbin/relayd/relay.c:1.127   Tue Nov 30 14:49:14 2010
+++ src/usr.sbin/relayd/relay.c Mon Dec 20 12:38:06 2010
@@ -59,7 +59,7 @@
 void            relay_init(void);
 void            relay_launch(void);
 int             relay_socket(struct sockaddr_storage *, in_port_t,
-                   struct protocol *, int);
+                   struct protocol *, int, int);
 int             relay_socket_listen(struct sockaddr_storage *, in_port_t,
                    struct protocol *);
 int             relay_socket_connect(struct sockaddr_storage *, in_port_t,
@@ -622,7 +622,7 @@
 
 int
 relay_socket(struct sockaddr_storage *ss, in_port_t port,
-    struct protocol *proto, int fd)
+    struct protocol *proto, int fd, int reuseport)
 {
        int s = -1, val;
        struct linger lng;
@@ -640,9 +640,12 @@
        bzero(&lng, sizeof(lng));
        if (setsockopt(s, SOL_SOCKET, SO_LINGER, &lng, sizeof(lng)) == -1)
                goto bad;
-       val = 1;
-       if (setsockopt(s, SOL_SOCKET, SO_REUSEPORT, &val, sizeof(int)) == -1)
-               goto bad;
+       if (reuseport) {
+               val = 1;
+               if (setsockopt(s, SOL_SOCKET, SO_REUSEPORT, &val,
+                       sizeof(int)) == -1)
+                       goto bad;
+       }
        if (fcntl(s, F_SETFL, O_NONBLOCK) == -1)
                goto bad;
        if (proto->tcpflags & TCPFLAG_BUFSIZ) {
@@ -708,7 +711,7 @@
 {
        int     s;
 
-       if ((s = relay_socket(ss, port, proto, fd)) == -1)
+       if ((s = relay_socket(ss, port, proto, fd, 0)) == -1)
                return (-1);
 
        if (connect(s, (struct sockaddr *)ss, ss->ss_len) == -1) {
@@ -729,7 +732,7 @@
 {
        int s;
 
-       if ((s = relay_socket(ss, port, proto, -1)) == -1)
+       if ((s = relay_socket(ss, port, proto, -1, 1)) == -1)
                return (-1);
 
        if (bind(s, (struct sockaddr *)ss, ss->ss_len) == -1)

Reply via email to