Re: [jgroups-dev] ConnectionTableNIO
Bela Ban <[email protected]>
| Newsgroups | gmane.comp.java.javagroups.devel |
|---|---|
| Message-ID | <[email protected]> |
Thanks for pointing this out; I made the method closeSocket()
synchronized. I want to change this whole code anyway in the
not-so-distant future...
Rob Eden wrote:
> Hi all -
>
> There is a race condition in ConnectionTableNIO that results in a null
> pointer if timed just right (we actually seem to be hitting it quite a
> bit).
>
> The closeSocket() method looks like this (comment added by me):
>
> void closeSocket()
> {
>
> if (sock_ch != null)
> {
> try
> {
> // sock_ch can be null here!!!
> if(sock_ch.isConnected() && sock_ch.isOpen()) {
> sock_ch.close();
> }
> }
> catch (Exception e)
> {
> log.error("error closing socket connection", e);
> }
> sock_ch = null;
> }
> }
>
> The problem occurs when sock_ch is nulled out in between the original
> null check and the calls to isConnected and isOpen. There are a couple
> ways to fix the problem, including simply synchronizing the
> closeSocket() method. However, a better (lock-free) solution might be
> to change sock_ch to an AtomicReference. Then the closeSocket() method
> becomes:
>
> void closeSocket()
> {
> final SocketChannel sock_ch = this.sock_ch.get();
> if (sock_ch != null)
> {
> try
> {
> if(sock_ch.isConnected() && sock_ch.isOpen()) {
> sock_ch.close();
> }
> }
> catch (Exception e)
> {
> log.error("error closing socket connection", e);
> }
> this.sock_ch.compareAndSet( sock_ch, null );
> }
> }
>
> Rob
> ------------------------------------------------------------------------
>
> ------------------------------------------------------------------------------
> ThinkGeek and WIRED's GeekDad team up for the Ultimate
> GeekDad Father's Day Giveaway. ONE MASSIVE PRIZE to the
> lucky parental unit. See the prize list and enter to win:
> http://p.sf.net/sfu/thinkgeek-promo
> ------------------------------------------------------------------------
>
> _______________________________________________
> Javagroups-development mailing list
>
>
--
Bela Ban
Lead JGroups / JBoss Clustering team
JBoss - a division of Red Hat
------------------------------------------------------------------------------
ThinkGeek and WIRED's GeekDad team up for the Ultimate
GeekDad Father's Day Giveaway. ONE MASSIVE PRIZE to the
lucky parental unit. See the prize list and enter to win:
http://p.sf.net/sfu/thinkgeek-promo
_______________________________________________
Javagroups-development mailing list