Re: [Libevent-users] Memory leak with keepalive?

2010-07-07 Thread Zhu Han
Was the message lost or no one interested in this issue?

best regards,
hanzhu


On Mon, Jun 28, 2010 at 9:25 PM, Zhu Han schumi@gmail.com wrote:

 Frank, Thank you for your patch.

 I made another patch several minutes ago.

 evhttp_request-userdone is used to indicate there is data being sending by
 the client. I suppose it is only useful for chunk encoding response. So I
 revert the meaning from userdone to user_working and mark the flag only when
 chunk encoding is started. IMHO, this should fix this issue. Could the
 maintainers take a look at it? Thank you!

 This patch is against libevent-1.4.14b.

 diff --git a/evhttp.h b/evhttp.h
 index 7ddf720..77ff781 100644
 --- a/evhttp.h
 +++ b/evhttp.h
 @@ -222,7 +222,7 @@ struct {
 struct evbuffer *input_buffer;  /* read data */
 ev_int64_t ntoread;
 int chunked:1,  /* a chunked request */
 -   userdone:1; /* the user has sent all data */
 +   user_working:1; /* the user is sending the data */

 struct evbuffer *output_buffer; /* outgoing post or data */

 diff --git a/http.c b/http.c
 index efcec40..6d6 100644
 --- a/http.c
 +++ b/http.c
 @@ -610,8 +610,8 @@ evhttp_connection_incoming_fail(struct evhttp_request
 *req,
  * the request is still being used for sending, we
  * need to disassociated it from the connection here.
  */
 -   if (!req-userdone) {

 -   /* remove it so that it will not be freed */
 +   if (req-user_working) {
 +   /* remove it so that it will not be freed*/

 TAILQ_REMOVE(req-evcon-requests, req, next);
 /* indicate that this request no longer has a
  * connection object
 @@ -1942,7 +1942,7 @@ evhttp_send(struct evhttp_request *req, struct
 evbuffer *databuf)
 assert(TAILQ_FIRST(evcon-requests) == req);

 /* we expect no more calls form the user on this request */
 -   req-userdone = 1;
 +   req-user_working = 0;

 /* xxx: not sure if we really should expose the data buffer this
 way */
 if (databuf != NULL)
 @@ -1967,6 +1967,8 @@ void
  evhttp_send_reply_start(struct evhttp_request *req, int code,
  const char *reason)
  {
 +/* mark the user is sending the request */
 +req-user_working = 1;
 evhttp_response_code(req, code, reason);
 if (req-major == 1  req-minor == 1) {
 /* use chunked encoding for HTTP/1.1 */
 @@ -2008,7 +2010,7 @@ evhttp_send_reply_end(struct evhttp_request *req)
 }

 /* we expect no more calls form the user on this request */
 -   req-userdone = 1;
 +   req-user_working = 0;

 if (req-chunked) {
 evbuffer_add(req-evcon-output_buffer, 0\r\n\r\n, 5);



 best regards,
 hanzhu



 On Mon, Jun 28, 2010 at 7:32 PM, Frank Denis libev...@pureftpd.orgwrote:

 Le Mon, Jun 28, 2010 at 07:21:21PM +0800, Zhu Han ecrivait :
  I observed the same problem in my environment. I took some time to trace
 the
  cause. Seems like it's really a bug.  Does anybody help me verify it and
  give a possible fix?

   This fixes it for me, although it's probably not the right way to fix
 this :

 diff -ur /tmp/a/http.c /tmp/b/http.c
 --- /tmp/a/http.c   2010-06-28 13:29:03.0 +0200
 +++ /tmp/b/http.c   2010-06-13 11:41:49.0 +0200
 @@ -557,7 +557,9 @@
 */
if (!req-userdone) {
/* remove it so that it will not be freed */
 -   TAILQ_REMOVE(req-evcon-requests, req, next);
 +   if (req-evcon-http_server == NULL) {
 +   TAILQ_REMOVE(req-evcon-requests, req,
 next);
 +   }
/* indicate that this request no longer has a
 * connection object
 */

 --
 Frank Denis - j [at] pureftpd.org - http://00f.net
 ___
 Libevent-users mailing list
 Libevent-users@monkey.org
 http://lists.monkey.org:8080/listinfo/libevent-users



___
Libevent-users mailing list
Libevent-users@monkey.org
http://lists.monkey.org:8080/listinfo/libevent-users


Re: [Libevent-users] Memory leak with keepalive?

2010-06-28 Thread Frank Denis
Le Mon, Jun 28, 2010 at 07:21:21PM +0800, Zhu Han ecrivait :
 I observed the same problem in my environment. I took some time to trace the
 cause. Seems like it's really a bug.  Does anybody help me verify it and
 give a possible fix?

  This fixes it for me, although it's probably not the right way to fix this :
  
diff -ur /tmp/a/http.c /tmp/b/http.c
--- /tmp/a/http.c   2010-06-28 13:29:03.0 +0200
+++ /tmp/b/http.c   2010-06-13 11:41:49.0 +0200
@@ -557,7 +557,9 @@
 */
if (!req-userdone) {
/* remove it so that it will not be freed */
-   TAILQ_REMOVE(req-evcon-requests, req, next);
+   if (req-evcon-http_server == NULL) {
+   TAILQ_REMOVE(req-evcon-requests, req, next);
+   }
/* indicate that this request no longer has a
 * connection object
 */
  
-- 
Frank Denis - j [at] pureftpd.org - http://00f.net
___
Libevent-users mailing list
Libevent-users@monkey.org
http://lists.monkey.org:8080/listinfo/libevent-users


Re: [Libevent-users] Memory leak with keepalive?

2010-06-28 Thread Zhu Han
Frank, Thank you for your patch.

I made another patch several minutes ago.

evhttp_request-userdone is used to indicate there is data being sending by
the client. I suppose it is only useful for chunk encoding response. So I
revert the meaning from userdone to user_working and mark the flag only when
chunk encoding is started. IMHO, this should fix this issue. Could the
maintainers take a look at it? Thank you!

This patch is against libevent-1.4.14b.

diff --git a/evhttp.h b/evhttp.h
index 7ddf720..77ff781 100644
--- a/evhttp.h
+++ b/evhttp.h
@@ -222,7 +222,7 @@ struct {
struct evbuffer *input_buffer;  /* read data */
ev_int64_t ntoread;
int chunked:1,  /* a chunked request */
-   userdone:1; /* the user has sent all data */
+   user_working:1; /* the user is sending the data */

struct evbuffer *output_buffer; /* outgoing post or data */

diff --git a/http.c b/http.c
index efcec40..6d6 100644
--- a/http.c
+++ b/http.c
@@ -610,8 +610,8 @@ evhttp_connection_incoming_fail(struct evhttp_request
*req,
 * the request is still being used for sending, we
 * need to disassociated it from the connection here.
 */
-   if (!req-userdone) {
-   /* remove it so that it will not be freed */
+   if (req-user_working) {
+   /* remove it so that it will not be freed*/
TAILQ_REMOVE(req-evcon-requests, req, next);
/* indicate that this request no longer has a
 * connection object
@@ -1942,7 +1942,7 @@ evhttp_send(struct evhttp_request *req, struct
evbuffer *databuf)
assert(TAILQ_FIRST(evcon-requests) == req);

/* we expect no more calls form the user on this request */
-   req-userdone = 1;
+   req-user_working = 0;

/* xxx: not sure if we really should expose the data buffer this way
*/
if (databuf != NULL)
@@ -1967,6 +1967,8 @@ void
 evhttp_send_reply_start(struct evhttp_request *req, int code,
 const char *reason)
 {
+/* mark the user is sending the request */
+req-user_working = 1;
evhttp_response_code(req, code, reason);
if (req-major == 1  req-minor == 1) {
/* use chunked encoding for HTTP/1.1 */
@@ -2008,7 +2010,7 @@ evhttp_send_reply_end(struct evhttp_request *req)
}

/* we expect no more calls form the user on this request */
-   req-userdone = 1;
+   req-user_working = 0;

if (req-chunked) {
evbuffer_add(req-evcon-output_buffer, 0\r\n\r\n, 5);



best regards,
hanzhu


On Mon, Jun 28, 2010 at 7:32 PM, Frank Denis libev...@pureftpd.org wrote:

 Le Mon, Jun 28, 2010 at 07:21:21PM +0800, Zhu Han ecrivait :
  I observed the same problem in my environment. I took some time to trace
 the
  cause. Seems like it's really a bug.  Does anybody help me verify it and
  give a possible fix?

   This fixes it for me, although it's probably not the right way to fix
 this :

 diff -ur /tmp/a/http.c /tmp/b/http.c
 --- /tmp/a/http.c   2010-06-28 13:29:03.0 +0200
 +++ /tmp/b/http.c   2010-06-13 11:41:49.0 +0200
 @@ -557,7 +557,9 @@
 */
if (!req-userdone) {
/* remove it so that it will not be freed */
 -   TAILQ_REMOVE(req-evcon-requests, req, next);
 +   if (req-evcon-http_server == NULL) {
 +   TAILQ_REMOVE(req-evcon-requests, req,
 next);
 +   }
/* indicate that this request no longer has a
 * connection object
 */

 --
 Frank Denis - j [at] pureftpd.org - http://00f.net
 ___
 Libevent-users mailing list
 Libevent-users@monkey.org
 http://lists.monkey.org:8080/listinfo/libevent-users

diff --git a/evhttp.h b/evhttp.h
index 7ddf720..77ff781 100644
--- a/evhttp.h
+++ b/evhttp.h
@@ -222,7 +222,7 @@ struct {
 	struct evbuffer *input_buffer;	/* read data */
 	ev_int64_t ntoread;
 	int chunked:1,  /* a chunked request */
-	userdone:1; /* the user has sent all data */
+	user_working:1; /* the user is sending the data */
 
 	struct evbuffer *output_buffer;	/* outgoing post or data */
 
diff --git a/http.c b/http.c
index efcec40..6d6 100644
--- a/http.c
+++ b/http.c
@@ -610,8 +610,8 @@ evhttp_connection_incoming_fail(struct evhttp_request *req,
 		 * the request is still being used for sending, we
 		 * need to disassociated it from the connection here.
 		 */
-		if (!req-userdone) {
-			/* remove it so that it will not be freed */
+		if (req-user_working) {
+			/* remove it so that it will not be freed*/
 			TAILQ_REMOVE(req-evcon-requests, req, next);
 			/* indicate that this request no