Re: Re : Re: Issue with keep-alive connections, when using APR Connector on Windows and starting Processes from Servlets
On Fri, 2012-06-29 at 17:18 +0200, Jeff MAURY wrote: Hello, I found the correct code to look at: http://svn.apache.org/repos/asf/tomcat/native/branches/1.1.x/native/src/network.c It does not set the inherit flag but it is using the apr library that maybe set the flag under Windows. If this is the case and according to your references, it is likely the client will not receive the ack and this is a problem with APR and Runtime.exec Hello, Seems like it's function apr_socket_create, defined in this APR file: http://svn.apache.org/repos/asf/apr/apr/trunk/network_io/win32/sockets.c which apparently already tries to create a non-inherited handle. The code, for reasons beyond my current understanding, relies at compile time on the flags APR_HAS_UNICODE_FS and _WIN32_WCE. It also relies at runtime on IF_WIN_OS_IS_UNICODE, which may (?) be an indirect indication that the underlying OS needs SetHandleInformation to be explicitly called. Jeff, do you have ideas/indications on how I could help push the issue resolution forward ? We're reaching the limits of my current abilities to help, not having a windows box with C compiler to do tests, etc. :-( You'll find below the relevant code: #ifdef WIN32 /* Socket handles are never truly inheritable, there are too many * bugs associated. WSADuplicateSocket will copy them, but for our * purposes, always transform the socket() created as a non-inherited * handle */ #if APR_HAS_UNICODE_FS !defined(_WIN32_WCE) IF_WIN_OS_IS_UNICODE { /* A different approach. Many users report errors such as * (32538)An operation was attempted on something that is not * a socket. : Parent: WSADuplicateSocket failed... * * This appears that the duplicated handle is no longer recognized * as a socket handle. SetHandleInformation should overcome that * problem by not altering the handle identifier. But this won't * work on 9x - it's unsupported. */ SetHandleInformation((HANDLE) (*new)-socketdes, HANDLE_FLAG_INHERIT, 0); } #if APR_HAS_ANSI_FS /* only if APR_HAS_ANSI_FS APR_HAS_UNICODE_FS */ ELSE_WIN_OS_IS_ANSI #endif #endif #if APR_HAS_ANSI_FS || defined(_WIN32_WCE) { HANDLE hProcess = GetCurrentProcess(); HANDLE dup; if (DuplicateHandle(hProcess, (HANDLE) (*new)-socketdes, hProcess, dup, 0, FALSE, DUPLICATE_SAME_ACCESS)) { closesocket((*new)-socketdes); (*new)-socketdes = (SOCKET) dup; } } #endif #endif /* def WIN32 */ Jeff On Fri, Jun 29, 2012 at 4:38 PM, Laurent Petit lpe...@yseop.com wrote: On Fri, 2012-06-29 at 15:27 +0200, Jeff MAURY wrote: No, it does not (yet) make sense because one piece of the puzzle is missing. The Local socket is not a TCP socket, it is created from a path rather than from an IP address. So this socket is in no way linked to the browser, at least directly, and the missing piece is what is the relation from this socket to the browser. You're right, so the question is still open. In the mean time, I'm come across interesting google search results, among which the first one seems really interesting: Oracle Bug 6428742 == Currently, on Windows, Runtime.exec is implemented by calling CreateProcess with the bInheritHandles argument set to TRUE, which causes open handles to not be closed if they are not explicitly set to be non-inherited. This is the underlying cause of many subtle bugs, such as 6347873: (so) Ports opened with ServerSocketChannel blocks when using Runtime.exec http://monaco.sfbay/detail.jsf?cr=6347873; == Note the if they are not explicitly set to be non-inherited = this seems like a game changer, since our implicit assumption was that we would just look for code which would have accidentally set the handle to be inherited, not the other way around. http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6428742 QT Project == When using spawned processes, sockets opened by the client remain in CLOSE_WAIT state after closing the connection. Sockets on the remote side would be in FIN_WAIT_2 state and waiting for ACK. When the spawned (child) process is closed, then ACK is sent and sockets are finally moved to CLOSE state on both sides. This seems to be caused by the default handle inheritance on Windows by child processes. https://bugreports.qt-project.org/browse/QTBUG-4465 Zeromq2 project === On Windows platform, in order to prevent child processes to inherit parent sockets, SetHandleInformation ( http://msdn.microsoft.com/en-us/library/windows/desktop/ms724935(v=vs.85).aspx) should be called on the socket handle. This patch comes out from discussion at: https://github.com/zeromq/clrzmq/issues/60;
Re: Re : Re: Issue with keep-alive connections, when using APR Connector on Windows and starting Processes from Servlets
Hello Jeff, Konstantin all, On Mon, 2012-06-25 at 20:52 +0200, verlag.preis...@t-online.de wrote: Hello Jeff all, Von: Jeff MAURY jeffma...@jeffmaury.com Datum: Mon, 25 Jun 2012 18:46:02 +0200 Konstantin, your explanations are very interesting but unclear to me: what do you call the inactivity timer ? When it is started ? After the request has been processed by the servlet ? In that case, I see no difference between a servlet that launch a process and another one. It seems to me that a process that is launched does not inhererits handles from its parent process but it's possible that under Windows, it's an option so it would be interesting to watch. Jeff Sorry, I'm just a normal Tomcat user, and I don't know how exactly the APR connector and its Timeout works, so I am unable to answer that. Howewer, I did some further observations: -When I perform a request to the servlet that opens wordpad.exe, the TCP connection from Tomcat does not close after the timeout - even when I kill the Tomcat process (java.exe), the TCP connection is still open. If I kill wordpad.exe, then finally the connection is closed/aborted. -When I have 1 TCP connection open to Tomcat and the servlet starts the little C program, Task manager shows that it has 11 handles. However, when I have 5 TCP connections open to Tomcat, and do the request on one of them, Task maanger shows that the C program has 15 handles - so four more handles when there are four more connections to Tomcat. All of that 5 TCP connections don't close until I kill that process. That seems to me to be an indication that socket handles could be inherited by the child processes that are startet by ProcessBuilder from tomcat. A msdn article mentions how to create a new process using CreateProcess(); it also mentions that socket handles can be inherited: http://msdn.microsoft.com/en-us/library/windows/desktop/ms724466.aspx However, as I don't have much knowledge about programming with WinAPIs, I don't know why those handles are inherited (the MSDN article mentions that a handle must be specified as inheritable when created, to allow a child process to inherit it). Maybe someone with more WinAPI/Tomcat Native knowledge can help here. I also had the vague intuition that this related to handles inheritence. Your recent tests research tend to make this hypothesis even more appealing. I know nothing about tomcat-native implementation, but I was able to see that the bInheritHandle member is set to true here in tomcat native's C code: lpetit:~/tmp/tomcat-native $ grep bInheritHandle -R * native/os/win32/ntpipe.c:con-sa.bInheritHandle = TRUE; ( http://svn.apache.org/repos/asf/tomcat/native/branches/1.1.x/native/os/win32/ntpipe.c ) Jeff, What else could we do to help investigate / fix this issue ? Cheers, -- Laurent Regards, Konstantin Preißer - To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org For additional commands, e-mail: users-h...@tomcat.apache.org -- Laurent Petit Agence +33 (0)4 78 47 07 49 Email lpe...@yseop.com Yseop apporte une réponse intelligente et individualisée à chacun de vos clients www.yseop.com - To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org For additional commands, e-mail: users-h...@tomcat.apache.org
Re: Re : Re: Issue with keep-alive connections, when using APR Connector on Windows and starting Processes from Servlets
That what I guessed but I don't understand everything. The code you are referencing is related to NTPipes and not sockets. So I'm not familiar with Tomcat Native implementation, but do you know the global architecture ? What I guessed is that the Tomcat native stuff created with the inherit flag, but even if it does, I don't see why it should not work if the socket is closed after a timeout. Regards Jeff On Fri, Jun 29, 2012 at 11:22 AM, Laurent Petit lpe...@yseop.com wrote: Hello Jeff, Konstantin all, On Mon, 2012-06-25 at 20:52 +0200, verlag.preis...@t-online.de wrote: Hello Jeff all, Von: Jeff MAURY jeffma...@jeffmaury.com Datum: Mon, 25 Jun 2012 18:46:02 +0200 Konstantin, your explanations are very interesting but unclear to me: what do you call the inactivity timer ? When it is started ? After the request has been processed by the servlet ? In that case, I see no difference between a servlet that launch a process and another one. It seems to me that a process that is launched does not inhererits handles from its parent process but it's possible that under Windows, it's an option so it would be interesting to watch. Jeff Sorry, I'm just a normal Tomcat user, and I don't know how exactly the APR connector and its Timeout works, so I am unable to answer that. Howewer, I did some further observations: -When I perform a request to the servlet that opens wordpad.exe, the TCP connection from Tomcat does not close after the timeout - even when I kill the Tomcat process (java.exe), the TCP connection is still open. If I kill wordpad.exe, then finally the connection is closed/aborted. -When I have 1 TCP connection open to Tomcat and the servlet starts the little C program, Task manager shows that it has 11 handles. However, when I have 5 TCP connections open to Tomcat, and do the request on one of them, Task maanger shows that the C program has 15 handles - so four more handles when there are four more connections to Tomcat. All of that 5 TCP connections don't close until I kill that process. That seems to me to be an indication that socket handles could be inherited by the child processes that are startet by ProcessBuilder from tomcat. A msdn article mentions how to create a new process using CreateProcess(); it also mentions that socket handles can be inherited: http://msdn.microsoft.com/en-us/library/windows/desktop/ms724466.aspx However, as I don't have much knowledge about programming with WinAPIs, I don't know why those handles are inherited (the MSDN article mentions that a handle must be specified as inheritable when created, to allow a child process to inherit it). Maybe someone with more WinAPI/Tomcat Native knowledge can help here. I also had the vague intuition that this related to handles inheritence. Your recent tests research tend to make this hypothesis even more appealing. I know nothing about tomcat-native implementation, but I was able to see that the bInheritHandle member is set to true here in tomcat native's C code: lpetit:~/tmp/tomcat-native $ grep bInheritHandle -R * native/os/win32/ntpipe.c:con-sa.bInheritHandle = TRUE; ( http://svn.apache.org/repos/asf/tomcat/native/branches/1.1.x/native/os/win32/ntpipe.c) Jeff, What else could we do to help investigate / fix this issue ? Cheers, -- Laurent Regards, Konstantin Preißer - To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org For additional commands, e-mail: users-h...@tomcat.apache.org -- Laurent Petit Agence +33 (0)4 78 47 07 49 Email lpe...@yseop.com Yseop apporte une réponse intelligente et individualisée à chacun de vos clients www.yseop.com - To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org For additional commands, e-mail: users-h...@tomcat.apache.org -- Jeff MAURY Legacy code often differs from its suggested alternative by actually working and scaling. - Bjarne Stroustrup http://www.jeffmaury.com http://riadiscuss.jeffmaury.com http://www.twitter.com/jeffmaury
Re: Re : Re: Issue with keep-alive connections, when using APR Connector on Windows and starting Processes from Servlets
Hello, On Fri, 2012-06-29 at 11:45 +0200, Jeff MAURY wrote: That what I guessed but I don't understand everything. The code you are referencing is related to NTPipes and not sockets. I'm not a C expert, but my bet is that the file name is misleading. Indeed, the con-sa.bInheritHandle = TRUE; statement appears in the definition driven by the following macro expansion: TCN_IMPLEMENT_CALL(jlong, Local, create)(TCN_STDARGS, jstring name, jlong pool) And when the macro call TCN_IMPLEMENT_CALL(jlong, Local, create) is preprocessed, it gives: JNIEXPORT RT JNICALL Java_org_apache_tomcat_jni_##Local##_##create , thus the bInheritHandle = TRUE statement is defined in the following function signature: JNIEXPORT RT JNICALL Java_org_apache_tomcat_jni_##Local##_##create(TCN_STDARGS, jstring name, jlong pool) which is a function called by JNDI, and as I guess, by class org.apache.tomcat.ini.Local, method create() : http://svn.apache.org/repos/asf/tomcat/native/branches/1.1.x/java/org/apache/tomcat/jni/Local.java And the javadoc for class Local is: Local socket And for methode create : /** * Create a socket. * @param path The address of the new socket. * @param cont The parent pool to use * @return The new socket that has been set up. */ It seems like the native code uses a pool, and my bet is that the pool is responsible for trying to reuse the socket. And something like this may happen: the socket handle, inherited by the child process, puts the socket in such a state that the pool either can't, either doesn't want to reuse it. And then what happens is that on the other side of the socket, the client continues to write HTTP requests, and nobody is listening. And then when the Tomcat's child process is killed, the socket is finally closed somehow, the client browser notices it and creates a new connection to the server and retries the HTTP request. Does that make sense ? So I'm not familiar with Tomcat Native implementation, but do you know the global architecture ? What I guessed is that the Tomcat native stuff created with the inherit flag, but even if it does, I don't see why it should not work if the socket is closed after a timeout. Regards Jeff On Fri, Jun 29, 2012 at 11:22 AM, Laurent Petit lpe...@yseop.com wrote: Hello Jeff, Konstantin all, On Mon, 2012-06-25 at 20:52 +0200, verlag.preis...@t-online.de wrote: Hello Jeff all, Von: Jeff MAURY jeffma...@jeffmaury.com Datum: Mon, 25 Jun 2012 18:46:02 +0200 Konstantin, your explanations are very interesting but unclear to me: what do you call the inactivity timer ? When it is started ? After the request has been processed by the servlet ? In that case, I see no difference between a servlet that launch a process and another one. It seems to me that a process that is launched does not inhererits handles from its parent process but it's possible that under Windows, it's an option so it would be interesting to watch. Jeff Sorry, I'm just a normal Tomcat user, and I don't know how exactly the APR connector and its Timeout works, so I am unable to answer that. Howewer, I did some further observations: -When I perform a request to the servlet that opens wordpad.exe, the TCP connection from Tomcat does not close after the timeout - even when I kill the Tomcat process (java.exe), the TCP connection is still open. If I kill wordpad.exe, then finally the connection is closed/aborted. -When I have 1 TCP connection open to Tomcat and the servlet starts the little C program, Task manager shows that it has 11 handles. However, when I have 5 TCP connections open to Tomcat, and do the request on one of them, Task maanger shows that the C program has 15 handles - so four more handles when there are four more connections to Tomcat. All of that 5 TCP connections don't close until I kill that process. That seems to me to be an indication that socket handles could be inherited by the child processes that are startet by ProcessBuilder from tomcat. A msdn article mentions how to create a new process using CreateProcess(); it also mentions that socket handles can be inherited: http://msdn.microsoft.com/en-us/library/windows/desktop/ms724466.aspx However, as I don't have much knowledge about programming with WinAPIs, I don't know why those handles are inherited (the MSDN article mentions that a handle must be specified as inheritable when created, to allow a child process to inherit it). Maybe someone with more WinAPI/Tomcat Native knowledge can help here. I also had the vague intuition that this related to handles inheritence. Your recent tests research tend to make this hypothesis even more appealing. I know nothing about tomcat-native implementation, but I was able to see that the
Re: Re : Re: Issue with keep-alive connections, when using APR Connector on Windows and starting Processes from Servlets
No, it does not (yet) make sense because one piece of the puzzle is missing. The Local socket is not a TCP socket, it is created from a path rather than from an IP address. So this socket is in no way linked to the browser, at least directly, and the missing piece is what is the relation from this socket to the browser. Jeff On Fri, Jun 29, 2012 at 2:40 PM, Laurent Petit lpe...@yseop.com wrote: Hello, On Fri, 2012-06-29 at 11:45 +0200, Jeff MAURY wrote: That what I guessed but I don't understand everything. The code you are referencing is related to NTPipes and not sockets. I'm not a C expert, but my bet is that the file name is misleading. Indeed, the con-sa.bInheritHandle = TRUE; statement appears in the definition driven by the following macro expansion: TCN_IMPLEMENT_CALL(jlong, Local, create)(TCN_STDARGS, jstring name, jlong pool) And when the macro call TCN_IMPLEMENT_CALL(jlong, Local, create) is preprocessed, it gives: JNIEXPORT RT JNICALL Java_org_apache_tomcat_jni_##Local##_##create , thus the bInheritHandle = TRUE statement is defined in the following function signature: JNIEXPORT RT JNICALL Java_org_apache_tomcat_jni_##Local##_##create(TCN_STDARGS, jstring name, jlong pool) which is a function called by JNDI, and as I guess, by class org.apache.tomcat.ini.Local, method create() : http://svn.apache.org/repos/asf/tomcat/native/branches/1.1.x/java/org/apache/tomcat/jni/Local.java And the javadoc for class Local is: Local socket And for methode create : /** * Create a socket. * @param path The address of the new socket. * @param cont The parent pool to use * @return The new socket that has been set up. */ It seems like the native code uses a pool, and my bet is that the pool is responsible for trying to reuse the socket. And something like this may happen: the socket handle, inherited by the child process, puts the socket in such a state that the pool either can't, either doesn't want to reuse it. And then what happens is that on the other side of the socket, the client continues to write HTTP requests, and nobody is listening. And then when the Tomcat's child process is killed, the socket is finally closed somehow, the client browser notices it and creates a new connection to the server and retries the HTTP request. Does that make sense ? So I'm not familiar with Tomcat Native implementation, but do you know the global architecture ? What I guessed is that the Tomcat native stuff created with the inherit flag, but even if it does, I don't see why it should not work if the socket is closed after a timeout. Regards Jeff On Fri, Jun 29, 2012 at 11:22 AM, Laurent Petit lpe...@yseop.com wrote: Hello Jeff, Konstantin all, On Mon, 2012-06-25 at 20:52 +0200, verlag.preis...@t-online.de wrote: Hello Jeff all, Von: Jeff MAURY jeffma...@jeffmaury.com Datum: Mon, 25 Jun 2012 18:46:02 +0200 Konstantin, your explanations are very interesting but unclear to me: what do you call the inactivity timer ? When it is started ? After the request has been processed by the servlet ? In that case, I see no difference between a servlet that launch a process and another one. It seems to me that a process that is launched does not inhererits handles from its parent process but it's possible that under Windows, it's an option so it would be interesting to watch. Jeff Sorry, I'm just a normal Tomcat user, and I don't know how exactly the APR connector and its Timeout works, so I am unable to answer that. Howewer, I did some further observations: -When I perform a request to the servlet that opens wordpad.exe, the TCP connection from Tomcat does not close after the timeout - even when I kill the Tomcat process (java.exe), the TCP connection is still open. If I kill wordpad.exe, then finally the connection is closed/aborted. -When I have 1 TCP connection open to Tomcat and the servlet starts the little C program, Task manager shows that it has 11 handles. However, when I have 5 TCP connections open to Tomcat, and do the request on one of them, Task maanger shows that the C program has 15 handles - so four more handles when there are four more connections to Tomcat. All of that 5 TCP connections don't close until I kill that process. That seems to me to be an indication that socket handles could be inherited by the child processes that are startet by ProcessBuilder from tomcat. A msdn article mentions how to create a new process using CreateProcess(); it also mentions that socket handles can be inherited: http://msdn.microsoft.com/en-us/library/windows/desktop/ms724466.aspx However, as I don't have much knowledge about programming with WinAPIs,
Re: Re : Re: Issue with keep-alive connections, when using APR Connector on Windows and starting Processes from Servlets
On Fri, 2012-06-29 at 15:27 +0200, Jeff MAURY wrote: No, it does not (yet) make sense because one piece of the puzzle is missing. The Local socket is not a TCP socket, it is created from a path rather than from an IP address. So this socket is in no way linked to the browser, at least directly, and the missing piece is what is the relation from this socket to the browser. You're right, so the question is still open. In the mean time, I'm come across interesting google search results, among which the first one seems really interesting: Oracle Bug 6428742 == Currently, on Windows, Runtime.exec is implemented by calling CreateProcess with the bInheritHandles argument set to TRUE, which causes open handles to not be closed if they are not explicitly set to be non-inherited. This is the underlying cause of many subtle bugs, such as 6347873: (so) Ports opened with ServerSocketChannel blocks when using Runtime.exec http://monaco.sfbay/detail.jsf?cr=6347873; == Note the if they are not explicitly set to be non-inherited = this seems like a game changer, since our implicit assumption was that we would just look for code which would have accidentally set the handle to be inherited, not the other way around. http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6428742 QT Project == When using spawned processes, sockets opened by the client remain in CLOSE_WAIT state after closing the connection. Sockets on the remote side would be in FIN_WAIT_2 state and waiting for ACK. When the spawned (child) process is closed, then ACK is sent and sockets are finally moved to CLOSE state on both sides. This seems to be caused by the default handle inheritance on Windows by child processes. https://bugreports.qt-project.org/browse/QTBUG-4465 Zeromq2 project === On Windows platform, in order to prevent child processes to inherit parent sockets, SetHandleInformation (http://msdn.microsoft.com/en-us/library/windows/desktop/ms724935(v=vs.85).aspx) should be called on the socket handle. This patch comes out from discussion at: https://github.com/zeromq/clrzmq/issues/60; https://github.com/zeromq/zeromq2-x/pull/51 and https://zeromq.jira.com/browse/LIBZMQ-366 I found way more interesting results, but I'll spare space and won't paste them all in this thread ( google search criteria : windows inheriting socket handles ) Jeff On Fri, Jun 29, 2012 at 2:40 PM, Laurent Petit lpe...@yseop.com wrote: Hello, On Fri, 2012-06-29 at 11:45 +0200, Jeff MAURY wrote: That what I guessed but I don't understand everything. The code you are referencing is related to NTPipes and not sockets. I'm not a C expert, but my bet is that the file name is misleading. Indeed, the con-sa.bInheritHandle = TRUE; statement appears in the definition driven by the following macro expansion: TCN_IMPLEMENT_CALL(jlong, Local, create)(TCN_STDARGS, jstring name, jlong pool) And when the macro call TCN_IMPLEMENT_CALL(jlong, Local, create) is preprocessed, it gives: JNIEXPORT RT JNICALL Java_org_apache_tomcat_jni_##Local##_##create , thus the bInheritHandle = TRUE statement is defined in the following function signature: JNIEXPORT RT JNICALL Java_org_apache_tomcat_jni_##Local##_##create(TCN_STDARGS, jstring name, jlong pool) which is a function called by JNDI, and as I guess, by class org.apache.tomcat.ini.Local, method create() : http://svn.apache.org/repos/asf/tomcat/native/branches/1.1.x/java/org/apache/tomcat/jni/Local.java And the javadoc for class Local is: Local socket And for methode create : /** * Create a socket. * @param path The address of the new socket. * @param cont The parent pool to use * @return The new socket that has been set up. */ It seems like the native code uses a pool, and my bet is that the pool is responsible for trying to reuse the socket. And something like this may happen: the socket handle, inherited by the child process, puts the socket in such a state that the pool either can't, either doesn't want to reuse it. And then what happens is that on the other side of the socket, the client continues to write HTTP requests, and nobody is listening. And then when the Tomcat's child process is killed, the socket is finally closed somehow, the client browser notices it and creates a new connection to the server and retries the HTTP request. Does that make sense ? So I'm not familiar with Tomcat Native implementation, but do you know the global architecture ? What I guessed is that the Tomcat native stuff created with the inherit flag, but even if it does, I don't see why it should not work if the socket is closed after a timeout. Regards Jeff On Fri, Jun 29, 2012 at 11:22 AM, Laurent Petit lpe...@yseop.com
Re: Re : Re: Issue with keep-alive connections, when using APR Connector on Windows and starting Processes from Servlets
Hello, I found the correct code to look at: http://svn.apache.org/repos/asf/tomcat/native/branches/1.1.x/native/src/network.c It does not set the inherit flag but it is using the apr library that maybe set the flag under Windows. If this is the case and according to your references, it is likely the client will not receive the ack and this is a problem with APR and Runtime.exec Jeff On Fri, Jun 29, 2012 at 4:38 PM, Laurent Petit lpe...@yseop.com wrote: On Fri, 2012-06-29 at 15:27 +0200, Jeff MAURY wrote: No, it does not (yet) make sense because one piece of the puzzle is missing. The Local socket is not a TCP socket, it is created from a path rather than from an IP address. So this socket is in no way linked to the browser, at least directly, and the missing piece is what is the relation from this socket to the browser. You're right, so the question is still open. In the mean time, I'm come across interesting google search results, among which the first one seems really interesting: Oracle Bug 6428742 == Currently, on Windows, Runtime.exec is implemented by calling CreateProcess with the bInheritHandles argument set to TRUE, which causes open handles to not be closed if they are not explicitly set to be non-inherited. This is the underlying cause of many subtle bugs, such as 6347873: (so) Ports opened with ServerSocketChannel blocks when using Runtime.exec http://monaco.sfbay/detail.jsf?cr=6347873; == Note the if they are not explicitly set to be non-inherited = this seems like a game changer, since our implicit assumption was that we would just look for code which would have accidentally set the handle to be inherited, not the other way around. http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6428742 QT Project == When using spawned processes, sockets opened by the client remain in CLOSE_WAIT state after closing the connection. Sockets on the remote side would be in FIN_WAIT_2 state and waiting for ACK. When the spawned (child) process is closed, then ACK is sent and sockets are finally moved to CLOSE state on both sides. This seems to be caused by the default handle inheritance on Windows by child processes. https://bugreports.qt-project.org/browse/QTBUG-4465 Zeromq2 project === On Windows platform, in order to prevent child processes to inherit parent sockets, SetHandleInformation ( http://msdn.microsoft.com/en-us/library/windows/desktop/ms724935(v=vs.85).aspx) should be called on the socket handle. This patch comes out from discussion at: https://github.com/zeromq/clrzmq/issues/60; https://github.com/zeromq/zeromq2-x/pull/51 and https://zeromq.jira.com/browse/LIBZMQ-366 I found way more interesting results, but I'll spare space and won't paste them all in this thread ( google search criteria : windows inheriting socket handles ) Jeff On Fri, Jun 29, 2012 at 2:40 PM, Laurent Petit lpe...@yseop.com wrote: Hello, On Fri, 2012-06-29 at 11:45 +0200, Jeff MAURY wrote: That what I guessed but I don't understand everything. The code you are referencing is related to NTPipes and not sockets. I'm not a C expert, but my bet is that the file name is misleading. Indeed, the con-sa.bInheritHandle = TRUE; statement appears in the definition driven by the following macro expansion: TCN_IMPLEMENT_CALL(jlong, Local, create)(TCN_STDARGS, jstring name, jlong pool) And when the macro call TCN_IMPLEMENT_CALL(jlong, Local, create) is preprocessed, it gives: JNIEXPORT RT JNICALL Java_org_apache_tomcat_jni_##Local##_##create , thus the bInheritHandle = TRUE statement is defined in the following function signature: JNIEXPORT RT JNICALL Java_org_apache_tomcat_jni_##Local##_##create(TCN_STDARGS, jstring name, jlong pool) which is a function called by JNDI, and as I guess, by class org.apache.tomcat.ini.Local, method create() : http://svn.apache.org/repos/asf/tomcat/native/branches/1.1.x/java/org/apache/tomcat/jni/Local.java And the javadoc for class Local is: Local socket And for methode create : /** * Create a socket. * @param path The address of the new socket. * @param cont The parent pool to use * @return The new socket that has been set up. */ It seems like the native code uses a pool, and my bet is that the pool is responsible for trying to reuse the socket. And something like this may happen: the socket handle, inherited by the child process, puts the socket in such a state that the pool either can't, either doesn't want to reuse it. And then what happens is that on the other side of the socket, the client continues to write HTTP requests, and nobody is listening. And then when the Tomcat's child process is
Re: Re : Re: Issue with keep-alive connections, when using APR Connector on Windows and starting Processes from Servlets
2012/6/22 Laurent Petit lpe...@yseop.com: Hello, On Thu, 2012-06-21 at 22:53 +0200, Jeff MAURY wrote: Is it specific to Wordpad or any launched process will do the trick ? Do you tried with a non UI process (console) ? I did an additional test, as you suggested, with a non UI process (a small java executable launched in headless mode, whose purpose was just to wait for 20 seconds before exiting). I can reproduce the problem with this headless executable: the HTTP client is blocked until the 20 seconds elapse and the process is killed. Here is the modified servlet code I used: https://www.refheap.com/paste/3285 and here is the code for the small java program: https://www.refheap.com/paste/3286 I wonder what will happen if you would start another program from the one that you are launching. E.g. create a *.bat file and use start command to launch other process from it. Something like this: cmd.exe /C start wordpad.exe Best regards, Konstantin Kolinko - To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org For additional commands, e-mail: users-h...@tomcat.apache.org
Re: Re : Re: Issue with keep-alive connections, when using APR Connector on Windows and starting Processes from Servlets
Hello, Is there anything I can do to help qualify the problem even more ? Beyond having shown the source code of the servlet, would a fully mavenized example help? Anything else? Regards, -- Laurent On Fri, 2012-06-22 at 10:21 +0200, Laurent Petit wrote: Hello, On Thu, 2012-06-21 at 22:53 +0200, Jeff MAURY wrote: Is it specific to Wordpad or any launched process will do the trick ? Do you tried with a non UI process (console) ? I did an additional test, as you suggested, with a non UI process (a small java executable launched in headless mode, whose purpose was just to wait for 20 seconds before exiting). I can reproduce the problem with this headless executable: the HTTP client is blocked until the 20 seconds elapse and the process is killed. Here is the modified servlet code I used: https://www.refheap.com/paste/3285 and here is the code for the small java program: https://www.refheap.com/paste/3286 Regards, -- Laurent Jeff On Thu, Jun 21, 2012 at 10:45 PM, Laurent Petit lpe...@yseop.com wrote: En Réponse à Tomcat Users List users@tomcat.apache.org le 21 juin 2012 00:07 Can you verify your 2 threads (reading input an error) are launched ? Yes they are. Verified. Can you confirm you are getting the problem only on Windows ? Yes sir, we're unable to reproduce it on Ubuntu. Jeff On Wed, Jun 20, 2012 at 4:19 PM, Laurent Petit lpe...@yseop.com wrote: Hello, I have a problem with keep-alive connections, when starting a subprocess (via JDK's default ProcessBuilder/Process API), while also having started Tomcat with the APR HTTP/1.1 Connector. The problem symptom is with Keep-Alive connection, as follows: - the client (browser, jmeter, etc.) sends a first request - the servlet starts a Process for e.g. wordpad.exe - the servlet returns an acknowledgment html content, sets the content length, flushes the writer, and returns - the client displays the received acknowledgement html content, sends the second request to the server. - the server doesn't answer. No Tomcat log ever reports the start of something received. - Then when on the server you close the wordpad.exe instance, the server finally handles the second request. I have created a small servlet code which reproduces the problem. For the demo, it suffices to have the started subprocess be wordpad.exe. Of course my real process is more interesting than that :-). You can find the servlet code for reproducing the test here: https://www.refheap.com/paste/3254To reproduce the problem deterministically, the ConnectionTimeout for the APR HTTP Connector in servlet.xml must be set sufficiently low. With my boxes, I get a 100% error hit when set at 200 ms. You can find here the jmeter script which hits the same page again and again with keep-alive option set on: https://www.refheap.com/paste/3255So far, the only reliable solution we have found to work around this problem is to not use the HTP/1.1 APR Connector.My configuration : Windows 2008 US std R2 64bits Tomcat 6.0.32 64 bits Java 6u30 64 bits(Oracle) Same issue has been observed on Windows 7 32 bits. Was not able to reproduce the issue on Linux Ubuntu Desktop 11.10 or 12.04.Thanks for your support, ideas, solutions, etc. - To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org For additional commands, e-mail: users-h...@tomcat.apache.org -- Jeff MAURY Legacy code often differs from its suggested alternative by actually working and scaling. - Bjarne Stroustrup http://www.jeffmaury.com http://riadiscuss.jeffmaury.com http://www.twitter.com/jeffmaury -- Laurent Petit Agence +33 (0)4 78 47 07 49 Email lpe...@yseop.com Yseop apporte une réponse intelligente et individualisée à chacun de vos clients www.yseop.com - To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org For additional commands, e-mail: users-h...@tomcat.apache.org
Re: Re : Re: Issue with keep-alive connections, when using APR Connector on Windows and starting Processes from Servlets
If you can post a Mavenized example, I could have time to run it and watch at it. Regards Jeff On Mon, Jun 25, 2012 at 11:40 AM, Laurent Petit lpe...@yseop.com wrote: Hello, Is there anything I can do to help qualify the problem even more ? Beyond having shown the source code of the servlet, would a fully mavenized example help? Anything else? Regards, -- Laurent On Fri, 2012-06-22 at 10:21 +0200, Laurent Petit wrote: Hello, On Thu, 2012-06-21 at 22:53 +0200, Jeff MAURY wrote: Is it specific to Wordpad or any launched process will do the trick ? Do you tried with a non UI process (console) ? I did an additional test, as you suggested, with a non UI process (a small java executable launched in headless mode, whose purpose was just to wait for 20 seconds before exiting). I can reproduce the problem with this headless executable: the HTTP client is blocked until the 20 seconds elapse and the process is killed. Here is the modified servlet code I used: https://www.refheap.com/paste/3285 and here is the code for the small java program: https://www.refheap.com/paste/3286 Regards, -- Laurent Jeff On Thu, Jun 21, 2012 at 10:45 PM, Laurent Petit lpe...@yseop.com wrote: En Réponse à Tomcat Users List users@tomcat.apache.org le 21 juin 2012 00:07 Can you verify your 2 threads (reading input an error) are launched ? Yes they are. Verified. Can you confirm you are getting the problem only on Windows ? Yes sir, we're unable to reproduce it on Ubuntu. Jeff On Wed, Jun 20, 2012 at 4:19 PM, Laurent Petit lpe...@yseop.com wrote: Hello, I have a problem with keep-alive connections, when starting a subprocess (via JDK's default ProcessBuilder/Process API), while also having started Tomcat with the APR HTTP/1.1 Connector. The problem symptom is with Keep-Alive connection, as follows: - the client (browser, jmeter, etc.) sends a first request - the servlet starts a Process for e.g. wordpad.exe - the servlet returns an acknowledgment html content, sets the content length, flushes the writer, and returns - the client displays the received acknowledgement html content, sends the second request to the server. - the server doesn't answer. No Tomcat log ever reports the start of something received. - Then when on the server you close the wordpad.exe instance, the server finally handles the second request. I have created a small servlet code which reproduces the problem. For the demo, it suffices to have the started subprocess be wordpad.exe. Of course my real process is more interesting than that :-). You can find the servlet code for reproducing the test here: https://www.refheap.com/paste/3254To reproduce the problem deterministically, the ConnectionTimeout for the APR HTTP Connector in servlet.xml must be set sufficiently low. With my boxes, I get a 100% error hit when set at 200 ms. You can find here the jmeter script which hits the same page again and again with keep-alive option set on: https://www.refheap.com/paste/3255So far, the only reliable solution we have found to work around this problem is to not use the HTP/1.1 APR Connector.My configuration : Windows 2008 US std R2 64bits Tomcat 6.0.32 64 bits Java 6u30 64 bits(Oracle) Same issue has been observed on Windows 7 32 bits. Was not able to reproduce the issue on Linux Ubuntu Desktop 11.10 or 12.04.Thanks for your support, ideas, solutions, etc. - To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org For additional commands, e-mail: users-h...@tomcat.apache.org -- Jeff MAURY Legacy code often differs from its suggested alternative by actually working and scaling. - Bjarne Stroustrup http://www.jeffmaury.com http://riadiscuss.jeffmaury.com http://www.twitter.com/jeffmaury -- Laurent Petit Agence +33 (0)4 78 47 07 49 Email lpe...@yseop.com Yseop apporte une réponse intelligente et individualisée à chacun de vos clients www.yseop.com - To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org For additional commands, e-mail: users-h...@tomcat.apache.org -- Jeff MAURY Legacy code often differs from its suggested alternative by actually working and scaling. - Bjarne Stroustrup http://www.jeffmaury.com http://riadiscuss.jeffmaury.com http://www.twitter.com/jeffmaury
Re: Re : Re: Issue with keep-alive connections, when using APR Connector on Windows and starting Processes from Servlets
On Mon, 2012-06-25 at 11:51 +0200, Jeff MAURY wrote: If you can post a Mavenized example, I could have time to run it and watch at it. Ok, thanks, I will. Is a mavenized project with source code published on github ok for you ? Regards Jeff On Mon, Jun 25, 2012 at 11:40 AM, Laurent Petit lpe...@yseop.com wrote: Hello, Is there anything I can do to help qualify the problem even more ? Beyond having shown the source code of the servlet, would a fully mavenized example help? Anything else? Regards, -- Laurent On Fri, 2012-06-22 at 10:21 +0200, Laurent Petit wrote: Hello, On Thu, 2012-06-21 at 22:53 +0200, Jeff MAURY wrote: Is it specific to Wordpad or any launched process will do the trick ? Do you tried with a non UI process (console) ? I did an additional test, as you suggested, with a non UI process (a small java executable launched in headless mode, whose purpose was just to wait for 20 seconds before exiting). I can reproduce the problem with this headless executable: the HTTP client is blocked until the 20 seconds elapse and the process is killed. Here is the modified servlet code I used: https://www.refheap.com/paste/3285 and here is the code for the small java program: https://www.refheap.com/paste/3286 Regards, -- Laurent Jeff On Thu, Jun 21, 2012 at 10:45 PM, Laurent Petit lpe...@yseop.com wrote: En Réponse à Tomcat Users List users@tomcat.apache.org le 21 juin 2012 00:07 Can you verify your 2 threads (reading input an error) are launched ? Yes they are. Verified. Can you confirm you are getting the problem only on Windows ? Yes sir, we're unable to reproduce it on Ubuntu. Jeff On Wed, Jun 20, 2012 at 4:19 PM, Laurent Petit lpe...@yseop.com wrote: Hello, I have a problem with keep-alive connections, when starting a subprocess (via JDK's default ProcessBuilder/Process API), while also having started Tomcat with the APR HTTP/1.1 Connector. The problem symptom is with Keep-Alive connection, as follows: - the client (browser, jmeter, etc.) sends a first request - the servlet starts a Process for e.g. wordpad.exe - the servlet returns an acknowledgment html content, sets the content length, flushes the writer, and returns - the client displays the received acknowledgement html content, sends the second request to the server. - the server doesn't answer. No Tomcat log ever reports the start of something received. - Then when on the server you close the wordpad.exe instance, the server finally handles the second request. I have created a small servlet code which reproduces the problem. For the demo, it suffices to have the started subprocess be wordpad.exe. Of course my real process is more interesting than that :-). You can find the servlet code for reproducing the test here: https://www.refheap.com/paste/3254To reproduce the problem deterministically, the ConnectionTimeout for the APR HTTP Connector in servlet.xml must be set sufficiently low. With my boxes, I get a 100% error hit when set at 200 ms. You can find here the jmeter script which hits the same page again and again with keep-alive option set on: https://www.refheap.com/paste/3255So far, the only reliable solution we have found to work around this problem is to not use the HTP/1.1 APR Connector.My configuration : Windows 2008 US std R2 64bits Tomcat 6.0.32 64 bits Java 6u30 64 bits(Oracle) Same issue has been observed on Windows 7 32 bits. Was not able to reproduce the issue on Linux Ubuntu Desktop 11.10 or 12.04.Thanks for your support, ideas, solutions, etc. - To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org For additional commands, e-mail: users-h...@tomcat.apache.org -- Jeff MAURY Legacy code often differs from its suggested alternative by actually working and scaling. - Bjarne Stroustrup http://www.jeffmaury.com http://riadiscuss.jeffmaury.com http://www.twitter.com/jeffmaury -- Laurent Petit Agence +33 (0)4 78 47 07 49 Email lpe...@yseop.com Yseop apporte une réponse intelligente et individualisée à chacun de vos clients www.yseop.com - To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org For additional commands, e-mail: users-h...@tomcat.apache.org -- Laurent Petit Agence +33 (0)4 78 47 07 49 Email lpe...@yseop.com Yseop apporte une réponse intelligente et individualisée à chacun de vos clients
Re: Re : Re: Issue with keep-alive connections, when using APR Connector on Windows and starting Processes from Servlets
Yes, fine Jeff On Mon, Jun 25, 2012 at 1:46 PM, Laurent Petit lpe...@yseop.com wrote: On Mon, 2012-06-25 at 11:51 +0200, Jeff MAURY wrote: If you can post a Mavenized example, I could have time to run it and watch at it. Ok, thanks, I will. Is a mavenized project with source code published on github ok for you ? Regards Jeff On Mon, Jun 25, 2012 at 11:40 AM, Laurent Petit lpe...@yseop.com wrote: Hello, Is there anything I can do to help qualify the problem even more ? Beyond having shown the source code of the servlet, would a fully mavenized example help? Anything else? Regards, -- Laurent On Fri, 2012-06-22 at 10:21 +0200, Laurent Petit wrote: Hello, On Thu, 2012-06-21 at 22:53 +0200, Jeff MAURY wrote: Is it specific to Wordpad or any launched process will do the trick ? Do you tried with a non UI process (console) ? I did an additional test, as you suggested, with a non UI process (a small java executable launched in headless mode, whose purpose was just to wait for 20 seconds before exiting). I can reproduce the problem with this headless executable: the HTTP client is blocked until the 20 seconds elapse and the process is killed. Here is the modified servlet code I used: https://www.refheap.com/paste/3285 and here is the code for the small java program: https://www.refheap.com/paste/3286 Regards, -- Laurent Jeff On Thu, Jun 21, 2012 at 10:45 PM, Laurent Petit lpe...@yseop.com wrote: En Réponse à Tomcat Users List users@tomcat.apache.org le 21 juin 2012 00:07 Can you verify your 2 threads (reading input an error) are launched ? Yes they are. Verified. Can you confirm you are getting the problem only on Windows ? Yes sir, we're unable to reproduce it on Ubuntu. Jeff On Wed, Jun 20, 2012 at 4:19 PM, Laurent Petit lpe...@yseop.com wrote: Hello, I have a problem with keep-alive connections, when starting a subprocess (via JDK's default ProcessBuilder/Process API), while also having started Tomcat with the APR HTTP/1.1 Connector. The problem symptom is with Keep-Alive connection, as follows: - the client (browser, jmeter, etc.) sends a first request - the servlet starts a Process for e.g. wordpad.exe - the servlet returns an acknowledgment html content, sets the content length, flushes the writer, and returns - the client displays the received acknowledgement html content, sends the second request to the server. - the server doesn't answer. No Tomcat log ever reports the start of something received. - Then when on the server you close the wordpad.exe instance, the server finally handles the second request. I have created a small servlet code which reproduces the problem. For the demo, it suffices to have the started subprocess be wordpad.exe. Of course my real process is more interesting than that :-). You can find the servlet code for reproducing the test here: https://www.refheap.com/paste/3254To reproduce the problem deterministically, the ConnectionTimeout for the APR HTTP Connector in servlet.xml must be set sufficiently low. With my boxes, I get a 100% error hit when set at 200 ms. You can find here the jmeter script which hits the same page again and again with keep-alive option set on: https://www.refheap.com/paste/3255So far, the only reliable solution we have found to work around this problem is to not use the HTP/1.1 APR Connector.My configuration : Windows 2008 US std R2 64bits Tomcat 6.0.32 64 bits Java 6u30 64 bits(Oracle) Same issue has been observed on Windows 7 32 bits. Was not able to reproduce the issue on Linux Ubuntu Desktop 11.10 or 12.04.Thanks for your support, ideas, solutions, etc. - To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org For additional commands, e-mail: users-h...@tomcat.apache.org -- Jeff MAURY Legacy code often differs from its suggested alternative by actually working and scaling. - Bjarne Stroustrup http://www.jeffmaury.com http://riadiscuss.jeffmaury.com http://www.twitter.com/jeffmaury -- Laurent Petit Agence +33 (0)4 78 47 07 49 Email lpe...@yseop.com Yseop apporte une réponse intelligente et individualisée à chacun de vos clients www.yseop.com - To unsubscribe, e-mail:
Re: Re : Re: Issue with keep-alive connections, when using APR Connector on Windows and starting Processes from Servlets
Hello Jeff al, Here it is, I've created a Git repository with the sources for the webapp the test (maven projects), and instructions in the README on how to reproduce the issue. https://github.com/lpetit-yseop/apr-test Hope this will help you get started on reproducing the problem, Regards, -- Laurent Petit On Mon, 2012-06-25 at 14:42 +0200, Jeff MAURY wrote: Yes, fine Jeff On Mon, Jun 25, 2012 at 1:46 PM, Laurent Petit lpe...@yseop.com wrote: On Mon, 2012-06-25 at 11:51 +0200, Jeff MAURY wrote: If you can post a Mavenized example, I could have time to run it and watch at it. Ok, thanks, I will. Is a mavenized project with source code published on github ok for you ? Regards Jeff On Mon, Jun 25, 2012 at 11:40 AM, Laurent Petit lpe...@yseop.com wrote: Hello, Is there anything I can do to help qualify the problem even more ? Beyond having shown the source code of the servlet, would a fully mavenized example help? Anything else? Regards, -- Laurent On Fri, 2012-06-22 at 10:21 +0200, Laurent Petit wrote: Hello, On Thu, 2012-06-21 at 22:53 +0200, Jeff MAURY wrote: Is it specific to Wordpad or any launched process will do the trick ? Do you tried with a non UI process (console) ? I did an additional test, as you suggested, with a non UI process (a small java executable launched in headless mode, whose purpose was just to wait for 20 seconds before exiting). I can reproduce the problem with this headless executable: the HTTP client is blocked until the 20 seconds elapse and the process is killed. Here is the modified servlet code I used: https://www.refheap.com/paste/3285 and here is the code for the small java program: https://www.refheap.com/paste/3286 Regards, -- Laurent Jeff On Thu, Jun 21, 2012 at 10:45 PM, Laurent Petit lpe...@yseop.com wrote: En Réponse à Tomcat Users List users@tomcat.apache.org le 21 juin 2012 00:07 Can you verify your 2 threads (reading input an error) are launched ? Yes they are. Verified. Can you confirm you are getting the problem only on Windows ? Yes sir, we're unable to reproduce it on Ubuntu. Jeff On Wed, Jun 20, 2012 at 4:19 PM, Laurent Petit lpe...@yseop.com wrote: Hello, I have a problem with keep-alive connections, when starting a subprocess (via JDK's default ProcessBuilder/Process API), while also having started Tomcat with the APR HTTP/1.1 Connector. The problem symptom is with Keep-Alive connection, as follows: - the client (browser, jmeter, etc.) sends a first request - the servlet starts a Process for e.g. wordpad.exe - the servlet returns an acknowledgment html content, sets the content length, flushes the writer, and returns - the client displays the received acknowledgement html content, sends the second request to the server. - the server doesn't answer. No Tomcat log ever reports the start of something received. - Then when on the server you close the wordpad.exe instance, the server finally handles the second request. I have created a small servlet code which reproduces the problem. For the demo, it suffices to have the started subprocess be wordpad.exe. Of course my real process is more interesting than that :-). You can find the servlet code for reproducing the test here: https://www.refheap.com/paste/3254To reproduce the problem deterministically, the ConnectionTimeout for the APR HTTP Connector in servlet.xml must be set sufficiently low. With my boxes, I get a 100% error hit when set at 200 ms. You can find here the jmeter script which hits the same page again and again with keep-alive option set on: https://www.refheap.com/paste/3255So far, the only reliable solution we have found to work around this problem is to not use the HTP/1.1 APR Connector.My configuration : Windows 2008 US std R2 64bits Tomcat 6.0.32 64 bits Java 6u30 64 bits(Oracle) Same issue has been observed on Windows 7 32 bits. Was not able to reproduce the issue on Linux Ubuntu Desktop 11.10 or 12.04.Thanks for your support, ideas, solutions, etc. - To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org For additional commands, e-mail: users-h...@tomcat.apache.org -- Jeff MAURY Legacy code often differs from its suggested
Re: Re : Re: Issue with keep-alive connections, when using APR Connector on Windows and starting Processes from Servlets
Von: Laurent Petit lpe...@yseop.com Datum: Mon, 25 Jun 2012 17:46:06 +0200 Hello Jeff al, Here it is, I've created a Git repository with the sources for the webapp the test (maven projects), and instructions in the README on how to reproduce the issue. https://github.com/lpetit-yseop/apr-test Hope this will help you get started on reproducing the problem, Regards, Hello, I also could reproduce the problem on WIndows 7 64 Bit with Java 1.7.0_05 (64-bit) and Tomcat 7.0.28, using TC Native 1.1.24. I also used a small connectionTimeout=200. What I can see is, that with a normal request (that doesn't start a new process), Tomcat processes the request, and after an inactivity timeout of 200 ms, the APR connector closes the TCP connection. When the browser makes another request, it does open a new connection for that request. However, when a request goes to a servlet that starts a new process, and the timeout of 200 ms occurs, the TCP connection is not closed - but Tomcat doesn't seem to read on it any more, so further requests sent on that TCP connection will never be processed. When the new process (wordpad.exe) is closed, the TCP connection will be aborted. Then, the browser probably establishes a new TCP connection and re-sends it request there, which is processed by Tomcat. Unfortunately, don't have any knowledge of programming native (C) programms using Windows APIs, so I can only make a guess: Could it be that some handles to files/sockets are inherited to the child process (wordpad.exe) when launched by Java's ProcessBuilder, which prevent the socket from being closed? E.g., when I launch a simple C app (which calls WaitForSingleObject(-1, 99)) from the Windows explorer, I can see 7 handles in the taskmanger; whereas when it is launched by the servlet in tomcat, Task manager shows 11 handles - but as said, I don't know if that has something to do with the problem. Regards, Konstantin Preißer - To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org For additional commands, e-mail: users-h...@tomcat.apache.org
Re: Re : Re: Issue with keep-alive connections, when using APR Connector on Windows and starting Processes from Servlets
Konstantin, your explanations are very interesting but unclear to me: what do you call the inactivity timer ? When it is started ? After the request has been processed by the servlet ? In that case, I see no difference between a servlet that launch a process and another one. It seems to me that a process that is launched does not inhererits handles from its parent process but it's possible that under Windows, it's an option so it would be interesting to watch. Jeff On Mon, Jun 25, 2012 at 6:23 PM, verlag.preis...@t-online.de verlag.preis...@t-online.de wrote: Von: Laurent Petit lpe...@yseop.com Datum: Mon, 25 Jun 2012 17:46:06 +0200 Hello Jeff al, Here it is, I've created a Git repository with the sources for the webapp the test (maven projects), and instructions in the README on how to reproduce the issue. https://github.com/lpetit-yseop/apr-test Hope this will help you get started on reproducing the problem, Regards, Hello, I also could reproduce the problem on WIndows 7 64 Bit with Java 1.7.0_05 (64-bit) and Tomcat 7.0.28, using TC Native 1.1.24. I also used a small connectionTimeout=200. What I can see is, that with a normal request (that doesn't start a new process), Tomcat processes the request, and after an inactivity timeout of 200 ms, the APR connector closes the TCP connection. When the browser makes another request, it does open a new connection for that request. However, when a request goes to a servlet that starts a new process, and the timeout of 200 ms occurs, the TCP connection is not closed - but Tomcat doesn't seem to read on it any more, so further requests sent on that TCP connection will never be processed. When the new process (wordpad.exe) is closed, the TCP connection will be aborted. Then, the browser probably establishes a new TCP connection and re-sends it request there, which is processed by Tomcat. Unfortunately, don't have any knowledge of programming native (C) programms using Windows APIs, so I can only make a guess: Could it be that some handles to files/sockets are inherited to the child process (wordpad.exe) when launched by Java's ProcessBuilder, which prevent the socket from being closed? E.g., when I launch a simple C app (which calls WaitForSingleObject(-1, 99)) from the Windows explorer, I can see 7 handles in the taskmanger; whereas when it is launched by the servlet in tomcat, Task manager shows 11 handles - but as said, I don't know if that has something to do with the problem. Regards, Konstantin Preißer - To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org For additional commands, e-mail: users-h...@tomcat.apache.org -- Jeff MAURY Legacy code often differs from its suggested alternative by actually working and scaling. - Bjarne Stroustrup http://www.jeffmaury.com http://riadiscuss.jeffmaury.com http://www.twitter.com/jeffmaury
Re: Re : Re: Issue with keep-alive connections, when using APR Connector on Windows and starting Processes from Servlets
Hello Jeff all, Von: Jeff MAURY jeffma...@jeffmaury.com Datum: Mon, 25 Jun 2012 18:46:02 +0200 Konstantin, your explanations are very interesting but unclear to me: what do you call the inactivity timer ? When it is started ? After the request has been processed by the servlet ? In that case, I see no difference between a servlet that launch a process and another one. It seems to me that a process that is launched does not inhererits handles from its parent process but it's possible that under Windows, it's an option so it would be interesting to watch. Jeff Sorry, I'm just a normal Tomcat user, and I don't know how exactly the APR connector and its Timeout works, so I am unable to answer that. Howewer, I did some further observations: -When I perform a request to the servlet that opens wordpad.exe, the TCP connection from Tomcat does not close after the timeout - even when I kill the Tomcat process (java.exe), the TCP connection is still open. If I kill wordpad.exe, then finally the connection is closed/aborted. -When I have 1 TCP connection open to Tomcat and the servlet starts the little C program, Task manager shows that it has 11 handles. However, when I have 5 TCP connections open to Tomcat, and do the request on one of them, Task maanger shows that the C program has 15 handles - so four more handles when there are four more connections to Tomcat. All of that 5 TCP connections don't close until I kill that process. That seems to me to be an indication that socket handles could be inherited by the child processes that are startet by ProcessBuilder from tomcat. A msdn article mentions how to create a new process using CreateProcess(); it also mentions that socket handles can be inherited: http://msdn.microsoft.com/en-us/library/windows/desktop/ms724466.aspx However, as I don't have much knowledge about programming with WinAPIs, I don't know why those handles are inherited (the MSDN article mentions that a handle must be specified as inheritable when created, to allow a child process to inherit it). Maybe someone with more WinAPI/Tomcat Native knowledge can help here. Regards, Konstantin Preißer - To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org For additional commands, e-mail: users-h...@tomcat.apache.org
Re: Re : Re: Issue with keep-alive connections, when using APR Connector on Windows and starting Processes from Servlets
Hello, On Thu, 2012-06-21 at 22:53 +0200, Jeff MAURY wrote: Is it specific to Wordpad or any launched process will do the trick ? Do you tried with a non UI process (console) ? I did an additional test, as you suggested, with a non UI process (a small java executable launched in headless mode, whose purpose was just to wait for 20 seconds before exiting). I can reproduce the problem with this headless executable: the HTTP client is blocked until the 20 seconds elapse and the process is killed. Here is the modified servlet code I used: https://www.refheap.com/paste/3285 and here is the code for the small java program: https://www.refheap.com/paste/3286 Regards, -- Laurent Jeff On Thu, Jun 21, 2012 at 10:45 PM, Laurent Petit lpe...@yseop.com wrote: En Réponse à Tomcat Users List users@tomcat.apache.org le 21 juin 2012 00:07 Can you verify your 2 threads (reading input an error) are launched ? Yes they are. Verified. Can you confirm you are getting the problem only on Windows ? Yes sir, we're unable to reproduce it on Ubuntu. Jeff On Wed, Jun 20, 2012 at 4:19 PM, Laurent Petit lpe...@yseop.com wrote: Hello, I have a problem with keep-alive connections, when starting a subprocess (via JDK's default ProcessBuilder/Process API), while also having started Tomcat with the APR HTTP/1.1 Connector. The problem symptom is with Keep-Alive connection, as follows: - the client (browser, jmeter, etc.) sends a first request - the servlet starts a Process for e.g. wordpad.exe - the servlet returns an acknowledgment html content, sets the content length, flushes the writer, and returns - the client displays the received acknowledgement html content, sends the second request to the server. - the server doesn't answer. No Tomcat log ever reports the start of something received. - Then when on the server you close the wordpad.exe instance, the server finally handles the second request. I have created a small servlet code which reproduces the problem. For the demo, it suffices to have the started subprocess be wordpad.exe. Of course my real process is more interesting than that :-). You can find the servlet code for reproducing the test here: https://www.refheap.com/paste/3254To reproduce the problem deterministically, the ConnectionTimeout for the APR HTTP Connector in servlet.xml must be set sufficiently low. With my boxes, I get a 100% error hit when set at 200 ms. You can find here the jmeter script which hits the same page again and again with keep-alive option set on: https://www.refheap.com/paste/3255So far, the only reliable solution we have found to work around this problem is to not use the HTP/1.1 APR Connector.My configuration : Windows 2008 US std R2 64bits Tomcat 6.0.32 64 bits Java 6u30 64 bits(Oracle) Same issue has been observed on Windows 7 32 bits. Was not able to reproduce the issue on Linux Ubuntu Desktop 11.10 or 12.04.Thanks for your support, ideas, solutions, etc. - To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org For additional commands, e-mail: users-h...@tomcat.apache.org -- Jeff MAURY Legacy code often differs from its suggested alternative by actually working and scaling. - Bjarne Stroustrup http://www.jeffmaury.com http://riadiscuss.jeffmaury.com http://www.twitter.com/jeffmaury -- Laurent Petit Agence +33 (0)4 78 47 07 49 Email lpe...@yseop.com Yseop apporte une réponse intelligente et individualisée à chacun de vos clients www.yseop.com - To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org For additional commands, e-mail: users-h...@tomcat.apache.org
Re : Re: Issue with keep-alive connections, when using APR Connector on Windows and starting Processes from Servlets
En Réponse à Tomcat Users List users@tomcat.apache.org le 21 juin 2012 00:07 Can you verify your 2 threads (reading input an error) are launched ? Yes they are. Verified. Can you confirm you are getting the problem only on Windows ? Yes sir, we're unable to reproduce it on Ubuntu. Jeff On Wed, Jun 20, 2012 at 4:19 PM, Laurent Petit lpe...@yseop.com wrote: Hello, I have a problem with keep-alive connections, when starting a subprocess (via JDK's default ProcessBuilder/Process API), while also having started Tomcat with the APR HTTP/1.1 Connector. The problem symptom is with Keep-Alive connection, as follows: - the client (browser, jmeter, etc.) sends a first request - the servlet starts a Process for e.g. wordpad.exe - the servlet returns an acknowledgment html content, sets the content length, flushes the writer, and returns - the client displays the received acknowledgement html content, sends the second request to the server. - the server doesn't answer. No Tomcat log ever reports the start of something received. - Then when on the server you close the wordpad.exe instance, the server finally handles the second request. I have created a small servlet code which reproduces the problem. For the demo, it suffices to have the started subprocess be wordpad.exe. Of course my real process is more interesting than that :-). You can find the servlet code for reproducing the test here: https://www.refheap.com/paste/3254To reproduce the problem deterministically, the ConnectionTimeout for the APR HTTP Connector in servlet.xml must be set sufficiently low. With my boxes, I get a 100% error hit when set at 200 ms. You can find here the jmeter script which hits the same page again and again with keep-alive option set on: https://www.refheap.com/paste/3255So far, the only reliable solution we have found to work around this problem is to not use the HTP/1.1 APR Connector.My configuration : Windows 2008 US std R2 64bits Tomcat 6.0.32 64 bits Java 6u30 64 bits(Oracle) Same issue has been observed on Windows 7 32 bits. Was not able to reproduce the issue on Linux Ubuntu Desktop 11.10 or 12.04.Thanks for your support, ideas, solutions, etc. - To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org For additional commands, e-mail: users-h...@tomcat.apache.org -- Jeff MAURY Legacy code often differs from its suggested alternative by actually working and scaling. - Bjarne Stroustrup http://www.jeffmaury.com http://riadiscuss.jeffmaury.com http://www.twitter.com/jeffmaury
Re: Re : Re: Issue with keep-alive connections, when using APR Connector on Windows and starting Processes from Servlets
Is it specific to Wordpad or any launched process will do the trick ? Do you tried with a non UI process (console) ? Jeff On Thu, Jun 21, 2012 at 10:45 PM, Laurent Petit lpe...@yseop.com wrote: En Réponse à Tomcat Users List users@tomcat.apache.org le 21 juin 2012 00:07 Can you verify your 2 threads (reading input an error) are launched ? Yes they are. Verified. Can you confirm you are getting the problem only on Windows ? Yes sir, we're unable to reproduce it on Ubuntu. Jeff On Wed, Jun 20, 2012 at 4:19 PM, Laurent Petit lpe...@yseop.com wrote: Hello, I have a problem with keep-alive connections, when starting a subprocess (via JDK's default ProcessBuilder/Process API), while also having started Tomcat with the APR HTTP/1.1 Connector. The problem symptom is with Keep-Alive connection, as follows: - the client (browser, jmeter, etc.) sends a first request - the servlet starts a Process for e.g. wordpad.exe - the servlet returns an acknowledgment html content, sets the content length, flushes the writer, and returns - the client displays the received acknowledgement html content, sends the second request to the server. - the server doesn't answer. No Tomcat log ever reports the start of something received. - Then when on the server you close the wordpad.exe instance, the server finally handles the second request. I have created a small servlet code which reproduces the problem. For the demo, it suffices to have the started subprocess be wordpad.exe. Of course my real process is more interesting than that :-). You can find the servlet code for reproducing the test here: https://www.refheap.com/paste/3254To reproduce the problem deterministically, the ConnectionTimeout for the APR HTTP Connector in servlet.xml must be set sufficiently low. With my boxes, I get a 100% error hit when set at 200 ms. You can find here the jmeter script which hits the same page again and again with keep-alive option set on: https://www.refheap.com/paste/3255So far, the only reliable solution we have found to work around this problem is to not use the HTP/1.1 APR Connector.My configuration : Windows 2008 US std R2 64bits Tomcat 6.0.32 64 bits Java 6u30 64 bits(Oracle) Same issue has been observed on Windows 7 32 bits. Was not able to reproduce the issue on Linux Ubuntu Desktop 11.10 or 12.04.Thanks for your support, ideas, solutions, etc. - To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org For additional commands, e-mail: users-h...@tomcat.apache.org -- Jeff MAURY Legacy code often differs from its suggested alternative by actually working and scaling. - Bjarne Stroustrup http://www.jeffmaury.com http://riadiscuss.jeffmaury.com http://www.twitter.com/jeffmaury -- Jeff MAURY Legacy code often differs from its suggested alternative by actually working and scaling. - Bjarne Stroustrup http://www.jeffmaury.com http://riadiscuss.jeffmaury.com http://www.twitter.com/jeffmaury
Issue with keep-alive connections, when using APR Connector on Windows and starting Processes from Servlets
Hello, I have a problem with keep-alive connections, when starting a subprocess (via JDK's default ProcessBuilder/Process API), while also having started Tomcat with the APR HTTP/1.1 Connector. The problem symptom is with Keep-Alive connection, as follows: - the client (browser, jmeter, etc.) sends a first request - the servlet starts a Process for e.g. wordpad.exe - the servlet returns an acknowledgment html content, sets the content length, flushes the writer, and returns - the client displays the received acknowledgement html content, sends the second request to the server. - the server doesn't answer. No Tomcat log ever reports the start of something received. - Then when on the server you close the wordpad.exe instance, the server finally handles the second request. I have created a small servlet code which reproduces the problem. For the demo, it suffices to have the started subprocess be wordpad.exe. Of course my real process is more interesting than that :-). You can find the servlet code for reproducing the test here: https://www.refheap.com/paste/3254 To reproduce the problem deterministically, the ConnectionTimeout for the APR HTTP Connector in servlet.xml must be set sufficiently low. With my boxes, I get a 100% error hit when set at 200 ms. You can find here the jmeter script which hits the same page again and again with keep-alive option set on: https://www.refheap.com/paste/3255 So far, the only reliable solution we have found to work around this problem is to not use the HTP/1.1 APR Connector. My configuration : Windows 2008 US std R2 64bits Tomcat 6.0.32 64 bits Java 6u30 64 bits(Oracle) Same issue has been observed on Windows 7 32 bits. Was not able to reproduce the issue on Linux Ubuntu Desktop 11.10 or 12.04. Thanks for your support, ideas, solutions, etc. - To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org For additional commands, e-mail: users-h...@tomcat.apache.org
Re: Issue with keep-alive connections, when using APR Connector on Windows and starting Processes from Servlets
Can you verify your 2 threads (reading input an error) are launched ? Can you confirm you are getting the problem only on Windows ? Jeff On Wed, Jun 20, 2012 at 4:19 PM, Laurent Petit lpe...@yseop.com wrote: Hello, I have a problem with keep-alive connections, when starting a subprocess (via JDK's default ProcessBuilder/Process API), while also having started Tomcat with the APR HTTP/1.1 Connector. The problem symptom is with Keep-Alive connection, as follows: - the client (browser, jmeter, etc.) sends a first request - the servlet starts a Process for e.g. wordpad.exe - the servlet returns an acknowledgment html content, sets the content length, flushes the writer, and returns - the client displays the received acknowledgement html content, sends the second request to the server. - the server doesn't answer. No Tomcat log ever reports the start of something received. - Then when on the server you close the wordpad.exe instance, the server finally handles the second request. I have created a small servlet code which reproduces the problem. For the demo, it suffices to have the started subprocess be wordpad.exe. Of course my real process is more interesting than that :-). You can find the servlet code for reproducing the test here: https://www.refheap.com/paste/3254 To reproduce the problem deterministically, the ConnectionTimeout for the APR HTTP Connector in servlet.xml must be set sufficiently low. With my boxes, I get a 100% error hit when set at 200 ms. You can find here the jmeter script which hits the same page again and again with keep-alive option set on: https://www.refheap.com/paste/3255 So far, the only reliable solution we have found to work around this problem is to not use the HTP/1.1 APR Connector. My configuration : Windows 2008 US std R2 64bits Tomcat 6.0.32 64 bits Java 6u30 64 bits(Oracle) Same issue has been observed on Windows 7 32 bits. Was not able to reproduce the issue on Linux Ubuntu Desktop 11.10 or 12.04. Thanks for your support, ideas, solutions, etc. - To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org For additional commands, e-mail: users-h...@tomcat.apache.org -- Jeff MAURY Legacy code often differs from its suggested alternative by actually working and scaling. - Bjarne Stroustrup http://www.jeffmaury.com http://riadiscuss.jeffmaury.com http://www.twitter.com/jeffmaury