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)