Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 18 Apr 2004 14:00:19 -0700 (PDT)
From:      =?ISO-8859-1?Q?Mikko_Ty=F6l=E4j=E4rvi?= <mbsd@pacbell.net>
To:        Ivan Voras <ivoras@geri.cc.fer.hr>
Cc:        freebsd-threads@freebsd.org
Subject:   Re: Siege segfaulting
Message-ID:  <20040418133853.A31913@atlas.home>
In-Reply-To: <4082A88E.5060605@geri.cc.fer.hr>
References:  <4082A88E.5060605@geri.cc.fer.hr>

next in thread | previous in thread | raw e-mail | index | archive | help
On Sun, 18 Apr 2004, Ivan Voras wrote:

> I was asked to send details about a problem I found with siege on
> 5.2-current. Here is my original post from current@freebsd.org:
>
> There are problems (segfault) running siege (web benchmark program) on a
> recent FreeBSD 5.2-current (a few days ago). When I switch it to libc_r
> via libmap.conf, everything works ok. Since the software is ported to a
> large number of platforms and works ok, it's likely a libpthread bug

Or not.  Last time I tried to use siege, I ran into so many bugs that
I gave up on it.

> Siege uses threading to make simultaneous HTTP requests. I tried with a
> recent release (2.59) and beta (2.60) version if siege, with same behaviour.
>
> This does not happend with small number of threads (2-3), but if I
> specify a larger number (usually 8+), it crashes in the middle of work.

Looks like a porting error; siege is calling gethostbyname(), which is
non-reentrant.

Try this patch (put it into siege/files/patch-src::sock.c) and rebuild
the port:

% cd /usr/ports/benchmarks/siege && cat files/patch-src::sock.c
--- src/sock.c.orig	Sun Apr 18 13:34:08 2004
+++ src/sock.c	Sun Apr 18 13:34:43 2004
@@ -132,7 +132,7 @@
   if((gethostbyname_r( hn, &hent, hbf, sizeof(hbf), &hp, &herrno ) < 0)){
     hp = NULL;
   }
-#elif defined(sun)
+#elif defined(sun) || defined(__FreeBSD__)
 # ifdef HAVE_GETIPNODEBYNAME
   hp = getipnodebyname( hn, AF_INET, 0, &herrno );
 # else /* default use gethostbyname_r*/
@@ -155,7 +155,7 @@
   if( hp == NULL ){ return -1; }
   memset((void*) &cli, 0, sizeof( cli ));
   memcpy( &cli.sin_addr, hp->h_addr, hp->h_length );
-#if defined(sun)
+#if defined(sun) || defined(__FreeBSD__)
 # ifdef  HAVE_FREEHOSTENT
   freehostent(hp);
 # endif/*HAVE_FREEHOSTENT*/
@@ -257,6 +257,7 @@
   return( C->sock );
 }

+#if 0 /* unused */
 /**
  * local function
  * returns hostent based on OS specifics
@@ -313,6 +314,7 @@
   xfree( buf );
   return( hp );
 }
+#endif

 /**
  * makes the socket non-blocking,

I ran some quick tests on a less than a month old -CURRENT, and with
this patch siege runs to completion.  Without the patch, siege crashes
within half a minute.

   $.02,
   /Mikko



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20040418133853.A31913>