[
https://issues.apache.org/jira/browse/OPENJPA-2470?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13872713#comment-13872713
]
ASF subversion and git services commented on OPENJPA-2470:
----------------------------------------------------------
Commit 1558594 from [~curtisr7] in branch 'openjpa/trunk'
[ https://svn.apache.org/r1558594 ]
OPENJPA-2470 : Update DataCacheManagerImpl to use a ConcurrentHashMap rather
than a HashMap.
> DataCacheManagerImpl infinite loop for checking if classes are cachable
> -----------------------------------------------------------------------
>
> Key: OPENJPA-2470
> URL: https://issues.apache.org/jira/browse/OPENJPA-2470
> Project: OpenJPA
> Issue Type: Bug
> Components: datacache
> Affects Versions: 2.0.1, 2.1.1, 2.2.2
> Environment: linux 64
> Reporter: Seb Mo
> Assignee: Rick Curtis
> Priority: Critical
> Fix For: 2.4.0
>
>
> We're integrated openjpa into our latest software delivery and in the last
> three months we're ran two times into this issue. First time it was not
> investigated at all, but the last time we've had the chance to grab extra
> information out of the system.
> At that point in time, we've had one of our processes not getting response
> back from the application that was using openjpa.
> All the connection threads were running the same calls:
> 2014-01-07 07:21:37,716 - INFO "ClientConnection - 9" prio=10
> tid=0x00007f33d400e000 nid=0x8d9 runnable [0x00007f32db1ef000]
> 2014-01-07 07:21:37,716 - INFO java.lang.Thread.State: RUNNABLE
> 2014-01-07 07:21:37,716 - INFO at java.util.HashMap.getEntry(Unknown
> Source)
> 2014-01-07 07:21:37,716 - INFO at java.util.HashMap.get(Unknown Source)
> 2014-01-07 07:21:37,716 - INFO at
> org.apache.openjpa.datacache.DataCacheManagerImpl.isCachable(DataCacheManagerImpl.java:145)
> 2014-01-07 07:21:37,716 - INFO at
> org.apache.openjpa.datacache.DataCacheManagerImpl.selectCache(DataCacheManagerImpl.java:128)
> 2014-01-07 07:21:37,716 - INFO at
> org.apache.openjpa.datacache.DataCacheStoreManager.initialize(DataCacheStoreManager.java:358)
> 2014-01-07 07:21:37,716 - INFO at
> org.apache.openjpa.kernel.DelegatingStoreManager.initialize(DelegatingStoreManager.java:112)
> 2014-01-07 07:21:37,716 - INFO at
> org.apache.openjpa.kernel.ROPStoreManager.initialize(ROPStoreManager.java:57)
> 2014-01-07 07:21:37,716 - INFO at
> org.apache.openjpa.kernel.BrokerImpl.initialize(BrokerImpl.java:1027)
> 2014-01-07 07:21:37,716 - INFO at
> org.apache.openjpa.kernel.BrokerImpl.find(BrokerImpl.java:985)
> 2014-01-07 07:21:37,716 - INFO at
> org.apache.openjpa.kernel.BrokerImpl.find(BrokerImpl.java:907)
> 2014-01-07 07:21:37,716 - INFO at
> org.apache.openjpa.jdbc.kernel.JDBCStoreManager.load(JDBCStoreManager.java:1041)
> 2014-01-07 07:21:37,716 - INFO at
> org.apache.openjpa.jdbc.sql.AbstractResult.load(AbstractResult.java:280)
> 2014-01-07 07:21:37,716 - INFO at
> org.apache.openjpa.jdbc.sql.SelectImpl$SelectResult.load(SelectImpl.java:2381)
> 2014-01-07 07:21:37,716 - INFO at
> org.apache.openjpa.jdbc.meta.strats.RelationToManyInverseKeyFieldStrategy.loadElement(RelationToManyInverseKeyFieldStrategy.java:90)
> 2014-01-07 07:21:37,716 - INFO at
> org.apache.openjpa.jdbc.meta.strats.RelationCollectionInverseKeyFieldStrategy.loadElement(RelationCollectionInverseKeyFieldStrategy.java:76)
> 2014-01-07 07:21:37,716 - INFO at
> org.apache.openjpa.jdbc.meta.strats.StoreCollectionFieldStrategy.load(StoreCollectionFieldStrategy.java:558)
> 2014-01-07 07:21:37,716 - INFO at
> org.apache.openjpa.jdbc.meta.FieldMapping.load(FieldMapping.java:934)
> 2014-01-07 07:21:37,717 - INFO at
> org.apache.openjpa.jdbc.kernel.JDBCStoreManager.load(JDBCStoreManager.java:702)
> 2014-01-07 07:21:37,717 - INFO at
> org.apache.openjpa.kernel.DelegatingStoreManager.load(DelegatingStoreManager.java:117)
> 2014-01-07 07:21:37,717 - INFO at
> org.apache.openjpa.datacache.DataCacheStoreManager.load(DataCacheStoreManager.java:461)
> 2014-01-07 07:21:37,717 - INFO at
> org.apache.openjpa.kernel.DelegatingStoreManager.load(DelegatingStoreManager.java:117)
> 2014-01-07 07:21:37,717 - INFO at
> org.apache.openjpa.kernel.ROPStoreManager.load(ROPStoreManager.java:78)
> 2014-01-07 07:21:37,717 - INFO at
> org.apache.openjpa.kernel.StateManagerImpl.loadFields(StateManagerImpl.java:3061)
> 2014-01-07 07:21:37,717 - INFO at
> org.apache.openjpa.kernel.StateManagerImpl.loadField(StateManagerImpl.java:3136)
> 2014-01-07 07:21:37,717 - INFO at
> org.apache.openjpa.kernel.StateManagerImpl.beforeAccessField(StateManagerImpl.java:1606)
> 2014-01-07 07:21:37,717 - INFO at
> org.apache.openjpa.kernel.StateManagerImpl.accessingField(StateManagerImpl.java:1591)
> ....
> We've narrowed this down to the fact that a HashMap is used in the
> org.apache.openjpa.datacache.DataCacheManagerImpl to globally serv our all
> the threads. So multiple threads can add and get information from the
> _cacheable at the same time.
> HashMaps are not thread safe and can get corrupted with eating the entire
> CPU. The problem is better described here (but you can find it in a lot of
> places):
> http://mailinator.blogspot.com/2009/06/beautiful-race-condition.html
> I could not find this bug logged yet and I'm surprised that nobody has ran
> into this yet.
> Our plan for now is to just switch to ConcurrentHashMap instantiation for the
> _cacheable Map.
--
This message was sent by Atlassian JIRA
(v6.1.5#6160)