[exo-jcr-commits] exo-jcr SVN: r1872 - jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/session.

do-not-reply at jboss.org do-not-reply at jboss.org
Wed Feb 17 10:50:13 EST 2010


Author: tolusha
Date: 2010-02-17 10:50:13 -0500 (Wed, 17 Feb 2010)
New Revision: 1872

Modified:
   jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/session/TransactionableResourceManager.java
Log:
EXOJCR-115: avoid synchronized blocks

Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/session/TransactionableResourceManager.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/session/TransactionableResourceManager.java	2010-02-17 15:00:00 UTC (rev 1871)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/session/TransactionableResourceManager.java	2010-02-17 15:50:13 UTC (rev 1872)
@@ -22,13 +22,9 @@
 import org.exoplatform.services.transaction.TransactionException;
 
 import java.lang.ref.SoftReference;
-import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.Iterator;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentLinkedQueue;
 
 import javax.transaction.xa.XAException;
 
@@ -54,8 +50,8 @@
    /**
     * XASessions involved in transaction. Sessions stored by userId.
     */
-   private Map<String, List<SoftReference<XASessionImpl>>> txResources =
-      new HashMap<String, List<SoftReference<XASessionImpl>>>();
+   private ConcurrentHashMap<String, ConcurrentLinkedQueue<SoftReference<XASessionImpl>>> txResources =
+      new ConcurrentHashMap<String, ConcurrentLinkedQueue<SoftReference<XASessionImpl>>>();
 
    /**
     * TransactionableResourceManager constructor.
@@ -70,9 +66,9 @@
     * @param userSession
     *          XASessionImpl, user XASession
     */
-   synchronized public void add(XASessionImpl userSession)
+   public void add(XASessionImpl userSession)
    {
-      final List<SoftReference<XASessionImpl>> joinedList = txResources.get(userSession.getUserID());
+      final ConcurrentLinkedQueue<SoftReference<XASessionImpl>> joinedList = txResources.get(userSession.getUserID());
       if (joinedList != null)
       {
          // remove unused session from user list and put this list at the end
@@ -95,8 +91,10 @@
       else
       {
          // sync for same userId operations
-         final List<SoftReference<XASessionImpl>> newJoinedList = new ArrayList<SoftReference<XASessionImpl>>();
-         final List<SoftReference<XASessionImpl>> previous = putIfAbsent(userSession.getUserID(), newJoinedList);
+         final ConcurrentLinkedQueue<SoftReference<XASessionImpl>> newJoinedList =
+            new ConcurrentLinkedQueue<SoftReference<XASessionImpl>>();
+         final ConcurrentLinkedQueue<SoftReference<XASessionImpl>> previous =
+            putIfAbsent(userSession.getUserID(), newJoinedList);
          if (previous != null)
          {
             previous.add(new SoftReference<XASessionImpl>(userSession));
@@ -114,9 +112,9 @@
     * @param userSession
     *          XASessionImpl, user XASession
     */
-   synchronized public void remove(XASessionImpl userSession)
+   public void remove(XASessionImpl userSession)
    {
-      final List<SoftReference<XASessionImpl>> joinedList = txResources.get(userSession.getUserID());
+      final ConcurrentLinkedQueue<SoftReference<XASessionImpl>> joinedList = txResources.get(userSession.getUserID());
       if (joinedList != null)
       {
          // traverse and remove unused sessions and given one
@@ -146,9 +144,9 @@
     * @throws TransactionException
     *           Transaction error
     */
-   synchronized public void commit(XASessionImpl userSession, boolean onePhase) throws TransactionException
+   public void commit(XASessionImpl userSession, boolean onePhase) throws TransactionException
    {
-      List<SoftReference<XASessionImpl>> joinedList;
+      ConcurrentLinkedQueue<SoftReference<XASessionImpl>> joinedList;
       if (onePhase)
       {
          joinedList = txResources.remove(userSession.getUserID());
@@ -161,17 +159,19 @@
 
       if (joinedList != null)
       {
-         int i = 0;
+         Iterator<SoftReference<XASessionImpl>> it = joinedList.iterator();
+         boolean hasCommitedXASession = false;
          try
          {
-            while (i < joinedList.size())
+            while (it.hasNext())
             {
-               SoftReference<XASessionImpl> sr = joinedList.get(i++);
+               SoftReference<XASessionImpl> sr = it.next();
                XASessionImpl xaSession = sr.get();
                if (xaSession != null && xaSession.isLive())
                {
                   xaSession.getTransientNodesManager().getTransactManager().commit();
                }
+               hasCommitedXASession = true;
             }
          }
          catch (TransactionException e)
@@ -179,18 +179,17 @@
             if (onePhase)
             {
                // rollback now
-               boolean mixedCommit = i > 0;
-               for (; i < joinedList.size(); i++)
+               while (it.hasNext())
                {
-                  SoftReference<XASessionImpl> sr = joinedList.get(i);
+                  SoftReference<XASessionImpl> sr = it.next();
                   XASessionImpl xaSession = sr.get();
                   if (xaSession != null && xaSession.isLive())
                   {
                      xaSession.getTransientNodesManager().getTransactManager().rollback();
                   }
                }
-               
-               if (mixedCommit)
+
+               if (hasCommitedXASession)
                {
                   // somethings were commited already
                   throw new TransactionException(XAException.XA_HEURMIX, e);
@@ -213,9 +212,9 @@
     * @param userSession
     *          XASessionImpl, start initializing session
     */
-   synchronized public void start(XASessionImpl userSession)
+   public void start(XASessionImpl userSession)
    {
-      List<SoftReference<XASessionImpl>> joinedList = txResources.get(userSession.getUserID());
+      ConcurrentLinkedQueue<SoftReference<XASessionImpl>> joinedList = txResources.get(userSession.getUserID());
       if (joinedList != null)
       {
          for (SoftReference<XASessionImpl> sr : joinedList)
@@ -236,9 +235,9 @@
     * @param userSession
     *          XASessionImpl, rollback initializing session
     */
-   synchronized public void rollback(XASessionImpl userSession)
+   public void rollback(XASessionImpl userSession)
    {
-      List<SoftReference<XASessionImpl>> joinedList = txResources.remove(userSession.getUserID());
+      ConcurrentLinkedQueue<SoftReference<XASessionImpl>> joinedList = txResources.remove(userSession.getUserID());
       if (joinedList != null)
       {
          for (SoftReference<XASessionImpl> sr : joinedList)
@@ -253,7 +252,8 @@
       }
    }
 
-   private List<SoftReference<XASessionImpl>> putIfAbsent(String key, List<SoftReference<XASessionImpl>> value)
+   private ConcurrentLinkedQueue<SoftReference<XASessionImpl>> putIfAbsent(String key,
+      ConcurrentLinkedQueue<SoftReference<XASessionImpl>> value)
    {
       if (!txResources.containsKey(key))
       {



More information about the exo-jcr-commits mailing list