[infinispan-commits] Infinispan SVN: r337 - in trunk/core/src: main/java/org/infinispan/commands and 7 other directories.

infinispan-commits at lists.jboss.org infinispan-commits at lists.jboss.org
Tue May 26 04:51:06 EDT 2009


Author: vblagojevic at jboss.com
Date: 2009-05-26 04:51:06 -0400 (Tue, 26 May 2009)
New Revision: 337

Modified:
   trunk/core/src/main/java/org/infinispan/CacheDelegate.java
   trunk/core/src/main/java/org/infinispan/commands/CommandsFactory.java
   trunk/core/src/main/java/org/infinispan/commands/CommandsFactoryImpl.java
   trunk/core/src/main/java/org/infinispan/commands/LockControlCommand.java
   trunk/core/src/main/java/org/infinispan/config/Configuration.java
   trunk/core/src/main/java/org/infinispan/config/parsing/XmlConfigurationParserImpl.java
   trunk/core/src/main/java/org/infinispan/factories/InterceptorChainFactory.java
   trunk/core/src/main/java/org/infinispan/interceptors/LockingInterceptor.java
   trunk/core/src/main/resources/config-samples/all.xml
   trunk/core/src/main/resources/schema/infinispan-config-4.0.xsd
   trunk/core/src/test/java/org/infinispan/config/parsing/ConfigurationParserTest.java
Log:
[ISPN-70] - Transparent eager locking for transactions

Modified: trunk/core/src/main/java/org/infinispan/CacheDelegate.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/CacheDelegate.java	2009-05-21 22:34:05 UTC (rev 336)
+++ trunk/core/src/main/java/org/infinispan/CacheDelegate.java	2009-05-26 08:51:06 UTC (rev 337)
@@ -237,7 +237,7 @@
    public void lock(Collection<? extends K> keys) {
       if (keys == null || keys.isEmpty())
          throw new IllegalArgumentException("Cannot lock empty list of keys");
-      LockControlCommand command = commandsFactory.buildLockControlCommand(keys);
+      LockControlCommand command = commandsFactory.buildLockControlCommand(keys,false);
       invoker.invoke(getInvocationContext(), command);
    }
 

Modified: trunk/core/src/main/java/org/infinispan/commands/CommandsFactory.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/commands/CommandsFactory.java	2009-05-21 22:34:05 UTC (rev 336)
+++ trunk/core/src/main/java/org/infinispan/commands/CommandsFactory.java	2009-05-26 08:51:06 UTC (rev 337)
@@ -99,5 +99,5 @@
 
    ClusteredGetCommand buildClusteredGetCommand(Object key);
    
-   LockControlCommand buildLockControlCommand(Collection keys);
+   LockControlCommand buildLockControlCommand(Collection keys, boolean implicit);
 }

Modified: trunk/core/src/main/java/org/infinispan/commands/CommandsFactoryImpl.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/commands/CommandsFactoryImpl.java	2009-05-21 22:34:05 UTC (rev 336)
+++ trunk/core/src/main/java/org/infinispan/commands/CommandsFactoryImpl.java	2009-05-26 08:51:06 UTC (rev 337)
@@ -237,7 +237,7 @@
       }
    }
 
-   public LockControlCommand buildLockControlCommand(Collection keys) {
-      return new LockControlCommand(keys, cacheName);
+   public LockControlCommand buildLockControlCommand(Collection keys, boolean implicit) {
+      return new LockControlCommand(keys, cacheName, implicit);
    }
 }

Modified: trunk/core/src/main/java/org/infinispan/commands/LockControlCommand.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/commands/LockControlCommand.java	2009-05-21 22:34:05 UTC (rev 336)
+++ trunk/core/src/main/java/org/infinispan/commands/LockControlCommand.java	2009-05-26 08:51:06 UTC (rev 337)
@@ -39,13 +39,19 @@
 public class LockControlCommand extends AbstractTransactionBoundaryCommand {
    public static final int COMMAND_ID = 3;
    private Collection keys;
+   private boolean implicit = false;
 
    public LockControlCommand() {
    }
 
    public LockControlCommand(Collection keys, String cacheName) {
+      this(keys,cacheName,false);
+   }
+   
+   public LockControlCommand(Collection keys, String cacheName, boolean implicit) {
       this.cacheName = cacheName;
       this.keys = keys;
+      this.implicit = implicit;
    }
 
    public void attachGlobalTransaction(GlobalTransaction gtx) {
@@ -56,6 +62,14 @@
       return keys;
    }
    
+   public boolean isImplicit() {
+      return implicit;
+   }
+   
+   public boolean isExplicit(){
+      return !isImplicit();
+   }
+
    public Object acceptVisitor(InvocationContext ctx, Visitor visitor) throws Throwable {
       return visitor.visitLockControlCommand((TxInvocationContext) ctx, this);
    }

Modified: trunk/core/src/main/java/org/infinispan/config/Configuration.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/config/Configuration.java	2009-05-21 22:34:05 UTC (rev 336)
+++ trunk/core/src/main/java/org/infinispan/config/Configuration.java	2009-05-26 08:51:06 UTC (rev 337)
@@ -190,6 +190,8 @@
    private boolean syncCommitPhase = false;
    @Dynamic
    private boolean syncRollbackPhase = false;
+   @Dynamic
+   private boolean useEagerLocking = false;
    private boolean useLazyDeserialization = false;
    private List<CustomInterceptorConfig> customInterceptors = Collections.emptyList();
    private boolean writeSkewCheck = false;
@@ -389,6 +391,11 @@
       testImmutability("syncRollbackPhase");
       this.syncRollbackPhase = syncRollbackPhase;
    }
+   
+   public void setUseEagerLocking(boolean useEagerLocking) {
+      testImmutability("useEagerLocking");
+      this.useEagerLocking = useEagerLocking;
+   }
 
    public void setUseReplQueue(boolean useReplQueue) {
       testImmutability("useReplQueue");
@@ -526,6 +533,10 @@
    public boolean isSyncRollbackPhase() {
       return syncRollbackPhase;
    }
+   
+   public boolean isUseEagerLocking() {
+      return useEagerLocking;
+   }
 
    public long getStateRetrievalTimeout() {
       return stateRetrievalTimeout;
@@ -594,6 +605,7 @@
       if (syncCommitPhase != that.syncCommitPhase) return false;
       if (syncReplTimeout != that.syncReplTimeout) return false;
       if (syncRollbackPhase != that.syncRollbackPhase) return false;
+      if (useEagerLocking != that.useEagerLocking) return false;
       if (useLazyDeserialization != that.useLazyDeserialization) return false;
       if (useLockStriping != that.useLockStriping) return false;
       if (useReplQueue != that.useReplQueue) return false;
@@ -634,6 +646,7 @@
       result = 31 * result + (cacheLoaderManagerConfig != null ? cacheLoaderManagerConfig.hashCode() : 0);
       result = 31 * result + (syncCommitPhase ? 1 : 0);
       result = 31 * result + (syncRollbackPhase ? 1 : 0);
+      result = 31 * result + (useEagerLocking ? 1 : 0);
       result = 31 * result + (useLazyDeserialization ? 1 : 0);
       result = 31 * result + (customInterceptors != null ? customInterceptors.hashCode() : 0);
       result = 31 * result + (writeSkewCheck ? 1 : 0);

Modified: trunk/core/src/main/java/org/infinispan/config/parsing/XmlConfigurationParserImpl.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/config/parsing/XmlConfigurationParserImpl.java	2009-05-21 22:34:05 UTC (rev 336)
+++ trunk/core/src/main/java/org/infinispan/config/parsing/XmlConfigurationParserImpl.java	2009-05-26 08:51:06 UTC (rev 337)
@@ -240,6 +240,8 @@
             // use defaults since the transaction element is still present!
             config.setTransactionManagerLookupClass(GenericTransactionManagerLookup.class.getName());
          }
+         String useEagerLocking = getAttributeValue(element, "useEagerLocking");
+         if (existsAttribute(useEagerLocking)) config.setUseEagerLocking(getBoolean(useEagerLocking));
          String syncRollbackPhase = getAttributeValue(element, "syncRollbackPhase");
          if (existsAttribute(syncRollbackPhase)) config.setSyncRollbackPhase(getBoolean(syncRollbackPhase));
          String syncCommitPhase = getAttributeValue(element, "syncCommitPhase");

Modified: trunk/core/src/main/java/org/infinispan/factories/InterceptorChainFactory.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/factories/InterceptorChainFactory.java	2009-05-21 22:34:05 UTC (rev 336)
+++ trunk/core/src/main/java/org/infinispan/factories/InterceptorChainFactory.java	2009-05-26 08:51:06 UTC (rev 337)
@@ -81,6 +81,9 @@
          interceptorChain.appendIntereceptor(createInterceptor(DistTxInterceptor.class));
       else
          interceptorChain.appendIntereceptor(createInterceptor(TxInterceptor.class));
+      
+      if(configuration.isUseEagerLocking())
+         interceptorChain.appendIntereceptor(createInterceptor(ImplicitEagerLockingInterceptor.class));
 
       if (configuration.isUseLazyDeserialization())
          interceptorChain.appendIntereceptor(createInterceptor(MarshalledValueInterceptor.class));

Modified: trunk/core/src/main/java/org/infinispan/interceptors/LockingInterceptor.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/interceptors/LockingInterceptor.java	2009-05-21 22:34:05 UTC (rev 336)
+++ trunk/core/src/main/java/org/infinispan/interceptors/LockingInterceptor.java	2009-05-26 08:51:06 UTC (rev 337)
@@ -137,16 +137,24 @@
    }
 
    @Override
-   public Object visitLockControlCommand(TxInvocationContext ctx, LockControlCommand c)
-            throws Throwable {
+   public Object visitLockControlCommand(TxInvocationContext ctx, LockControlCommand c) throws Throwable {
+      boolean localTxScope = ctx.isOriginLocal() && ctx.isInTxScope();
+      boolean shouldInvokeOnCluster = false;
       try {
-         if (ctx.isOriginLocal() && ctx.isInTxScope()) {
+         if (localTxScope) {
             c.attachGlobalTransaction((GlobalTransaction) ctx.getLockOwner());
          }
          for (Object key : c.getKeys()) {
+            if(c.isImplicit() && localTxScope && !lockManager.ownsLock(key,ctx.getLockOwner())){
+               //if even one key is unlocked we need to invoke this lock command cluster wide... 
+               shouldInvokeOnCluster = true;
+            }
             entryFactory.wrapEntryForWriting(ctx, key, true, false, false, false);
          }
-         return invokeNextInterceptor(ctx, c);
+         if(shouldInvokeOnCluster || c.isExplicit())
+            return invokeNextInterceptor(ctx, c);
+         else
+            return null;
       } finally {
          if (ctx.isInTxScope()) {
             doAfterCall(ctx);

Modified: trunk/core/src/main/resources/config-samples/all.xml
===================================================================
--- trunk/core/src/main/resources/config-samples/all.xml	2009-05-21 22:34:05 UTC (rev 336)
+++ trunk/core/src/main/resources/config-samples/all.xml	2009-05-26 08:51:06 UTC (rev 337)
@@ -73,7 +73,8 @@
       <transaction
             transactionManagerLookupClass="org.infinispan.transaction.lookup.GenericTransactionManagerLookup"
             syncRollbackPhase="false"
-            syncCommitPhase="false"/>
+            syncCommitPhase="false"
+            useEagerLocking="false"/>
 
       <!--
       Used to register JMX statistics in any available MBean server

Modified: trunk/core/src/main/resources/schema/infinispan-config-4.0.xsd
===================================================================
--- trunk/core/src/main/resources/schema/infinispan-config-4.0.xsd	2009-05-21 22:34:05 UTC (rev 336)
+++ trunk/core/src/main/resources/schema/infinispan-config-4.0.xsd	2009-05-26 08:51:06 UTC (rev 337)
@@ -104,6 +104,7 @@
       <xs:attribute name="transactionManagerLookupClass" type="xs:string"/>
       <xs:attribute name="syncRollbackPhase" type="tns:booleanType"/>
       <xs:attribute name="syncCommitPhase" type="tns:booleanType"/>
+      <xs:attribute name="useEagerLocking" type="tns:booleanType"/>
    </xs:complexType>
 
    <xs:complexType name="stateRetrievalType">

Modified: trunk/core/src/test/java/org/infinispan/config/parsing/ConfigurationParserTest.java
===================================================================
--- trunk/core/src/test/java/org/infinispan/config/parsing/ConfigurationParserTest.java	2009-05-21 22:34:05 UTC (rev 336)
+++ trunk/core/src/test/java/org/infinispan/config/parsing/ConfigurationParserTest.java	2009-05-26 08:51:06 UTC (rev 337)
@@ -40,6 +40,7 @@
       String xml = "<transaction\n" +
             "            transactionManagerLookupClass=\"org.blah.Blah\"\n" +
             "            syncRollbackPhase=\"true\"\n" +
+            "            useEagerLocking=\"true\"\n" +
             "            syncCommitPhase=\"true\"/>";
       Element e = XmlConfigHelper.stringToElement(xml);
 
@@ -49,6 +50,7 @@
       assert c.getTransactionManagerLookupClass().equals("org.blah.Blah");
       assert c.isSyncCommitPhase();
       assert c.isSyncRollbackPhase();
+      assert c.isUseEagerLocking();
    }
 
    public void testTransactionsDefaults() throws Exception {




More information about the infinispan-commits mailing list