[jboss-jira] [JBoss JIRA] Created: (JGRP-536) Catching InterruptedException and setting interrupt bit in a loop might cause infinite loop

Bela Ban (JIRA) jira-events at lists.jboss.org
Fri Jun 15 07:32:11 EDT 2007


Catching InterruptedException and setting interrupt bit in a loop might cause infinite loop
-------------------------------------------------------------------------------------------

                 Key: JGRP-536
                 URL: http://jira.jboss.com/jira/browse/JGRP-536
             Project: JGroups
          Issue Type: Bug
            Reporter: Bela Ban
         Assigned To: Bela Ban
             Fix For: 2.4.1 SP4, 2.5


FC.handleDownMessage() has the following code:
                    while(length > lowest_credit && running) {
                        try {
                            boolean rc=credits_available.await(max_block_time, TimeUnit.MILLISECONDS);
                            if(rc || length <= lowest_credit || !running)
                                break;

                            long wait_time=System.currentTimeMillis() - last_credit_request;
                            if(wait_time >= max_block_time) {

                                // we have to set this var now, because we release the lock below (for sending a
                                // credit request), so all blocked threads would send a credit request, leading to
                                // a credit request storm
                                last_credit_request=System.currentTimeMillis();

                                // we need to send the credit requests down *without* holding the sent_lock, otherwise we might
                                // run into the deadlock described in http://jira.jboss.com/jira/browse/JGRP-292
                                Map<Address,Long> sent_copy=new HashMap<Address,Long>(sent);
                                sent_copy.keySet().retainAll(creditors);
                                sent_lock.unlock();
                                try {
                                    // System.out.println(new Date() + " --> credit request");
                                    for(Map.Entry<Address,Long> entry: sent_copy.entrySet()) {
                                        sendCreditRequest(entry.getKey(), entry.getValue());
                                    }
                                }
                                finally {
                                    sent_lock.lock();
                                }
                            }
                        }
                        catch(InterruptedException e) {
                            // set the interrupted flag again, so the caller's thread can handle the interrupt as well
                            Thread.currentThread().interrupt();
                        }
                    }


So if the thread is interrupted, unless 

length < lowest_credit || !running,

we will have an infinite loop !

SOLUTION: we cannot set the interrupt flag again, because we *don't* return from the loop !



-- 
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