[Jboss-cvs] JBoss Messaging SVN: r1328 - in branches/Branch_1_0: src/main/org/jboss/messaging/core/local tests/bin

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Wed Sep 20 17:10:52 EDT 2006


Author: ovidiu.feodorov at jboss.com
Date: 2006-09-20 17:10:48 -0400 (Wed, 20 Sep 2006)
New Revision: 1328

Modified:
   branches/Branch_1_0/src/main/org/jboss/messaging/core/local/FirstReceiverPointToPointRouter.java
   branches/Branch_1_0/src/main/org/jboss/messaging/core/local/SingleDestinationRouter.java
   branches/Branch_1_0/tests/bin/loop
Log:
fix for http://jira.jboss.org/jira/browse/JBMESSAGING-546 deadlock

Modified: branches/Branch_1_0/src/main/org/jboss/messaging/core/local/FirstReceiverPointToPointRouter.java
===================================================================
--- branches/Branch_1_0/src/main/org/jboss/messaging/core/local/FirstReceiverPointToPointRouter.java	2006-09-20 18:51:00 UTC (rev 1327)
+++ branches/Branch_1_0/src/main/org/jboss/messaging/core/local/FirstReceiverPointToPointRouter.java	2006-09-20 21:10:48 UTC (rev 1328)
@@ -26,6 +26,7 @@
 import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
+import java.util.Collections;
 
 import org.jboss.logging.Logger;
 import org.jboss.messaging.core.Delivery;
@@ -74,44 +75,56 @@
 
    public Set handle(DeliveryObserver observer, Routable routable, Transaction tx)
    {
+      ArrayList receiversCopy;
+
+      synchronized(receivers)
+      {
+         if (receivers.isEmpty())
+         {
+            return Collections.EMPTY_SET;
+         }
+
+         // try to release the lock as quickly as possible and make a copy of the receivers array
+         // to avoid deadlock
+
+         receiversCopy = new ArrayList(receivers.size());
+         receiversCopy.addAll(receivers);
+      }
+
       Set deliveries = new HashSet();
-      
       boolean selectorRejected = false;
-      
-      synchronized(receivers)
+
+      for(Iterator i = receiversCopy.iterator(); i.hasNext(); )
       {
-         for(Iterator i = receivers.iterator(); i.hasNext(); )
+         Receiver receiver = (Receiver)i.next();
+
+         try
          {
-            Receiver receiver = (Receiver)i.next();
-            
-            try
+            Delivery d = receiver.handle(observer, routable, tx);
+
+            if (trace) { log.trace("receiver " + receiver + " handled " + routable + " and returned " + d); }
+
+            if (d != null && !d.isCancelled())
             {
-               Delivery d = receiver.handle(observer, routable, tx);
-
-               if (trace) { log.trace("receiver " + receiver + " handled " + routable + " and returned " + d); }
-     
-               if (d != null && !d.isCancelled())
+               if (d.isSelectorAccepted())
                {
-                  if (d.isSelectorAccepted())
-                  {
-                     // deliver to the first receiver that accepts
-                     deliveries.add(d);
-                     break;
-                  }
-                  else
-                  {
-                     selectorRejected = true;
-                  }
+                  // deliver to the first receiver that accepts
+                  deliveries.add(d);
+                  break;
                }
+               else
+               {
+                  selectorRejected = true;
+               }
             }
-            catch(Throwable t)
-            {
-               // broken receiver - log the exception and ignore it
-               log.error("The receiver " + receiver + " is broken", t);
-            }
          }
+         catch(Throwable t)
+         {
+            // broken receiver - log the exception and ignore it
+            log.error("The receiver " + receiver + " is broken", t);
+         }
       }
-      
+
       if (deliveries.isEmpty() && selectorRejected)
       {
          deliveries.add(new SimpleDelivery(null, null, true, false));

Modified: branches/Branch_1_0/src/main/org/jboss/messaging/core/local/SingleDestinationRouter.java
===================================================================
--- branches/Branch_1_0/src/main/org/jboss/messaging/core/local/SingleDestinationRouter.java	2006-09-20 18:51:00 UTC (rev 1327)
+++ branches/Branch_1_0/src/main/org/jboss/messaging/core/local/SingleDestinationRouter.java	2006-09-20 21:10:48 UTC (rev 1328)
@@ -58,19 +58,26 @@
 
    // Router implementation -----------------------------------------
 
-   public synchronized Set handle(DeliveryObserver observer, Routable routable, Transaction tx)
+   public Set handle(DeliveryObserver observer, Routable routable, Transaction tx)
    {
-      
-      
-      if (receiver == null)
+      Receiver receiverCopy;
+
+      synchronized(this)
       {
-         return Collections.EMPTY_SET;
+         if (receiver == null)
+         {
+            return Collections.EMPTY_SET;
+         }
+
+         // try to release the lock as quickly as possible and make a local copy of the receiver's
+         // reference, to avoid deadlock (http://jira.jboss.org/jira/browse/JBMESSAGING-546)
+         receiverCopy = receiver;
       }
 
       Set deliveries = new HashSet(1);
       try
       {
-         Delivery d = receiver.handle(observer, routable, tx);
+         Delivery d = receiverCopy.handle(observer, routable, tx);
          
          if (d != null && !d.isCancelled())
          {
@@ -80,7 +87,7 @@
       catch(Throwable t)
       {
          // broken receiver - log the exception and ignore it
-         log.error("The receiver " + receiver + " is broken" + t);
+         log.error("The receiver " + receiverCopy + " is broken" + t);
       }
       return deliveries;
    }

Modified: branches/Branch_1_0/tests/bin/loop
===================================================================
--- branches/Branch_1_0/tests/bin/loop	2006-09-20 18:51:00 UTC (rev 1327)
+++ branches/Branch_1_0/tests/bin/loop	2006-09-20 21:10:48 UTC (rev 1328)
@@ -1,7 +1,7 @@
 #!/bin/sh
 
 
-count=500
+count=5000
 i=0
 
 while [ $i -lt $count ]; do




More information about the jboss-cvs-commits mailing list