You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@jackrabbit.apache.org by "Jukka Zitting (Updated) (JIRA)" <ji...@apache.org> on 2012/01/17 17:53:39 UTC

[jira] [Updated] (JCR-3194) ConcurrentModificationException in CacheManager.

     [ https://issues.apache.org/jira/browse/JCR-3194?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Jukka Zitting updated JCR-3194:
-------------------------------

    Fix Version/s: 2.4

Merged to the 2.4 branch in revision 1232474.
                
> ConcurrentModificationException in CacheManager.
> ------------------------------------------------
>
>                 Key: JCR-3194
>                 URL: https://issues.apache.org/jira/browse/JCR-3194
>             Project: Jackrabbit Content Repository
>          Issue Type: Bug
>    Affects Versions: 2.3.4
>            Reporter: Mat Lowery
>             Fix For: 2.4
>
>
> Using the test code below, I was able to produce this stack:
> java.util.ConcurrentModificationException
> 	at java.util.WeakHashMap$HashIterator.nextEntry(WeakHashMap.java:762)
> 	at java.util.WeakHashMap$KeyIterator.next(WeakHashMap.java:795)
> 	at org.apache.jackrabbit.core.cache.CacheManager.logCacheStats(CacheManager.java:164)
> 	at org.apache.jackrabbit.core.cache.CacheManager.cacheAccessed(CacheManager.java:137)
> 	at org.apache.jackrabbit.core.cache.AbstractCache.recordCacheAccess(AbstractCache.java:122)
> 	at org.apache.jackrabbit.core.cache.ConcurrentCache.get(ConcurrentCache.java:122)
> 	at org.apache.jackrabbit.core.state.MLRUItemStateCache.retrieve(MLRUItemStateCache.java:71)
> 	at org.apache.jackrabbit.core.state.ItemStateReferenceCache.retrieve(ItemStateReferenceCache.java:139)
> 	at org.apache.jackrabbit.core.state.SharedItemStateManager.getNonVirtualItemState(SharedItemStateManager.java:1716)
> 	at org.apache.jackrabbit.core.state.SharedItemStateManager.getItemState(SharedItemStateManager.java:268)
> 	at org.apache.jackrabbit.core.state.LocalItemStateManager.getNodeState(LocalItemStateManager.java:110)
> 	at org.apache.jackrabbit.core.state.LocalItemStateManager.getItemState(LocalItemStateManager.java:175)
> 	at org.apache.jackrabbit.core.state.XAItemStateManager.getItemState(XAItemStateManager.java:260)
> 	at org.apache.jackrabbit.core.state.SessionItemStateManager.getItemState(SessionItemStateManager.java:161)
> 	at org.apache.jackrabbit.core.ItemManager.getItemData(ItemManager.java:382)
> 	at org.apache.jackrabbit.core.ItemManager.getItem(ItemManager.java:328)
> 	at org.apache.jackrabbit.core.ItemManager.getItem(ItemManager.java:622)
> 	at org.apache.jackrabbit.core.ItemManager.getRootNode(ItemManager.java:531)
> 	at org.apache.jackrabbit.core.SessionImpl.getRootNode(SessionImpl.java:760)
> 	at test.JackrabbitTest$1.run(JackrabbitTest.java:37)
> 	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
> 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
> 	at java.lang.Thread.run(Thread.java:662)
> -------------------------
> package test;
> import java.io.File;
> import java.util.concurrent.ExecutorService;
> import java.util.concurrent.Executors;
> import java.util.concurrent.TimeUnit;
> import java.util.concurrent.atomic.AtomicBoolean;
> import java.util.concurrent.atomic.AtomicInteger;
> import javax.jcr.Repository;
> import javax.jcr.RepositoryException;
> import javax.jcr.Session;
> import javax.jcr.SimpleCredentials;
> import org.apache.jackrabbit.core.TransientRepository;
> public class JackrabbitTest {
>  public static void main(final String[] args) throws Exception {
>    File dir = File.createTempFile("jackrabbit-test", "");
>    dir.delete();
>    dir.mkdir();
>    System.out.println("created temporary directory: " +
>        dir.getAbsolutePath());
>    dir.deleteOnExit();
>    final Repository jcrRepo = new TransientRepository(dir);
>    final AtomicBoolean passed = new AtomicBoolean(true);
>    final AtomicInteger counter = new AtomicInteger(0);
>    ExecutorService executor = Executors.newFixedThreadPool(50);
>    Runnable runnable = new Runnable() {
>      @Override
>      public void run() {
>        try {
>          Session session = jcrRepo.login(
>              new SimpleCredentials("admin",
>                  "admin".toCharArray()));
>          session.getRootNode().addNode("n" +
>                  counter.getAndIncrement()); //unique name
>          session.save();
>          session.logout();
>        } catch (RepositoryException e) {
>          e.printStackTrace();
>          passed.set(false);
>        }
>      }
>    };
>    System.out.println("Running threads");
>    for (int i = 0; i<  500; i++) {
>      executor.execute(runnable);
>    }
>    executor.shutdown(); //Disable new tasks from being submitted
>    if (!executor.awaitTermination(120, TimeUnit.SECONDS)) {
>      System.err.println("timeout");
>      System.exit(1);
>    }
>    if (!passed.get()) {
>      System.err.println("one or more threads got an exception");
>      System.exit(1);
>    } else {
>      System.out.println("all threads ran with no exceptions");
>      System.exit(0);
>    }
>  }
> }

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira