[infinispan-issues] [JBoss JIRA] Commented: (ISPN-635) NPE on acquire lock LockManagerImpl.lockAndRecord

Galder Zamarreño (JIRA) jira-events at lists.jboss.org
Fri Sep 10 08:48:49 EDT 2010


    [ https://jira.jboss.org/browse/ISPN-635?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12550107#action_12550107 ] 

Galder Zamarreño commented on ISPN-635:
---------------------------------------

Re:  I think you could check first and then lock before the get in case creation is needed, or not lock if creation is not needed 

See patch, that's exactly what happens. However, you have a good point in questioning containskey, cos it returns true even if the cache is not yet started cos the caches.putIfAbsent happens before cache.start(). So, in theory, caches.get() could return a cache that's halfway starting up.

The easy thing would be to put the containsKey and caches.get inside the lock section. But a better approach might be to do something like this:

      Cache<K, V> cache = caches.get(cacheName);
      if (cache != null && cache.getStatus() == ComponentStatus.RUNNING)
         return caches.get(cacheName);

A new patch coming up.

> NPE on acquire lock LockManagerImpl.lockAndRecord
> -------------------------------------------------
>
>                 Key: ISPN-635
>                 URL: https://jira.jboss.org/browse/ISPN-635
>             Project: Infinispan
>          Issue Type: Bug
>          Components: Locking and Concurrency
>    Affects Versions: 4.1.0.Final
>            Reporter: Sanne Grinovero
>            Assignee: Galder Zamarreño
>             Fix For: 4.2.0.BETA1
>
>         Attachments: ConcurrentCacheStartupTest.java, More_sophisticated_fix_with_lock_per_cache_name.patch, Too_restrictive_fix.patch
>
>
> I've seen this happening only once, still it's quite puzzling. Maybe proper visiblity of the variables is not guaranteed?
> java.lang.NullPointerException
> 	at org.infinispan.util.concurrent.locks.LockManagerImpl.lockAndRecord(LockManagerImpl.java:83)
> 	at org.infinispan.container.EntryFactoryImpl.acquireLock(EntryFactoryImpl.java:210)
> 	at org.infinispan.container.EntryFactoryImpl.wrapEntryForWriting(EntryFactoryImpl.java:153)
> 	at org.infinispan.container.EntryFactoryImpl.wrapEntryForWriting(EntryFactoryImpl.java:106)
> 	at org.infinispan.interceptors.LockingInterceptor.visitPutKeyValueCommand(LockingInterceptor.java:197)
> 	at org.infinispan.commands.write.PutKeyValueCommand.acceptVisitor(PutKeyValueCommand.java:76)
> 	at org.infinispan.interceptors.base.CommandInterceptor.invokeNextInterceptor(CommandInterceptor.java:118)
> 	at org.infinispan.interceptors.base.CommandInterceptor.handleDefault(CommandInterceptor.java:132)
> 	at org.infinispan.commands.AbstractVisitor.visitPutKeyValueCommand(AbstractVisitor.java:57)
> 	at org.infinispan.commands.write.PutKeyValueCommand.acceptVisitor(PutKeyValueCommand.java:76)
> 	at org.infinispan.interceptors.base.CommandInterceptor.invokeNextInterceptor(CommandInterceptor.java:118)
> 	at org.infinispan.interceptors.TxInterceptor.enlistWriteAndInvokeNext(TxInterceptor.java:183)
> 	at org.infinispan.interceptors.TxInterceptor.visitPutKeyValueCommand(TxInterceptor.java:132)
> 	at org.infinispan.commands.write.PutKeyValueCommand.acceptVisitor(PutKeyValueCommand.java:76)
> 	at org.infinispan.interceptors.base.CommandInterceptor.invokeNextInterceptor(CommandInterceptor.java:118)
> 	at org.infinispan.interceptors.CacheMgmtInterceptor.visitPutKeyValueCommand(CacheMgmtInterceptor.java:113)
> 	at org.infinispan.commands.write.PutKeyValueCommand.acceptVisitor(PutKeyValueCommand.java:76)
> 	at org.infinispan.interceptors.base.CommandInterceptor.invokeNextInterceptor(CommandInterceptor.java:118)
> 	at org.infinispan.interceptors.InvocationContextInterceptor.handleAll(InvocationContextInterceptor.java:57)
> 	at org.infinispan.interceptors.InvocationContextInterceptor.handleDefault(InvocationContextInterceptor.java:38)
> 	at org.infinispan.commands.AbstractVisitor.visitPutKeyValueCommand(AbstractVisitor.java:57)
> 	at org.infinispan.commands.write.PutKeyValueCommand.acceptVisitor(PutKeyValueCommand.java:76)
> 	at org.infinispan.interceptors.InterceptorChain.invoke(InterceptorChain.java:273)
> 	at org.infinispan.CacheDelegate.put(CacheDelegate.java:429)
> 	at org.infinispan.CacheSupport.put(CacheSupport.java:28)
> 	at com.atlassian.jira.propertyset.PropertySetCache.setObject(PropertySetCache.java:205)
> 	at com.atlassian.jira.propertyset.JiraCachingPropertySet.getString(JiraCachingPropertySet.java:647)
> 	at com.opensymphony.user.User.getFullName(User.java:86)
> 	at com.atlassian.jira.user.util.UserUtilImpl.getDisplayableNameSafely(UserUtilImpl.java:573)
> 	at com.atlassian.jira.plugin.profile.ProfileLinkUserFormat.getInitialParams(ProfileLinkUserFormat.java:47)
> 	at com.atlassian.jira.plugin.profile.ProfileLinkUserFormat.format(ProfileLinkUserFormat.java:32)
> 	at com.atlassian.jira.plugin.profile.DefaultUserFormatManager.formatUser(DefaultUserFormatManager.java:62)

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: https://jira.jboss.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

       



More information about the infinispan-issues mailing list