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

do-not-reply at jboss.org do-not-reply at jboss.org
Wed Jul 7 01:50:36 EDT 2010


Author: tolusha
Date: 2010-07-07 01:50:36 -0400 (Wed, 07 Jul 2010)
New Revision: 2746

Modified:
   jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/LinkedWorkspaceStorageCacheImpl.java
Log:
EXOJCR-840: avoid java.util.ConcurrentModificationException in LinkedWorkspaceStorageCacheImpl.onSaveItems()

Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/LinkedWorkspaceStorageCacheImpl.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/LinkedWorkspaceStorageCacheImpl.java	2010-07-06 10:31:07 UTC (rev 2745)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/LinkedWorkspaceStorageCacheImpl.java	2010-07-07 05:50:36 UTC (rev 2746)
@@ -563,6 +563,7 @@
     */
    class CleanerTask extends WorkerTask
    {
+      @Override
       public void run()
       {
          if (currentWorker == null || currentWorker.done)
@@ -582,6 +583,7 @@
     */
    class StatisticTask extends WorkerTask
    {
+      @Override
       public void run()
       {
          if (currentWorker == null || currentWorker.done)
@@ -1784,33 +1786,41 @@
                   // delete parent containing child nodes list
                   nodesCache.remove(parent.getParentIdentifier());
 
-                  // traverse itemCache
-                  Iterator<CacheValue> cacheIterator = cache.values().iterator();
-                  while (cacheIterator.hasNext())
+                  writeLock.lock();
+                  try
                   {
-                     ItemData cachedItem = cacheIterator.next().getItem();
-                     if (cachedItem.isNode())
+                     // traverse itemCache
+                     Iterator<CacheValue> cacheIterator = cache.values().iterator();
+                     while (cacheIterator.hasNext())
                      {
-                        if (cachedItem.getQPath().isDescendantOf(parent.getQPath()))
+                        ItemData cachedItem = cacheIterator.next().getItem();
+                        if (cachedItem.isNode())
                         {
-                           cacheIterator.remove();
+                           if (cachedItem.getQPath().isDescendantOf(parent.getQPath()))
+                           {
+                              cacheIterator.remove();
+                           }
                         }
                      }
-                  }
 
-                  // traverse child node Cache
-                  Iterator<List<NodeData>> childNodesIterator = nodesCache.values().iterator();
-                  while (childNodesIterator.hasNext())
-                  {
-                     List<NodeData> list = childNodesIterator.next();
-                     if (list != null && list.size() > 0)
+                     // traverse child node Cache
+                     Iterator<List<NodeData>> childNodesIterator = nodesCache.values().iterator();
+                     while (childNodesIterator.hasNext())
                      {
-                        if (list.get(0).getQPath().isDescendantOf(parent.getQPath()))
+                        List<NodeData> list = childNodesIterator.next();
+                        if (list != null && list.size() > 0)
                         {
-                           childNodesIterator.remove();
+                           if (list.get(0).getQPath().isDescendantOf(parent.getQPath()))
+                           {
+                              childNodesIterator.remove();
+                           }
                         }
                      }
                   }
+                  finally
+                  {
+                     writeLock.unlock();
+                  }
                }
                put(item);
             }



More information about the exo-jcr-commits mailing list