httpd-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Dean Gaudet <dgau...@arctic.org>
Subject [PATCH] 1.2.1: slack fd, take n+1
Date Thu, 26 Jun 1997 06:03:51 GMT
Here it is with the reordering of the socket and log openings.  Otherwise
it's the same as the last patch.  Tested on Linux and BSDI 2.0.

Dean

Index: CHANGES
===================================================================
RCS file: /export/home/cvs/apache/src/CHANGES,v
retrieving revision 1.286.2.1
diff -c -3 -r1.286.2.1 CHANGES
*** CHANGES	1997/06/24 00:11:10	1.286.2.1
--- CHANGES	1997/06/26 05:07:26
***************
*** 1,5 ****
  Changes with Apache 1.2.1
!   
    *) pregsub had an off-by-1 in its error checking code. [Alexei Kosut]
  
  Changes with Apache 1.2
--- 1,22 ----
  Changes with Apache 1.2.1
! 
!   *) Attempt to work around problems with third party libraries that do not
!      handle high numbered descriptors (examples include bind, and
!      solaris libc).  On all systems apache attempts to keep all permanent
!      descriptors above 15 (called the low slack line).  Solaris users
!      can also benefit from adding -DHIGH_SLACK_LINE=256 to EXTRA_CFLAGS
!      which keeps all non-FILE * descriptors above 255.  On all systems
!      this should make supporting large numbers of vhosts with many open
!      log files more feasible.  If this causes trouble please report it,
!      you can disable this workaround by adding -DNO_SLACK to EXTRA_CFLAGS.
!      [Dean Gaudet] various PRs
! 
!   *) Related to the last entry, network sockets are now opened before
!      log files are opened.  The only known case where this can cause
!      problems is under Solaris with many virtualhosts and many Listen
!      directives.  But using -DHIGH_SLACK_LINE=256 described above will
!      work around this problem.  [Dean Gaudet]
! 
    *) pregsub had an off-by-1 in its error checking code. [Alexei Kosut]
  
  Changes with Apache 1.2
Index: PORTING
===================================================================
RCS file: /export/home/cvs/apache/src/PORTING,v
retrieving revision 1.4
diff -c -3 -r1.4 PORTING
*** PORTING	1997/02/25 21:04:42	1.4
--- PORTING	1997/06/26 05:07:27
***************
*** 227,232 ****
--- 227,235 ----
        NO_LINGCLOSE:
         Do not use Apache's soft, "lingering" close feature to
         terminate connections.
+       NO_SLACK:
+        Do not use the "slack" fd feature which requires a working fcntl
+        F_DUPFD.
  --
  
    MISC #DEFINES:
Index: alloc.c
===================================================================
RCS file: /export/home/cvs/apache/src/alloc.c,v
retrieving revision 1.28
diff -c -3 -r1.28 alloc.c
*** alloc.c	1997/05/27 04:14:20	1.28
--- alloc.c	1997/06/26 05:07:29
***************
*** 58,65 ****
   * rst --- 4/95 --- 6/95
   */
  
! #include "conf.h"
! #include "alloc.h"
  
  #include <stdarg.h>
  
--- 58,64 ----
   * rst --- 4/95 --- 6/95
   */
  
! #include "httpd.h"
  
  #include <stdarg.h>
  
***************
*** 801,807 ****
    block_alarms();
    fd = open(name, flg, mode);
    save_errno = errno;
!   if (fd >= 0) note_cleanups_for_fd (a, fd);
    unblock_alarms();
    errno = save_errno;
    return fd;
--- 800,809 ----
    block_alarms();
    fd = open(name, flg, mode);
    save_errno = errno;
!   if (fd >= 0) {
!     fd = ap_slack (fd, AP_SLACK_HIGH);
!     note_cleanups_for_fd (a, fd);
!   }
    unblock_alarms();
    errno = save_errno;
    return fd;
***************
*** 846,851 ****
--- 848,854 ----
      desc = open(name, baseFlag | O_APPEND | O_CREAT,
  		S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
      if (desc >= 0) {
+       desc = ap_slack(desc, AP_SLACK_LOW);
        fd = fdopen(desc, mode);
      }
    } else {
Index: conf.h
===================================================================
RCS file: /export/home/cvs/apache/src/conf.h,v
retrieving revision 1.99
diff -c -3 -r1.99 conf.h
*** conf.h	1997/06/04 07:03:11	1.99
--- conf.h	1997/06/26 05:07:31
***************
*** 73,78 ****
--- 73,79 ----
  extern void GETPRIVMODE();
  extern void GETUSERMODE();
  extern char *inet_ntoa();
+ #define NO_SLACK
  
  #elif defined(SUNOS4)
  #define HAVE_GMTOFF
Index: http_config.c
===================================================================
RCS file: /export/home/cvs/apache/src/http_config.c,v
retrieving revision 1.49
diff -c -3 -r1.49 http_config.c
*** http_config.c	1997/05/15 23:39:20	1.49
--- http_config.c	1997/06/26 05:07:33
***************
*** 1077,1083 ****
  server_rec *read_config(pool *p, pool *ptemp, char *confname)
  {
      server_rec *s = init_server_config(p);
-     module *m;
      
      init_config_globals(p);
      
--- 1077,1082 ----
***************
*** 1089,1100 ****
      
      fixup_virtual_hosts (p, s);
      
      for (m = top_module; m; m = m->next)
          if (m->init)
  	    (*m->init) (s, p);
-     
-     return s;
  }
  
  /********************************************************************
   * Configuration directives are restricted in terms of where they may
--- 1088,1106 ----
      
      fixup_virtual_hosts (p, s);
      
+     return s;
+ }
+     
+ 
+ void init_modules(pool *p, server_rec *s)
+ {
+     module *m;
+ 
      for (m = top_module; m; m = m->next)
          if (m->init)
  	    (*m->init) (s, p);
  }
+ 
  
  /********************************************************************
   * Configuration directives are restricted in terms of where they may
Index: http_config.h
===================================================================
RCS file: /export/home/cvs/apache/src/http_config.h,v
retrieving revision 1.29
diff -c -3 -r1.29 http_config.h
*** http_config.h	1997/05/27 04:41:49	1.29
--- http_config.h	1997/06/26 05:07:35
***************
*** 261,266 ****
--- 261,267 ----
  /* For http_main.c... */
  
  server_rec *read_config (pool *conf_pool, pool *temp_pool, char *config_name);
+ void init_modules(pool *p, server_rec *s);
  void setup_prelinked_modules();
  void show_directives();
  void show_modules();
Index: http_main.c
===================================================================
RCS file: /export/home/cvs/apache/src/http_main.c,v
retrieving revision 1.149
diff -c -3 -r1.149 http_main.c
*** http_main.c	1997/05/29 04:50:27	1.149
--- http_main.c	1997/06/26 05:07:40
***************
*** 1981,1986 ****
--- 1981,1988 ----
          exit(1);
      }
  
+     s = ap_slack(s, AP_SLACK_HIGH);
+ 
      note_cleanups_for_fd(pconf, s); /* arrange to close on exec or restart */
      
  #ifndef MPE
***************
*** 2135,2154 ****
  	ptrans = make_sub_pool (pconf);
  
  	server_conf = read_config (pconf, ptrans, server_confname); 
- 	open_logs (server_conf, pconf);
- 	set_group_privs ();
- 	accept_mutex_init (pconf);
- 	if (!is_graceful) {
- 	    reinit_scoreboard(pconf);
- 	}
- #ifdef SCOREBOARD_FILE
- 	else {
- 	    scoreboard_fname = server_root_relative (pconf, scoreboard_fname);
- 	    note_cleanups_for_fd (pconf, scoreboard_fd);
- 	}
- #endif
- 
- 	default_server_hostnames (server_conf);
  
  	if (listeners == NULL) {
  	    if (!is_graceful) {
--- 2137,2142 ----
***************
*** 2183,2188 ****
--- 2171,2192 ----
  	    sd = -1;
  	}
  
+ 	init_modules (pconf, server_conf);
+ 	open_logs (server_conf, pconf);
+ 	set_group_privs ();
+ 	accept_mutex_init (pconf);
+ 	if (!is_graceful) {
+ 	    reinit_scoreboard(pconf);
+ 	}
+ #ifdef SCOREBOARD_FILE
+ 	else {
+ 	    scoreboard_fname = server_root_relative (pconf, scoreboard_fname);
+ 	    note_cleanups_for_fd (pconf, scoreboard_fd);
+ 	}
+ #endif
+ 
+ 	default_server_hostnames (server_conf);
+ 
  	set_signals ();
  	log_pid (pconf, pid_fname);
  
***************
*** 2391,2396 ****
--- 2395,2401 ----
  
      suexec_enabled = init_suexec();
      server_conf = read_config (pconf, ptrans, server_confname);
+     init_modules (pconf, server_conf);
      
      if(standalone) {
          clear_pool (pconf);	/* standalone_main rereads... */
Index: httpd.h
===================================================================
RCS file: /export/home/cvs/apache/src/httpd.h,v
retrieving revision 1.111
diff -c -3 -r1.111 httpd.h
*** httpd.h	1997/06/05 22:53:27	1.111
--- httpd.h	1997/06/26 05:07:42
***************
*** 268,273 ****
--- 268,274 ----
  #define DECLINED -1		/* Module declines to handle */
  #define OK 0			/* Module has handled this stage. */
  
+ 
  /* ----------------------- HTTP Status Codes  ------------------------- */
  
  #define RESPONSE_CODES 38
***************
*** 711,713 ****
--- 712,742 ----
  unsigned long get_virthost_addr (const char *hostname, unsigned short *port);
  
  extern time_t restart_time;
+ 
+ /*
+  * Apache tries to keep all of its long term filehandles (such as log files,
+  * and sockets) above this number.  This is to workaround problems in many
+  * third party libraries that are compiled with a small FD_SETSIZE.  There
+  * should be no reason to lower this, because it's only advisory.  If a file
+  * can't be allocated above this number then it will remain in the "slack"
+  * area.
+  *
+  * Only the low slack line is used by default.  If HIGH_SLACK_LINE is defined
+  * then an attempt is also made to keep all non-FILE * files above the high
+  * slack line.  This is to work around a Solaris C library limitation, where it
+  * uses an unsigned char to store the file descriptor.
+  */
+ #ifndef LOW_SLACK_LINE
+ #define LOW_SLACK_LINE	15
+ #endif
+ /* #define HIGH_SLACK_LINE	255 */
+ 
+ /*
+  * The ap_slack() function takes a fd, and tries to move it above the indicated
+  * line.  It returns an fd which may or may not have moved above the line, and
+  * never fails.  If the high line was requested and it fails it will also try
+  * the low line.
+  */
+ int ap_slack (int fd, int line);
+ #define AP_SLACK_LOW	1
+ #define AP_SLACK_HIGH	2
Index: util.c
===================================================================
RCS file: /export/home/cvs/apache/src/util.c,v
retrieving revision 1.52.2.1
diff -c -3 -r1.52.2.1 util.c
*** util.c	1997/06/24 00:11:10	1.52.2.1
--- util.c	1997/06/26 05:07:44
***************
*** 1326,1328 ****
--- 1326,1355 ----
      return (p);
  }
  #endif
+ 
+ 
+ int ap_slack (int fd, int line)
+ {
+ #if !defined(F_DUPFD) || defined(NO_SLACK)
+     return fd;
+ #else
+     int new_fd;
+ 
+ #ifdef HIGH_SLACK_LINE
+     if (line == AP_SLACK_HIGH) {
+ 	new_fd = fcntl (fd, F_DUPFD, HIGH_SLACK_LINE);
+ 	if (new_fd != -1) {
+ 	    close (fd);
+ 	    return new_fd;
+ 	}
+     }
+ #endif
+     /* otherwise just assume line == AP_SLACK_LOW */
+     new_fd = fcntl (fd, F_DUPFD, LOW_SLACK_LINE);
+     if (new_fd == -1) {
+       return fd;
+     }
+     close (fd);
+     return new_fd;
+ #endif
+ }



Mime
View raw message