You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by Dean Gaudet <dg...@hyperreal.com> on 1997/06/24 01:56:23 UTC
cvs commit: apache/src CHANGES PORTING alloc.c conf.h http_main.c httpd.h util.c
dgaudet 97/06/23 16:56:22
Modified: src CHANGES PORTING alloc.c conf.h http_main.c httpd.h
util.c
Log:
Create fd slack to keep enough low numbered descriptors open for per request
data.
Reviewed by: Marc, Jim
Revision Changes Path
1.289 +13 -0 apache/src/CHANGES
Index: CHANGES
===================================================================
RCS file: /export/home/cvs/apache/src/CHANGES,v
retrieving revision 1.288
retrieving revision 1.289
diff -C3 -r1.288 -r1.289
*** CHANGES 1997/06/23 11:36:56 1.288
--- CHANGES 1997/06/23 23:56:15 1.289
***************
*** 6,11 ****
--- 6,24 ----
*) Added NT support [Ben Laurie and Ambarish Malpani <am...@valicert.com>]
+ 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
+
Changes with Apache 1.2
Changes with Apache 1.2b11
1.5 +3 -0 apache/src/PORTING
Index: PORTING
===================================================================
RCS file: /export/home/cvs/apache/src/PORTING,v
retrieving revision 1.4
retrieving revision 1.5
diff -C3 -r1.4 -r1.5
*** PORTING 1997/02/25 21:04:42 1.4
--- PORTING 1997/06/23 23:56:15 1.5
***************
*** 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:
1.33 +6 -3 apache/src/alloc.c
Index: alloc.c
===================================================================
RCS file: /export/home/cvs/apache/src/alloc.c,v
retrieving revision 1.32
retrieving revision 1.33
diff -C3 -r1.32 -r1.33
*** alloc.c 1997/06/16 18:42:47 1.32
--- alloc.c 1997/06/23 23:56:16 1.33
***************
*** 58,65 ****
* rst --- 4/95 --- 6/95
*/
! #include "conf.h"
! #include "alloc.h"
#include "multithread.h"
#include <stdarg.h>
--- 58,64 ----
* rst --- 4/95 --- 6/95
*/
! #include "httpd.h"
#include "multithread.h"
#include <stdarg.h>
***************
*** 832,838 ****
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;
--- 831,840 ----
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;
***************
*** 884,889 ****
--- 886,892 ----
desc = open(name, baseFlag | O_APPEND | O_CREAT,
modeFlags);
if (desc >= 0) {
+ desc = ap_slack(desc, AP_SLACK_LOW);
fd = fdopen(desc, mode);
}
} else {
1.102 +1 -0 apache/src/conf.h
Index: conf.h
===================================================================
RCS file: /export/home/cvs/apache/src/conf.h,v
retrieving revision 1.101
retrieving revision 1.102
diff -C3 -r1.101 -r1.102
*** conf.h 1997/06/16 20:04:51 1.101
--- conf.h 1997/06/23 23:56:16 1.102
***************
*** 73,78 ****
--- 73,79 ----
extern void GETPRIVMODE();
extern void GETUSERMODE();
extern char *inet_ntoa();
+ #define NO_SLACK
#elif defined(SUNOS4)
#define HAVE_GMTOFF
1.158 +2 -0 apache/src/http_main.c
Index: http_main.c
===================================================================
RCS file: /export/home/cvs/apache/src/http_main.c,v
retrieving revision 1.157
retrieving revision 1.158
diff -C3 -r1.157 -r1.158
*** http_main.c 1997/06/21 22:27:11 1.157
--- http_main.c 1997/06/23 23:56:17 1.158
***************
*** 1819,1824 ****
--- 1819,1826 ----
exit(1);
}
+ s = ap_slack(s, AP_SLACK_HIGH);
+
note_cleanups_for_socket(pconf, s); /* arrange to close on exec or restart */
#ifndef MPE
1.114 +29 -0 apache/src/httpd.h
Index: httpd.h
===================================================================
RCS file: /export/home/cvs/apache/src/httpd.h,v
retrieving revision 1.113
retrieving revision 1.114
diff -C3 -r1.113 -r1.114
*** httpd.h 1997/06/15 19:22:28 1.113
--- httpd.h 1997/06/23 23:56:18 1.114
***************
*** 271,276 ****
--- 271,277 ----
#define DECLINED -1 /* Module declines to handle */
#define OK 0 /* Module has handled this stage. */
+
/* ----------------------- HTTP Status Codes ------------------------- */
#define RESPONSE_CODES 38
***************
*** 714,716 ****
--- 715,745 ----
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
1.55 +27 -0 apache/src/util.c
Index: util.c
===================================================================
RCS file: /export/home/cvs/apache/src/util.c,v
retrieving revision 1.54
retrieving revision 1.55
diff -C3 -r1.54 -r1.55
*** util.c 1997/06/22 20:35:26 1.54
--- util.c 1997/06/23 23:56:18 1.55
***************
*** 1334,1336 ****
--- 1334,1363 ----
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
+ }