[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