[infinispan-commits] Infinispan SVN: r708 - in trunk/core/src: main/java/org/infinispan/context and 3 other directories.
infinispan-commits at lists.jboss.org
infinispan-commits at lists.jboss.org
Thu Aug 20 10:11:13 EDT 2009
Author: galder.zamarreno at jboss.com
Date: 2009-08-20 10:11:12 -0400 (Thu, 20 Aug 2009)
New Revision: 708
Modified:
trunk/core/src/main/java/org/infinispan/CacheDelegate.java
trunk/core/src/main/java/org/infinispan/context/Flag.java
trunk/core/src/main/java/org/infinispan/interceptors/InvalidationInterceptor.java
trunk/core/src/main/java/org/infinispan/interceptors/base/BaseRpcInterceptor.java
trunk/core/src/test/java/org/infinispan/invalidation/BaseInvalidationTest.java
Log:
[ISPN-165] (putForExternalRead() resulting in cluster wide invalidation) Fixed by adding a flag that indicates that a call is marked as PFER.
Modified: trunk/core/src/main/java/org/infinispan/CacheDelegate.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/CacheDelegate.java 2009-08-19 16:58:30 UTC (rev 707)
+++ trunk/core/src/main/java/org/infinispan/CacheDelegate.java 2009-08-20 14:11:12 UTC (rev 708)
@@ -299,7 +299,7 @@
transactionManager.suspend();
}
// if the entry exists then this should be a no-op.
- putIfAbsent(key, value, Flag.FAIL_SILENTLY, Flag.FORCE_ASYNCHRONOUS, Flag.ZERO_LOCK_ACQUISITION_TIMEOUT);
+ putIfAbsent(key, value, Flag.FAIL_SILENTLY, Flag.FORCE_ASYNCHRONOUS, Flag.ZERO_LOCK_ACQUISITION_TIMEOUT, Flag.PUT_FOR_EXTERNAL_READ);
}
catch (Exception e) {
if (log.isDebugEnabled()) log.debug("Caught exception while doing putForExternalRead()", e);
Modified: trunk/core/src/main/java/org/infinispan/context/Flag.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/context/Flag.java 2009-08-19 16:58:30 UTC (rev 707)
+++ trunk/core/src/main/java/org/infinispan/context/Flag.java 2009-08-20 14:11:12 UTC (rev 708)
@@ -1,5 +1,7 @@
package org.infinispan.context;
+import org.infinispan.Cache;
+
/**
* Available flags, which may be set on a per-invocation basis. These are provided using the {@link
* org.infinispan.AdvancedCache} interface, using some of the overloaded methods that allow passing in of a variable
@@ -18,9 +20,11 @@
* logging them instead at a low log level</li> <li>{@link #SKIP_REMOTE_LOOKUP} - when used with DIST cache mode, will
* skip retrieving a remote value either when doing a get() or exists(), or to provide an overwritten value with a put()
* or remove(). This could render return values for some operations (such as {@link org.infinispan.Cache#put(Object,
- * Object)} or {@link org.infinispan.Cache#remove(Object)} unusable.</li> </ul>
+ * Object)} or {@link org.infinispan.Cache#remove(Object)} unusable.</li> <li> {@link #PUT_FOR_EXTERNAL_READ} - flags the
+ * invocation as a {@link Cache#putForExternalRead(Object, Object)} call.</li></ul>
*
* @author Manik Surtani
+ * @author Galder Zamarreño
* @since 4.0
*/
public enum Flag {
@@ -33,5 +37,6 @@
FORCE_SYNCHRONOUS,
SKIP_CACHE_STORE,
FAIL_SILENTLY,
- SKIP_REMOTE_LOOKUP
+ SKIP_REMOTE_LOOKUP,
+ PUT_FOR_EXTERNAL_READ
}
Modified: trunk/core/src/main/java/org/infinispan/interceptors/InvalidationInterceptor.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/interceptors/InvalidationInterceptor.java 2009-08-19 16:58:30 UTC (rev 707)
+++ trunk/core/src/main/java/org/infinispan/interceptors/InvalidationInterceptor.java 2009-08-20 14:11:12 UTC (rev 708)
@@ -32,6 +32,7 @@
import org.infinispan.commands.write.RemoveCommand;
import org.infinispan.commands.write.ReplaceCommand;
import org.infinispan.commands.write.WriteCommand;
+import org.infinispan.context.Flag;
import org.infinispan.context.InvocationContext;
import org.infinispan.context.impl.TxInvocationContext;
import org.infinispan.factories.annotations.Inject;
@@ -62,7 +63,8 @@
* broadcast an {@link InvalidateCommand} on the remote caches containing all keys modified. This allows the remote
* cache to look up the value in a shared cache loader which would have been updated with the changes.
*
- * @author <a href="mailto:manik at jboss.org">Manik Surtani (manik at jboss.org)</a>
+ * @author Manik Surtani
+ * @author Galder Zamarreño
* @since 4.0
*/
@MBean(objectName = "Invalidation", description = "Component responsible for invalidating entries on remote caches when entries are written to locally.")
@@ -85,7 +87,10 @@
@Override
public Object visitPutKeyValueCommand(InvocationContext ctx, PutKeyValueCommand command) throws Throwable {
- return handleInvalidate(ctx, command, command.getKey());
+ if (!isPutForExternalRead(ctx)) {
+ return handleInvalidate(ctx, command, command.getKey());
+ }
+ return invokeNextInterceptor(ctx, command);
}
@Override
@@ -215,6 +220,14 @@
private void incrementInvalidations() {
if (statsEnabled) invalidations.incrementAndGet();
}
+
+ private boolean isPutForExternalRead(InvocationContext ctx) {
+ if (ctx.hasFlag(Flag.PUT_FOR_EXTERNAL_READ)) {
+ if (trace) log.debug("Put for external read called. Suppressing clustered invalidation.");
+ return true;
+ }
+ return false;
+ }
@ManagedOperation(description = "Resets statistics gathered by this component")
public void resetStatistics() {
Modified: trunk/core/src/main/java/org/infinispan/interceptors/base/BaseRpcInterceptor.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/interceptors/base/BaseRpcInterceptor.java 2009-08-19 16:58:30 UTC (rev 707)
+++ trunk/core/src/main/java/org/infinispan/interceptors/base/BaseRpcInterceptor.java 2009-08-20 14:11:12 UTC (rev 708)
@@ -73,7 +73,7 @@
protected final boolean isLocalModeForced(InvocationContext ctx) {
if (ctx.hasFlag(Flag.CACHE_MODE_LOCAL)) {
- if (trace) log.debug("LOCAL mode forced on invocation. Suppressing clustered events.");
+ if (trace) log.trace("LOCAL mode forced on invocation. Suppressing clustered events.");
return true;
}
return false;
Modified: trunk/core/src/test/java/org/infinispan/invalidation/BaseInvalidationTest.java
===================================================================
--- trunk/core/src/test/java/org/infinispan/invalidation/BaseInvalidationTest.java 2009-08-19 16:58:30 UTC (rev 707)
+++ trunk/core/src/test/java/org/infinispan/invalidation/BaseInvalidationTest.java 2009-08-20 14:11:12 UTC (rev 708)
@@ -318,4 +318,15 @@
assert cache2.get("key") != null;
assert cache2.get("key").equals("value2");
}
+
+ public void testPutForExternalRead() throws Exception {
+ cache1.putForExternalRead("key", "value1");
+ Thread.sleep(500); // sleep so that async invalidation (result of PFER) is propagated
+ cache2.putForExternalRead("key", "value2");
+ Thread.sleep(500); // sleep so that async invalidation (result of PFER) is propagated
+ assert cache1.get("key") != null;
+ assert cache1.get("key").equals("value1");
+ assert cache2.get("key") != null;
+ assert cache2.get("key").equals("value2");
+ }
}
More information about the infinispan-commits
mailing list