httpd-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Randy Terbush <ra...@zyzzyva.com>
Subject Re: [PATCH] suggested fix for lingering stuff
Date Mon, 20 Jan 1997 00:20:18 GMT

I think this is the right track, but I would feel better if we
could get someone we know is plagued with the problem to test?

I have a suspicion that we still have some other problem here
related to timeouts.


> I think that the below patch reflects what I would suggest doing to
> fix up the lingering close stuff.
> 
> Untested, and we need someone with a SVR4 system (and a Unixware one
> would be good... may also need to add USE_SHUTDOWN in the UW section
> of conf.h) to do some testing and see if they can replicate the problem
> with data being truncated (compiling without any of the three options)
> and then see if USE_SHUTDOWN fixes it.
> 
> Comments?
> 
> Index: PORTING
> ===================================================================
> RCS file: /home/marcs/archive/apache/cvs/apache/src/PORTING,v
> retrieving revision 1.2
> diff -c -r1.2 PORTING
> *** PORTING	1996/12/17 23:19:15	1.2
> --- PORTING	1997/01/19 19:20:58
> ***************
> *** 205,210 ****
> --- 205,225 ----
>        USE_LONGJMP:
>         use the longjmp() call instead of siglongjmp()
>   
> +      USE_LINGCLOSE:
> +       Use Apache's soft "lingering close" feature to close
> +       connections; designed to be a better behaved USE_SO_LINGER.  
> +       Causes problems on some platforms.
> + 
> +      USE_SHUTDOWN:
> +       Call shutdown() before close()ing a connection.  Needed on
> +       some broken (mainly SVR4) TCP stacks which don't send queued
> +       data when a close() is done on a socket.
> +      
> +      USE_SO_LINGER:
> +       Set the SO_LINGER option on sockets.  Possible alternative
> +       to USE_LINGCLOSE, however some broken TCP stacks do not
> +       implement a timeout, leaving hung connections around.
> + 
>   --
>   
>     NO_*:
> ***************
> *** 215,223 ****
>         NO_SETSID:
>         NO_USE_SIGACTION:
>          Do not use the sigaction() call, even if we have it.
> !       NO_LINGCLOSE:
> !        Do not use Apache's soft, "lingering" close feature to
> !        terminate connections.
>   --
>   
>     MISC #DEFINES:
> --- 230,236 ----
>         NO_SETSID:
>         NO_USE_SIGACTION:
>          Do not use the sigaction() call, even if we have it.
> ! 
>   --
>   
>     MISC #DEFINES:
> Index: conf.h
> ===================================================================
> RCS file: /home/marcs/archive/apache/cvs/apache/src/conf.h,v
> retrieving revision 1.69
> diff -c -r1.69 conf.h
> *** conf.h	1997/01/10 13:23:31	1.69
> --- conf.h	1997/01/19 19:13:37
> ***************
> *** 285,291 ****
>    * to 0x2000000 which is still PLENTY of space. I doubt if
>    * even on heavy systems sbrk() would be called at all...
>    */
> - #define NO_LINGCLOSE
>   
>   #elif defined(SVR4)
>   #define NO_KILLPG
> --- 285,290 ----
> ***************
> *** 298,303 ****
> --- 297,303 ----
>   #define getwd(d) getcwd(d,MAX_STRING_LEN)
>   /* A lot of SVR4 systems need this */
>   #define USE_FCNTL_SERIALIZED_ACCEPT
> + #define USE_SHUTDOWN
>   
>   #elif defined(UW)
>   #define NO_KILLPG
> Index: http_main.c
> ===================================================================
> RCS file: /home/marcs/archive/apache/cvs/apache/src/http_main.c,v
> retrieving revision 1.106
> diff -c -r1.106 http_main.c
> *** http_main.c	1997/01/12 20:38:12	1.106
> --- http_main.c	1997/01/19 19:15:17
> ***************
> *** 309,315 ****
>    * before closing the connection.
>    */
>   
> ! #ifndef NO_LINGCLOSE
>   static void lingering_close (int sd, server_rec *server_conf)
>   {
>       int dummybuf[512];
> --- 309,315 ----
>    * before closing the connection.
>    */
>   
> ! #ifdef USE_LINGCLOSE
>   static void lingering_close (int sd, server_rec *server_conf)
>   {
>       int dummybuf[512];
> ***************
> *** 360,366 ****
>       shutdown (sd, 2);
>       close (sd);
>   }
> ! #endif
>   
>   void usage(char *bin)
>   {
> --- 360,366 ----
>       shutdown (sd, 2);
>       close (sd);
>   }
> ! #endif /* USE_LINGCLOSE */
>   
>   void usage(char *bin)
>   {
> ***************
> *** 1667,1680 ****
>   #endif		
>   	bflush(conn_io);
>   
> ! #ifdef NO_LINGCLOSE
>   	bclose(conn_io);	/* just close it */
>   #else
>   	if (r)
>   	    lingering_close (conn_io->fd, r->server);
>   	else
>   	    close (conn_io->fd);
> ! #endif	
>       }    
>   }
>   
> --- 1667,1686 ----
>   #endif		
>   	bflush(conn_io);
>   
> ! #ifndef USE_LINGCLOSE
> ! #ifdef USE_SHUTDOWN
> ! 	/* broken (mostly SVR4) TCP stacks discard queued data if a
> ! 	 * close() is done before a shutdown().
> ! 	 */
> ! 	shutdown(conn_io->fd, 2); 
> ! #endif
>   	bclose(conn_io);	/* just close it */
>   #else
>   	if (r)
>   	    lingering_close (conn_io->fd, r->server);
>   	else
>   	    close (conn_io->fd);
> ! #endif
>       }    
>   }
> 	  




Mime
View raw message