dovecot-2.0: master: Changed listener backlog calculations.

dovecot at dovecot.org dovecot at dovecot.org
Sat Mar 27 07:03:26 EET 2010


details:   http://hg.dovecot.org/dovecot-2.0/rev/aefa279e2c70
changeset: 11014:aefa279e2c70
user:      Timo Sirainen <tss at iki.fi>
date:      Sat Mar 27 07:03:24 2010 +0200
description:
master: Changed listener backlog calculations.

diffstat:

 src/master/service-listen.c |  26 ++++++++++++++++++++------
 1 files changed, 20 insertions(+), 6 deletions(-)

diffs (54 lines):

diff -r 96496e1d3d12 -r aefa279e2c70 src/master/service-listen.c
--- a/src/master/service-listen.c	Sat Mar 27 06:54:51 2010 +0200
+++ b/src/master/service-listen.c	Sat Mar 27 07:03:24 2010 +0200
@@ -12,22 +12,35 @@
 #include <fcntl.h>
 #include <sys/stat.h>
 
+#define MIN_BACKLOG 4
 #define MAX_BACKLOG 128
 
+static unsigned int service_get_backlog(struct service *service)
+{
+	unsigned int backlog;
+
+	/* as unlikely as it is, avoid overflows */
+	if (service->process_limit > MAX_BACKLOG ||
+	    service->client_limit > MAX_BACKLOG)
+		backlog = MAX_BACKLOG;
+	else {
+		backlog = service->process_limit * service->client_limit;
+		if (backlog > MAX_BACKLOG)
+			backlog = MAX_BACKLOG;
+	}
+	return I_MAX(backlog, MIN_BACKLOG);
+}
+
 static int service_unix_listener_listen(struct service_listener *l)
 {
         struct service *service = l->service;
 	const struct file_listener_settings *set = l->set.fileset.set;
 	mode_t old_umask;
-	unsigned int backlog;
 	int fd, i;
 
 	old_umask = umask((set->mode ^ 0777) & 0777);
 	for (i = 0;; i++) {
-		backlog = service->process_limit * service->client_limit;
-		if (backlog > MAX_BACKLOG)
-			backlog = MAX_BACKLOG;
-		fd = net_listen_unix(set->path, backlog);
+		fd = net_listen_unix(set->path, service_get_backlog(service));
 		if (fd != -1)
 			break;
 
@@ -133,7 +146,8 @@
 	unsigned int port = set->port;
 	int fd;
 
-	fd = net_listen(&l->set.inetset.ip, &port, 128);
+	fd = net_listen(&l->set.inetset.ip, &port,
+			service_get_backlog(service));
 	if (fd < 0) {
 		service_error(service, "listen(%s, %u) failed: %m",
 			      l->inet_address, set->port);


More information about the dovecot-cvs mailing list