fat                                      Thu, 11 Nov 2010 02:34:47 +0000

Revision: http://svn.php.net/viewvc?view=revision&revision=305267

Log:
- add "listen queue len" stat (thx to Andrei Nigmatulin)

Changed paths:
    U   php/php-src/branches/PHP_5_3/sapi/fpm/config.m4
    U   php/php-src/branches/PHP_5_3/sapi/fpm/fpm/fpm_conf.c
    U   php/php-src/branches/PHP_5_3/sapi/fpm/fpm/fpm_config.h
    U   php/php-src/branches/PHP_5_3/sapi/fpm/fpm/fpm_process_ctl.c
    U   php/php-src/branches/PHP_5_3/sapi/fpm/fpm/fpm_sockets.c
    U   php/php-src/branches/PHP_5_3/sapi/fpm/fpm/fpm_sockets.h
    U   php/php-src/branches/PHP_5_3/sapi/fpm/fpm/fpm_status.c
    U   php/php-src/branches/PHP_5_3/sapi/fpm/fpm/fpm_status.h
    U   php/php-src/branches/PHP_5_3/sapi/fpm/fpm/fpm_worker_pool.h
    U   php/php-src/trunk/sapi/fpm/config.m4
    U   php/php-src/trunk/sapi/fpm/fpm/fpm_conf.c
    U   php/php-src/trunk/sapi/fpm/fpm/fpm_config.h
    U   php/php-src/trunk/sapi/fpm/fpm/fpm_process_ctl.c
    U   php/php-src/trunk/sapi/fpm/fpm/fpm_sockets.c
    U   php/php-src/trunk/sapi/fpm/fpm/fpm_sockets.h
    U   php/php-src/trunk/sapi/fpm/fpm/fpm_status.c
    U   php/php-src/trunk/sapi/fpm/fpm/fpm_status.h
    U   php/php-src/trunk/sapi/fpm/fpm/fpm_worker_pool.h

Modified: php/php-src/branches/PHP_5_3/sapi/fpm/config.m4
===================================================================
--- php/php-src/branches/PHP_5_3/sapi/fpm/config.m4	2010-11-11 01:43:53 UTC (rev 305266)
+++ php/php-src/branches/PHP_5_3/sapi/fpm/config.m4	2010-11-11 02:34:47 UTC (rev 305267)
@@ -516,6 +516,39 @@
     AC_MSG_RESULT([no])
   ])
 ])
+
+AC_DEFUN([AC_FPM_LQ],
+[
+  have_lq=no
+
+  AC_MSG_CHECKING([for TCP_INFO])
+
+  AC_TRY_COMPILE([ #include <netinet/tcp.h> ], [struct tcp_info ti; int x = TCP_INFO;], [
+    have_lq=tcp_info
+    AC_MSG_RESULT([yes])
+  ], [
+    AC_MSG_RESULT([no])
+  ])
+
+  if test "$have_lq" = "tcp_info"; then
+    AC_DEFINE([HAVE_LQ_TCP_INFO], 1, [do we have TCP_INFO?])
+  fi
+
+  if test "$have_lq" = "no" ; then
+    AC_MSG_CHECKING([for SO_LISTENQLEN])
+
+    AC_TRY_COMPILE([ #include <sys/socket.h> ], [int x = SO_LISTENQLIMIT; int y = SO_LISTENQLEN;], [
+      have_lq=so_listenq
+      AC_MSG_RESULT([yes])
+    ], [
+      AC_MSG_RESULT([no])
+    ])
+
+    if test "$have_lq" = "tcp_info"; then
+      AC_DEFINE([HAVE_LQ_SO_LISTENQ], 1, [do we have SO_LISTENQxxx?])
+    fi
+  fi
+])
 dnl }}}

 AC_MSG_CHECKING(for FPM build)
@@ -543,6 +576,7 @@
   AC_FPM_CLOCK
   AC_FPM_TRACE
   AC_FPM_BUILTIN_ATOMIC
+  AC_FPM_LQ

   PHP_ARG_WITH(fpm-user,,
   [  --with-fpm-user[=USER]  Set the user for php-fpm to run as. (default: nobody)], nobody, no)

Modified: php/php-src/branches/PHP_5_3/sapi/fpm/fpm/fpm_conf.c
===================================================================
--- php/php-src/branches/PHP_5_3/sapi/fpm/fpm/fpm_conf.c	2010-11-11 01:43:53 UTC (rev 305266)
+++ php/php-src/branches/PHP_5_3/sapi/fpm/fpm/fpm_conf.c	2010-11-11 02:34:47 UTC (rev 305267)
@@ -576,7 +576,7 @@
 				return -1;
 			}
 			fpm_status_update_accepted_conn(wp->shm_status, 0);
-			fpm_status_update_activity(wp->shm_status, -1, -1, -1, 1);
+			fpm_status_update_activity(wp->shm_status, -1, -1, -1, 0, -1, 1);
 			fpm_status_update_max_children_reached(wp->shm_status, 0);
 			fpm_status_set_pm(wp->shm_status, wp->config->pm);
 			/* memset(&fpm_status.last_update, 0, sizeof(fpm_status.last_update)); */

Modified: php/php-src/branches/PHP_5_3/sapi/fpm/fpm/fpm_config.h
===================================================================
--- php/php-src/branches/PHP_5_3/sapi/fpm/fpm/fpm_config.h	2010-11-11 01:43:53 UTC (rev 305266)
+++ php/php-src/branches/PHP_5_3/sapi/fpm/fpm/fpm_config.h	2010-11-11 02:34:47 UTC (rev 305267)
@@ -42,3 +42,9 @@
 #define HAVE_FPM_TRACE 0
 #endif

+#if defined(HAVE_LQ_TCP_INFO) || defined(HAVE_LQ_SO_LISTENQ)
+#define HAVE_FPM_LQ 1
+#else
+#define HAVE_FPM_LQ 0
+#endif
+

Modified: php/php-src/branches/PHP_5_3/sapi/fpm/fpm/fpm_process_ctl.c
===================================================================
--- php/php-src/branches/PHP_5_3/sapi/fpm/fpm/fpm_process_ctl.c	2010-11-11 01:43:53 UTC (rev 305266)
+++ php/php-src/branches/PHP_5_3/sapi/fpm/fpm/fpm_process_ctl.c	2010-11-11 02:34:47 UTC (rev 305267)
@@ -19,6 +19,7 @@
 #include "fpm_request.h"
 #include "fpm_worker_pool.h"
 #include "fpm_status.h"
+#include "fpm_sockets.h"
 #include "zlog.h"


@@ -327,6 +328,7 @@
 		int idle = 0;
 		int active = 0;
 		int children_to_fork;
+		unsigned cur_lq;

 		if (wp->config == NULL) continue;

@@ -352,7 +354,10 @@
 		}

 		/* update status structure for all PMs */
-		fpm_status_update_activity(wp->shm_status, idle, active, idle + active, 0);
+		if (0 > fpm_socket_get_listening_queue(wp, &cur_lq, NULL)) {
+			cur_lq = 0;
+		}
+		fpm_status_update_activity(wp->shm_status, idle, active, idle + active, cur_lq, wp->listening_queue_len, 0);

 		/* the rest is only used by PM_STYLE_DYNAMIC */
 		if (wp->config->pm != PM_STYLE_DYNAMIC) continue;

Modified: php/php-src/branches/PHP_5_3/sapi/fpm/fpm/fpm_sockets.c
===================================================================
--- php/php-src/branches/PHP_5_3/sapi/fpm/fpm/fpm_sockets.c	2010-11-11 01:43:53 UTC (rev 305266)
+++ php/php-src/branches/PHP_5_3/sapi/fpm/fpm/fpm_sockets.c	2010-11-11 02:34:47 UTC (rev 305267)
@@ -344,6 +344,10 @@
 				break;
 		}

+		if (0 > fpm_socket_get_listening_queue(wp, NULL, (unsigned *) &wp->listening_queue_len)) {
+			wp->listening_queue_len = -1;
+		}
+
 		if (wp->listening_socket == -1) {
 			return -1;
 		}
@@ -373,3 +377,76 @@
 }
 /* }}} */

+#if HAVE_FPM_LQ
+
+#ifdef HAVE_LQ_TCP_INFO
+
+#include <netinet/tcp.h>
+
+int fpm_socket_get_listening_queue(struct fpm_worker_pool_s *wp, unsigned *cur_lq, unsigned *max_lq)
+{
+	if (wp->listen_address_domain != FPM_AF_INET) {
+		return -1;
+	}
+
+	struct tcp_info info;
+	socklen_t len = sizeof(info);
+
+	if (0 > getsockopt(wp->listening_socket, IPPROTO_TCP, TCP_INFO, &info, &len)) {
+		return -1;
+	}
+
+	/* kernel >= 2.6.24 return non-zero here, that means operation is supported */
+	if (info.tcpi_sacked == 0) {
+		return -1;
+	}
+
+	if (cur_lq) {
+		*cur_lq = info.tcpi_unacked;
+	}
+
+	if (max_lq) {
+		*max_lq = info.tcpi_sacked;
+	}
+
+	return 0;
+}
+
+#endif
+
+#ifdef HAVE_LQ_SO_LISTENQ
+
+int fpm_socket_get_listening_queue(struct fpm_worker_pool_s *wp, unsigned *cur_lq, unsigned *max_lq)
+{
+	int val;
+	socklen_t len = sizeof(val);
+
+	if (cur_lq) {
+		if (0 > getsockopt(wp->listening_socket, SOL_SOCKET, SO_LISTENQLEN, &val, &len)) {
+			return -1;
+		}
+
+		*cur_lq = val;
+	}
+
+	if (max_lq) {
+		if (0 > getsockopt(wp->listening_socket, SOL_SOCKET, SO_LISTENQLIMIT, &val, &len)) {
+			return -1;
+		}
+
+		*max_lq = val;
+	}
+
+	return 0;
+}
+
+#endif
+
+#else
+
+int fpm_socket_get_listening_queue(struct fpm_worker_pool_s *wp, unsigned *cur_lq, unsigned *max_lq)
+{
+	return -1;
+}
+
+#endif

Modified: php/php-src/branches/PHP_5_3/sapi/fpm/fpm/fpm_sockets.h
===================================================================
--- php/php-src/branches/PHP_5_3/sapi/fpm/fpm/fpm_sockets.h	2010-11-11 01:43:53 UTC (rev 305266)
+++ php/php-src/branches/PHP_5_3/sapi/fpm/fpm/fpm_sockets.h	2010-11-11 02:34:47 UTC (rev 305267)
@@ -21,6 +21,7 @@

 enum fpm_address_domain fpm_sockets_domain_from_address(char *addr);
 int fpm_sockets_init_main();
+int fpm_socket_get_listening_queue(struct fpm_worker_pool_s *wp, unsigned *cur_lq, unsigned *max_lq);


 static inline int fd_set_blocked(int fd, int blocked) /* {{{ */

Modified: php/php-src/branches/PHP_5_3/sapi/fpm/fpm/fpm_status.c
===================================================================
--- php/php-src/branches/PHP_5_3/sapi/fpm/fpm/fpm_status.c	2010-11-11 01:43:53 UTC (rev 305266)
+++ php/php-src/branches/PHP_5_3/sapi/fpm/fpm/fpm_status.c	2010-11-11 02:34:47 UTC (rev 305267)
@@ -133,7 +133,7 @@
 }
 /* }}} */

-void fpm_status_update_activity(struct fpm_shm_s *shm, int idle, int active, int total, int clear_last_update) /* {{{ */
+void fpm_status_update_activity(struct fpm_shm_s *shm, int idle, int active, int total, unsigned cur_lq, int max_lq, int clear_last_update) /* {{{ */
 {
 	struct fpm_status_s status;

@@ -146,6 +146,8 @@
 	status.idle = idle;
 	status.active = active;
 	status.total = total;
+	status.cur_lq = cur_lq;
+	status.max_lq = max_lq;
 	if (clear_last_update) {
 		memset(&status.last_update, 0, sizeof(status.last_update));
 	} else {
@@ -164,14 +166,28 @@
 	}

 	spprintf(output, 0,
-		"accepted conn:        %lu\n"
 		"pool:                 %s\n"
 		"process manager:      %s\n"
+		"accepted conn:        %lu\n"
+#if HAVE_FPM_LQ
+		"listen queue len:     %u\n"
+		"max listen queue len: %d\n"
+#endif
 		"idle processes:       %d\n"
 		"active processes:     %d\n"
 		"total processes:      %d\n"
 		"max children reached: %u\n",
-		status->accepted_conn, fpm_status_pool, status->pm == PM_STYLE_STATIC ? "static" : "dynamic", status->idle, status->active, status->total, status->max_children_reached);
+		fpm_status_pool,
+		status->pm == PM_STYLE_STATIC ? "static" : "dynamic",
+		status->accepted_conn,
+#if HAVE_FPM_LQ
+		status->cur_lq,
+		status->max_lq,
+#endif
+		status->idle,
+		status->active,
+		status->total,
+		status->max_children_reached);

 	spprintf(content_type, 0, "Content-Type: text/plain");
 }
@@ -185,15 +201,29 @@

 	spprintf(output, 0,
 		"<table>\n"
-		"<tr><th>accepted conn</th><td>%lu</td></tr>\n"
 		"<tr><th>pool</th><td>%s</td></tr>\n"
 		"<tr><th>process manager</th><td>%s</td></tr>\n"
+		"<tr><th>accepted conn</th><td>%lu</td></tr>\n"
+#if HAVE_FPM_LQ
+		"<tr><th>listen queue len</th><td>%u</td></tr>\n"
+		"<tr><th>max listen queue len</th><td>%d</td></tr>\n"
+#endif
 		"<tr><th>idle processes</th><td>%d</td></tr>\n"
 		"<tr><th>active processes</th><td>%d</td></tr>\n"
 		"<tr><th>total processes</th><td>%d</td></tr>\n"
 		"<tr><th>max children reached</th><td>%u</td></tr>\n"
 		"</table>",
-		status->accepted_conn, fpm_status_pool, status->pm == PM_STYLE_STATIC ? "static" : "dynamic", status->idle, status->active, status->total, status->max_children_reached);
+		fpm_status_pool,
+		status->pm == PM_STYLE_STATIC ? "static" : "dynamic",
+		status->accepted_conn,
+#if HAVE_FPM_LQ
+		status->cur_lq,
+		status->max_lq,
+#endif
+		status->idle,
+		status->active,
+		status->total,
+		status->max_children_reached);

 	spprintf(content_type, 0, "Content-Type: text/html");
 }
@@ -207,15 +237,29 @@

 	spprintf(output, 0,
 		"{"
-		"\"accepted conn\":%lu,"
 		"\"pool\":\"%s\","
 		"\"process manager\":\"%s\","
+		"\"accepted conn\":%lu,"
+#if HAVE_FPM_LQ
+		"\"listen queue len\":%u,"
+		"\"max listen queue len\":%d,"
+#endif
 		"\"idle processes\":%d,"
 		"\"active processes\":%d,"
 		"\"total processes\":%d,"
 		"\"max children reached\":%u"
 		"}",
-		status->accepted_conn, fpm_status_pool, status->pm == PM_STYLE_STATIC ? "static" : "dynamic", status->idle, status->active, status->total, status->max_children_reached);
+		fpm_status_pool,
+		status->pm == PM_STYLE_STATIC ? "static" : "dynamic",
+		status->accepted_conn,
+#if HAVE_FPM_LQ
+		status->cur_lq,
+		status->max_lq,
+#endif
+		status->idle,
+		status->active,
+		status->total,
+		status->max_children_reached);

 	spprintf(content_type, 0, "Content-Type: application/json");
 }

Modified: php/php-src/branches/PHP_5_3/sapi/fpm/fpm/fpm_status.h
===================================================================
--- php/php-src/branches/PHP_5_3/sapi/fpm/fpm/fpm_status.h	2010-11-11 01:43:53 UTC (rev 305266)
+++ php/php-src/branches/PHP_5_3/sapi/fpm/fpm/fpm_status.h	2010-11-11 02:34:47 UTC (rev 305267)
@@ -14,13 +14,15 @@
 	int idle;
 	int active;
 	int total;
+	unsigned cur_lq;
+	int max_lq;
 	unsigned long int accepted_conn;
 	unsigned int max_children_reached;
 	struct timeval last_update;
 };

 int fpm_status_init_child(struct fpm_worker_pool_s *wp);
-void fpm_status_update_activity(struct fpm_shm_s *shm, int idle, int active, int total, int clear_last_update);
+void fpm_status_update_activity(struct fpm_shm_s *shm, int idle, int active, int total, unsigned cur_lq, int max_lq, int clear_last_update);
 void fpm_status_update_accepted_conn(struct fpm_shm_s *shm, unsigned long int accepted_conn);
 void fpm_status_increment_accepted_conn(struct fpm_shm_s *shm);
 void fpm_status_set_pm(struct fpm_shm_s *shm, int pm);

Modified: php/php-src/branches/PHP_5_3/sapi/fpm/fpm/fpm_worker_pool.h
===================================================================
--- php/php-src/branches/PHP_5_3/sapi/fpm/fpm/fpm_worker_pool.h	2010-11-11 01:43:53 UTC (rev 305266)
+++ php/php-src/branches/PHP_5_3/sapi/fpm/fpm/fpm_worker_pool.h	2010-11-11 02:34:47 UTC (rev 305267)
@@ -25,6 +25,7 @@
 	char *user, *home;									/* for setting env USER and HOME */
 	enum fpm_address_domain listen_address_domain;
 	int listening_socket;
+	int listening_queue_len;
 	int set_uid, set_gid;								/* config uid and gid */
 	int socket_uid, socket_gid, socket_mode;


Modified: php/php-src/trunk/sapi/fpm/config.m4
===================================================================
--- php/php-src/trunk/sapi/fpm/config.m4	2010-11-11 01:43:53 UTC (rev 305266)
+++ php/php-src/trunk/sapi/fpm/config.m4	2010-11-11 02:34:47 UTC (rev 305267)
@@ -516,6 +516,39 @@
     AC_MSG_RESULT([no])
   ])
 ])
+
+AC_DEFUN([AC_FPM_LQ],
+[
+  have_lq=no
+
+  AC_MSG_CHECKING([for TCP_INFO])
+
+  AC_TRY_COMPILE([ #include <netinet/tcp.h> ], [struct tcp_info ti; int x = TCP_INFO;], [
+    have_lq=tcp_info
+    AC_MSG_RESULT([yes])
+  ], [
+    AC_MSG_RESULT([no])
+  ])
+
+  if test "$have_lq" = "tcp_info"; then
+    AC_DEFINE([HAVE_LQ_TCP_INFO], 1, [do we have TCP_INFO?])
+  fi
+
+  if test "$have_lq" = "no" ; then
+    AC_MSG_CHECKING([for SO_LISTENQLEN])
+
+    AC_TRY_COMPILE([ #include <sys/socket.h> ], [int x = SO_LISTENQLIMIT; int y = SO_LISTENQLEN;], [
+      have_lq=so_listenq
+      AC_MSG_RESULT([yes])
+    ], [
+      AC_MSG_RESULT([no])
+    ])
+
+    if test "$have_lq" = "tcp_info"; then
+      AC_DEFINE([HAVE_LQ_SO_LISTENQ], 1, [do we have SO_LISTENQxxx?])
+    fi
+  fi
+])
 dnl }}}

 AC_MSG_CHECKING(for FPM build)
@@ -543,6 +576,7 @@
   AC_FPM_CLOCK
   AC_FPM_TRACE
   AC_FPM_BUILTIN_ATOMIC
+  AC_FPM_LQ

   PHP_ARG_WITH(fpm-user,,
   [  --with-fpm-user[=USER]  Set the user for php-fpm to run as. (default: nobody)], nobody, no)

Modified: php/php-src/trunk/sapi/fpm/fpm/fpm_conf.c
===================================================================
--- php/php-src/trunk/sapi/fpm/fpm/fpm_conf.c	2010-11-11 01:43:53 UTC (rev 305266)
+++ php/php-src/trunk/sapi/fpm/fpm/fpm_conf.c	2010-11-11 02:34:47 UTC (rev 305267)
@@ -576,7 +576,7 @@
 				return -1;
 			}
 			fpm_status_update_accepted_conn(wp->shm_status, 0);
-			fpm_status_update_activity(wp->shm_status, -1, -1, -1, 1);
+			fpm_status_update_activity(wp->shm_status, -1, -1, -1, 0, -1, 1);
 			fpm_status_update_max_children_reached(wp->shm_status, 0);
 			fpm_status_set_pm(wp->shm_status, wp->config->pm);
 			/* memset(&fpm_status.last_update, 0, sizeof(fpm_status.last_update)); */

Modified: php/php-src/trunk/sapi/fpm/fpm/fpm_config.h
===================================================================
--- php/php-src/trunk/sapi/fpm/fpm/fpm_config.h	2010-11-11 01:43:53 UTC (rev 305266)
+++ php/php-src/trunk/sapi/fpm/fpm/fpm_config.h	2010-11-11 02:34:47 UTC (rev 305267)
@@ -42,3 +42,9 @@
 #define HAVE_FPM_TRACE 0
 #endif

+#if defined(HAVE_LQ_TCP_INFO) || defined(HAVE_LQ_SO_LISTENQ)
+#define HAVE_FPM_LQ 1
+#else
+#define HAVE_FPM_LQ 0
+#endif
+

Modified: php/php-src/trunk/sapi/fpm/fpm/fpm_process_ctl.c
===================================================================
--- php/php-src/trunk/sapi/fpm/fpm/fpm_process_ctl.c	2010-11-11 01:43:53 UTC (rev 305266)
+++ php/php-src/trunk/sapi/fpm/fpm/fpm_process_ctl.c	2010-11-11 02:34:47 UTC (rev 305267)
@@ -19,6 +19,7 @@
 #include "fpm_request.h"
 #include "fpm_worker_pool.h"
 #include "fpm_status.h"
+#include "fpm_sockets.h"
 #include "zlog.h"


@@ -327,6 +328,7 @@
 		int idle = 0;
 		int active = 0;
 		int children_to_fork;
+		unsigned cur_lq;

 		if (wp->config == NULL) continue;

@@ -352,7 +354,10 @@
 		}

 		/* update status structure for all PMs */
-		fpm_status_update_activity(wp->shm_status, idle, active, idle + active, 0);
+		if (0 > fpm_socket_get_listening_queue(wp, &cur_lq, NULL)) {
+			cur_lq = 0;
+		}
+		fpm_status_update_activity(wp->shm_status, idle, active, idle + active, cur_lq, wp->listening_queue_len, 0);

 		/* the rest is only used by PM_STYLE_DYNAMIC */
 		if (wp->config->pm != PM_STYLE_DYNAMIC) continue;

Modified: php/php-src/trunk/sapi/fpm/fpm/fpm_sockets.c
===================================================================
--- php/php-src/trunk/sapi/fpm/fpm/fpm_sockets.c	2010-11-11 01:43:53 UTC (rev 305266)
+++ php/php-src/trunk/sapi/fpm/fpm/fpm_sockets.c	2010-11-11 02:34:47 UTC (rev 305267)
@@ -344,6 +344,10 @@
 				break;
 		}

+		if (0 > fpm_socket_get_listening_queue(wp, NULL, (unsigned *) &wp->listening_queue_len)) {
+			wp->listening_queue_len = -1;
+		}
+
 		if (wp->listening_socket == -1) {
 			return -1;
 		}
@@ -373,3 +377,76 @@
 }
 /* }}} */

+#if HAVE_FPM_LQ
+
+#ifdef HAVE_LQ_TCP_INFO
+
+#include <netinet/tcp.h>
+
+int fpm_socket_get_listening_queue(struct fpm_worker_pool_s *wp, unsigned *cur_lq, unsigned *max_lq)
+{
+	if (wp->listen_address_domain != FPM_AF_INET) {
+		return -1;
+	}
+
+	struct tcp_info info;
+	socklen_t len = sizeof(info);
+
+	if (0 > getsockopt(wp->listening_socket, IPPROTO_TCP, TCP_INFO, &info, &len)) {
+		return -1;
+	}
+
+	/* kernel >= 2.6.24 return non-zero here, that means operation is supported */
+	if (info.tcpi_sacked == 0) {
+		return -1;
+	}
+
+	if (cur_lq) {
+		*cur_lq = info.tcpi_unacked;
+	}
+
+	if (max_lq) {
+		*max_lq = info.tcpi_sacked;
+	}
+
+	return 0;
+}
+
+#endif
+
+#ifdef HAVE_LQ_SO_LISTENQ
+
+int fpm_socket_get_listening_queue(struct fpm_worker_pool_s *wp, unsigned *cur_lq, unsigned *max_lq)
+{
+	int val;
+	socklen_t len = sizeof(val);
+
+	if (cur_lq) {
+		if (0 > getsockopt(wp->listening_socket, SOL_SOCKET, SO_LISTENQLEN, &val, &len)) {
+			return -1;
+		}
+
+		*cur_lq = val;
+	}
+
+	if (max_lq) {
+		if (0 > getsockopt(wp->listening_socket, SOL_SOCKET, SO_LISTENQLIMIT, &val, &len)) {
+			return -1;
+		}
+
+		*max_lq = val;
+	}
+
+	return 0;
+}
+
+#endif
+
+#else
+
+int fpm_socket_get_listening_queue(struct fpm_worker_pool_s *wp, unsigned *cur_lq, unsigned *max_lq)
+{
+	return -1;
+}
+
+#endif

Modified: php/php-src/trunk/sapi/fpm/fpm/fpm_sockets.h
===================================================================
--- php/php-src/trunk/sapi/fpm/fpm/fpm_sockets.h	2010-11-11 01:43:53 UTC (rev 305266)
+++ php/php-src/trunk/sapi/fpm/fpm/fpm_sockets.h	2010-11-11 02:34:47 UTC (rev 305267)
@@ -21,6 +21,7 @@

 enum fpm_address_domain fpm_sockets_domain_from_address(char *addr);
 int fpm_sockets_init_main();
+int fpm_socket_get_listening_queue(struct fpm_worker_pool_s *wp, unsigned *cur_lq, unsigned *max_lq);


 static inline int fd_set_blocked(int fd, int blocked) /* {{{ */

Modified: php/php-src/trunk/sapi/fpm/fpm/fpm_status.c
===================================================================
--- php/php-src/trunk/sapi/fpm/fpm/fpm_status.c	2010-11-11 01:43:53 UTC (rev 305266)
+++ php/php-src/trunk/sapi/fpm/fpm/fpm_status.c	2010-11-11 02:34:47 UTC (rev 305267)
@@ -133,7 +133,7 @@
 }
 /* }}} */

-void fpm_status_update_activity(struct fpm_shm_s *shm, int idle, int active, int total, int clear_last_update) /* {{{ */
+void fpm_status_update_activity(struct fpm_shm_s *shm, int idle, int active, int total, unsigned cur_lq, int max_lq, int clear_last_update) /* {{{ */
 {
 	struct fpm_status_s status;

@@ -146,6 +146,8 @@
 	status.idle = idle;
 	status.active = active;
 	status.total = total;
+	status.cur_lq = cur_lq;
+	status.max_lq = max_lq;
 	if (clear_last_update) {
 		memset(&status.last_update, 0, sizeof(status.last_update));
 	} else {
@@ -164,14 +166,28 @@
 	}

 	spprintf(output, 0,
-		"accepted conn:        %lu\n"
 		"pool:                 %s\n"
 		"process manager:      %s\n"
+		"accepted conn:        %lu\n"
+#if HAVE_FPM_LQ
+		"listen queue len:     %u\n"
+		"max listen queue len: %d\n"
+#endif
 		"idle processes:       %d\n"
 		"active processes:     %d\n"
 		"total processes:      %d\n"
 		"max children reached: %u\n",
-		status->accepted_conn, fpm_status_pool, status->pm == PM_STYLE_STATIC ? "static" : "dynamic", status->idle, status->active, status->total, status->max_children_reached);
+		fpm_status_pool,
+		status->pm == PM_STYLE_STATIC ? "static" : "dynamic",
+		status->accepted_conn,
+#if HAVE_FPM_LQ
+		status->cur_lq,
+		status->max_lq,
+#endif
+		status->idle,
+		status->active,
+		status->total,
+		status->max_children_reached);

 	spprintf(content_type, 0, "Content-Type: text/plain");
 }
@@ -185,15 +201,29 @@

 	spprintf(output, 0,
 		"<table>\n"
-		"<tr><th>accepted conn</th><td>%lu</td></tr>\n"
 		"<tr><th>pool</th><td>%s</td></tr>\n"
 		"<tr><th>process manager</th><td>%s</td></tr>\n"
+		"<tr><th>accepted conn</th><td>%lu</td></tr>\n"
+#if HAVE_FPM_LQ
+		"<tr><th>listen queue len</th><td>%u</td></tr>\n"
+		"<tr><th>max listen queue len</th><td>%d</td></tr>\n"
+#endif
 		"<tr><th>idle processes</th><td>%d</td></tr>\n"
 		"<tr><th>active processes</th><td>%d</td></tr>\n"
 		"<tr><th>total processes</th><td>%d</td></tr>\n"
 		"<tr><th>max children reached</th><td>%u</td></tr>\n"
 		"</table>",
-		status->accepted_conn, fpm_status_pool, status->pm == PM_STYLE_STATIC ? "static" : "dynamic", status->idle, status->active, status->total, status->max_children_reached);
+		fpm_status_pool,
+		status->pm == PM_STYLE_STATIC ? "static" : "dynamic",
+		status->accepted_conn,
+#if HAVE_FPM_LQ
+		status->cur_lq,
+		status->max_lq,
+#endif
+		status->idle,
+		status->active,
+		status->total,
+		status->max_children_reached);

 	spprintf(content_type, 0, "Content-Type: text/html");
 }
@@ -207,15 +237,29 @@

 	spprintf(output, 0,
 		"{"
-		"\"accepted conn\":%lu,"
 		"\"pool\":\"%s\","
 		"\"process manager\":\"%s\","
+		"\"accepted conn\":%lu,"
+#if HAVE_FPM_LQ
+		"\"listen queue len\":%u,"
+		"\"max listen queue len\":%d,"
+#endif
 		"\"idle processes\":%d,"
 		"\"active processes\":%d,"
 		"\"total processes\":%d,"
 		"\"max children reached\":%u"
 		"}",
-		status->accepted_conn, fpm_status_pool, status->pm == PM_STYLE_STATIC ? "static" : "dynamic", status->idle, status->active, status->total, status->max_children_reached);
+		fpm_status_pool,
+		status->pm == PM_STYLE_STATIC ? "static" : "dynamic",
+		status->accepted_conn,
+#if HAVE_FPM_LQ
+		status->cur_lq,
+		status->max_lq,
+#endif
+		status->idle,
+		status->active,
+		status->total,
+		status->max_children_reached);

 	spprintf(content_type, 0, "Content-Type: application/json");
 }

Modified: php/php-src/trunk/sapi/fpm/fpm/fpm_status.h
===================================================================
--- php/php-src/trunk/sapi/fpm/fpm/fpm_status.h	2010-11-11 01:43:53 UTC (rev 305266)
+++ php/php-src/trunk/sapi/fpm/fpm/fpm_status.h	2010-11-11 02:34:47 UTC (rev 305267)
@@ -14,13 +14,15 @@
 	int idle;
 	int active;
 	int total;
+	unsigned cur_lq;
+	int max_lq;
 	unsigned long int accepted_conn;
 	unsigned int max_children_reached;
 	struct timeval last_update;
 };

 int fpm_status_init_child(struct fpm_worker_pool_s *wp);
-void fpm_status_update_activity(struct fpm_shm_s *shm, int idle, int active, int total, int clear_last_update);
+void fpm_status_update_activity(struct fpm_shm_s *shm, int idle, int active, int total, unsigned cur_lq, int max_lq, int clear_last_update);
 void fpm_status_update_accepted_conn(struct fpm_shm_s *shm, unsigned long int accepted_conn);
 void fpm_status_increment_accepted_conn(struct fpm_shm_s *shm);
 void fpm_status_set_pm(struct fpm_shm_s *shm, int pm);

Modified: php/php-src/trunk/sapi/fpm/fpm/fpm_worker_pool.h
===================================================================
--- php/php-src/trunk/sapi/fpm/fpm/fpm_worker_pool.h	2010-11-11 01:43:53 UTC (rev 305266)
+++ php/php-src/trunk/sapi/fpm/fpm/fpm_worker_pool.h	2010-11-11 02:34:47 UTC (rev 305267)
@@ -25,6 +25,7 @@
 	char *user, *home;									/* for setting env USER and HOME */
 	enum fpm_address_domain listen_address_domain;
 	int listening_socket;
+	int listening_queue_len;
 	int set_uid, set_gid;								/* config uid and gid */
 	int socket_uid, socket_gid, socket_mode;

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to