[jboss-jira] [JBoss JIRA] Resolved: (JGRP-246) FD_SOCK thread "leak"

Bela Ban (JIRA) jira-events at jboss.com
Tue Aug 8 11:17:13 EDT 2006


     [ http://jira.jboss.com/jira/browse/JGRP-246?page=all ]

Bela Ban resolved JGRP-246.
---------------------------

    Resolution: Done

applied patch

> FD_SOCK thread "leak"
> ---------------------
>
>                 Key: JGRP-246
>                 URL: http://jira.jboss.com/jira/browse/JGRP-246
>             Project: JGroups
>          Issue Type: Bug
>    Affects Versions: 2.2.8, 2.2.9, 2.3, 2.2.9.1, 2.2.9.2
>         Environment: SLES 9
>            Reporter: Bruce Schuchardt
>         Assigned To: Bela Ban
>            Priority: Minor
>             Fix For: 2.4
>
>
> While investigating a startup problem in an application that has one long-running group member and four other VMs that frequently close their channels and create new ones, I found that the long-running member was piling up a lot of FD_SOCK ClientConnectionHandler threads.  When a channel is closed, FD_SOCK closes the socket that ClientConnectionHandler's socket is connected to, but on some operating systems (SLES 9 in this case) this doesn't always cause a socket.read() to exit.  All of the ClientConnectionHandler sockets were stuck in this state.
> I added a write(NORMAL_TERMINATION) before closing the socket, and changed ClientConnectionHandler to look for NORMAL_TERMINATION, and that seems to correct the problem.
>  
>     void stopPingerThread() {
>         if(pinger_thread != null && pinger_thread.isAlive()) {
>             regular_sock_close=true;
>             sendPingTermination(); // PATCH
>             teardownPingSocket();
>         }
>         pinger_thread=null;
>     }
>     
>     // PATCH: send something so the connection handler can exit
>     synchronized void sendPingTermination() {
>       if (ping_sock != null) {
>         try {
>           ping_sock.getOutputStream().write(NORMAL_TERMINATION);
>           ping_sock.getOutputStream().flush();
>         }
>         catch (java.io.IOException ie) {
>           if (trace)
>             log.trace("FD_SOCK io exception sending ping termination", ie);
>         }
>       }
>     }
>     void interruptPingerThread() {
>         if(pinger_thread != null && pinger_thread.isAlive()) {
>             regular_sock_close=true;
>             sendPingTermination();  // PATCH
>             teardownPingSocket(); // will wake up the pinger thread. less elegant than Thread.interrupt(), but does the job
>         }
>     }
> ClientConnectionHandler
>         public void run() {
>             try {
>                 synchronized(mutex) {
>                     if(client_sock == null)
>                         return;
>                     in=client_sock.getInputStream();
>                 }
>                 // PATCH STARTS HERE
>                 int b = 0;
>                 do {
>                   b = in.read();
>                 }
>                 while ( b != ABNORMAL_TERMINATION  && b != NORMAL_TERMINATION);
>                 // END OF PATCH
>             }
>             catch(IOException io_ex1) {
>             }
>             finally {
>                 Socket sock = client_sock;   // PATCH: avoid race condition causing NPE
>                 if (sock != null && !sock.isClosed())
>                   closeClientSocket();
>                 synchronized(clients) {
>                     clients.remove(this);
>                 }
>             }
>         }
>     }

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://jira.jboss.com/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        



More information about the jboss-jira mailing list