The MHD goes in a busy loop when it is configured with MHD_USE_POLL_INTERNALLY and a connection times out.
When the connection times out, the connection is closed at connection.c:2646, which sets connection->event_loop_info = MHD_EVENT_LOOP_INFO_CLEANUP.
When the loop info is set to MHD_EVENT_LOOP_INFO_CLEANUP, the main function of the thread loop, MHD_poll_all, never calls back the connection idle callback, which would have cleaned the connection and exit the loop.
I resolved the issue in my development code by adding pos->idle_handler (pos) at daemon.c:2477 in MHD_poll_all (SVN 35533).

The busy loop could be tested using a small enough connection timeout and netcat:
nc -v -w 100 <IP ADDRESS> <IP PORT>

CPU usage will reach 100% in one of the CPU and will remain at that level even when the netcat has closed its end of the connection.

Thanks,

Louis Benoit
This commit is contained in:
Christian Grothoff
2015-04-14 22:34:15 +00:00
parent 4837ce0471
commit b86f93acaf
4 changed files with 7 additions and 2 deletions
+1
View File
@@ -53,6 +53,7 @@ Hani Benhabiles <kroosec@gmail.com>
Guy Martin <gmsoft@tuxicoman.be>
Robert Groenenberg <robert.groenenberg@broadforward.com>
Denis Dowling <denis.dowling@hsd.com.au>
Louis Benoit <louisbenoit@videotron.ca>
Documentation contributions also came from:
+4
View File
@@ -1,3 +1,7 @@
Wed Apr 15 00:30:34 CEST 2015
Fix looping issue when using MHD_USE_POLL_INTERNALLY
and a client times out. -LB
Sun Apr 12 21:48:50 CEST 2015
Fix looping issue when combining MHD_USE_EPOLL_LINUX_ONLY
with HTTPS and slow clients. -CG
+1 -1
View File
@@ -130,7 +130,7 @@ typedef intptr_t ssize_t;
* Current version of the library.
* 0x01093001 = 1.9.30-1.
*/
#define MHD_VERSION 0x00094004
#define MHD_VERSION 0x00094005
/**
* MHD-internal return code for "YES".
+1 -1
View File
@@ -2474,7 +2474,7 @@ MHD_poll_all (struct MHD_Daemon *daemon,
pos->idle_handler (pos);
break;
case MHD_EVENT_LOOP_INFO_CLEANUP:
/* should never happen */
pos->idle_handler (pos);
break;
}
}