[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