1 Reply Latest reply on Jun 14, 2004 11:59 AM by ben.wang

    NPE when using IsolationLevel NONE, contains fix for the pro

    lhotari

      I'm using JBossCache 1.01 with Hibernate. The IsolationLevel I'm using is NONE. I got this NPE:

      2004-06-12 15:41:19,348 ERROR [UpHandler (GMS)] org.jboss.cache.TreeCache - getState(): failed lock
      ing
      tree
      java.lang.NullPointerException
      at org.jboss.cache.lock.IdentityLock.acquireReadLock(IdentityLock.java:175)
      at org.jboss.cache.Node.acquireReadLock(Node.java:346)
      at org.jboss.cache.Node.acquire(Node.java:331)
      at org.jboss.cache.Node.acquireAll(Node.java:370)
      at org.jboss.cache.TreeCache$MessageListenerAdaptor.getState(TreeCache.java:2438)
      at org.jgroups.blocks.MessageDispatcher$ProtocolAdapter.passUp(MessageDispatcher.java:576)
      at org.jgroups.blocks.RequestCorrelator.receive(RequestCorrelator.java:322)
      at org.jgroups.blocks.MessageDispatcher$ProtocolAdapter.up(MessageDispatcher.java:638)
      at org.jgroups.JChannel.up(JChannel.java:874)
      at org.jgroups.stack.ProtocolStack.up(ProtocolStack.java:323)
      at org.jgroups.stack.ProtocolStack.receiveUpEvent(ProtocolStack.java:339)
      at org.jgroups.stack.Protocol.passUp(Protocol.java:489)
      at org.jgroups.protocols.pbcast.STATE_TRANSFER.up(STATE_TRANSFER.java:102)
      at org.jgroups.stack.Protocol.receiveUpEvent(Protocol.java:437)
      at org.jgroups.stack.Protocol.passUp(Protocol.java:489)
      at org.jgroups.protocols.pbcast.GMS.up(GMS.java:582)
      at org.jgroups.stack.UpHandler.run(Protocol.java:60)

      I had to add a class called LockStrategyNone. I guess this has been on the todo list since there was a comment "FIXME Ben" in the source code of LockStrategyFactory:

      if (lockingLevel_ == null || lockingLevel_ == IsolationLevel.NONE)
       return null; // FIXME Ben !
      


      I changed this to be:
      if (lockingLevel_ == null || lockingLevel_ == IsolationLevel.NONE)
       return new LockStrategyNone();
      



      source code for LockStrategyNone :
      /*
       * JBoss, the OpenSource J2EE webOS
       *
       * Distributable under LGPL license.
       * See terms of license at gnu.org.
       */
      package org.jboss.cache.lock;
      
      import EDU.oswego.cs.dl.util.concurrent.NullSync;
      import EDU.oswego.cs.dl.util.concurrent.Sync;
      
      /**
       * Transaction isolation level of None.
       *
       * @author Lari Hotari
       * @version $Revision$
       */
      public class LockStrategyNone implements LockStrategy
      {
       private NullSync nullLock_;
      
       public LockStrategyNone()
       {
       nullLock_ = new NullSync();
       }
      
       /**
       * @see org.jboss.cache.LockStrategy#readLock()
       */
       public Sync readLock()
       {
       return nullLock_;
       }
      
       /**
       * @see org.jboss.cache.LockStrategy#upgradeLockAttempt(long)
       */
       public Sync upgradeLockAttempt(long msecs)
       {
       return nullLock_;
       }
      
       /**
       * @see org.jboss.cache.LockStrategy#writeLock()
       */
       public Sync writeLock()
       {
       return nullLock_;
       }
      }



      edited LockStrategyFactory :

      /*
       * JBoss, the OpenSource J2EE webOS
       *
       * Distributable under LGPL license.
       * See terms of license at gnu.org.
       */
      package org.jboss.cache.lock;
      
      /**
       * Factory to create LockStragtegy instance.
       *
       * @author Ben Wang
       */
      public class LockStrategyFactory
      {
       private static LockStrategyFactory s_me = null;
      
      
       /**
       * Transaction locking isolation level. Default.
       */
       private static IsolationLevel lockingLevel_ = IsolationLevel.REPEATABLE_READ;
      
       /**
       *
       */
       protected LockStrategyFactory()
       {
       }
      
       public static LockStrategyFactory getInstance()
       {
       if (s_me == null)
       s_me = new LockStrategyFactory();
      
       return s_me;
       }
      
       public LockStrategy getLockStrategy()
       {
       if (lockingLevel_ == null || lockingLevel_ == IsolationLevel.NONE)
       return new LockStrategyNone();
       if (lockingLevel_ == IsolationLevel.REPEATABLE_READ)
       return new LockStrategyRepeatableRead();
       if (lockingLevel_ == IsolationLevel.SERIALIZABLE)
       return new LockStrategySerializable();
       if (lockingLevel_ == IsolationLevel.READ_COMMITTED)
       return new LockStrategyReadCommitted();
       if (lockingLevel_ == IsolationLevel.READ_UNCOMMITTED)
       return new LockStrategyReadUncommitted();
       throw new RuntimeException("getLockStrategy: LockStrategy selection not recognized." +
       " selection: " + lockingLevel_);
       }
      
       public static void setIsolationLevel(IsolationLevel level)
       {
       lockingLevel_ = level;
       }
      
      }