commit 17a23b093112177770511c731ed66ac6d27eb531 Author: Sebastian Tusk Date: Tue Mar 26 11:09:46 2013 +0100 ISPN-2964 putForExternalRead to L1 not invalidated diff --git a/core/src/main/java/org/infinispan/commands/write/PutKeyValueCommand.java b/core/src/main/java/org/infinispan/commands/write/PutKeyValueCommand.java index fb2dd46..af77777 100644 --- a/core/src/main/java/org/infinispan/commands/write/PutKeyValueCommand.java +++ b/core/src/main/java/org/infinispan/commands/write/PutKeyValueCommand.java @@ -25,6 +25,7 @@ import org.infinispan.atomic.Delta; import org.infinispan.atomic.DeltaAware; import org.infinispan.commands.Visitor; +import org.infinispan.container.entries.CacheEntry; import org.infinispan.container.entries.MVCCEntry; import org.infinispan.context.Flag; import org.infinispan.context.InvocationContext; @@ -80,11 +81,12 @@ public Object acceptVisitor(InvocationContext ctx, Visitor visitor) throws Throw @Override public Object perform(InvocationContext ctx) throws Throwable { Object o; - MVCCEntry e = (MVCCEntry) ctx.lookupEntry(key); - if (e == null && hasFlag(Flag.PUT_FOR_EXTERNAL_READ)) { + CacheEntry ice = ctx.lookupEntry(key); + if ((ice == null || !(ice instanceof MVCCEntry)) && hasFlag(Flag.PUT_FOR_EXTERNAL_READ)) { successful = false; return null; } + MVCCEntry e = (MVCCEntry) ice; //possible as in certain situations (e.g. when locking delegation is used) we don't wrap if (e == null) return null; diff --git a/core/src/main/java/org/infinispan/container/EntryFactoryImpl.java b/core/src/main/java/org/infinispan/container/EntryFactoryImpl.java index aaab81e..90294c6 100644 --- a/core/src/main/java/org/infinispan/container/EntryFactoryImpl.java +++ b/core/src/main/java/org/infinispan/container/EntryFactoryImpl.java @@ -159,7 +159,7 @@ public final MVCCEntry wrapEntryForPut(InvocationContext ctx, Object key, Intern // A putForExternalRead is putIfAbsent, so if key present, do nothing if (ice != null && cmd.hasFlag(Flag.PUT_FOR_EXTERNAL_READ)) { // make sure we record this! Null value since this is a forced lock on the key - ctx.putLookedUpEntry(key, null); + ctx.putLookedUpEntry(key, ice); return null; } diff --git a/core/src/main/java/org/infinispan/interceptors/distribution/TxDistributionInterceptor.java b/core/src/main/java/org/infinispan/interceptors/distribution/TxDistributionInterceptor.java index ba00d81..c6a95ca 100644 --- a/core/src/main/java/org/infinispan/interceptors/distribution/TxDistributionInterceptor.java +++ b/core/src/main/java/org/infinispan/interceptors/distribution/TxDistributionInterceptor.java @@ -40,6 +40,7 @@ import org.infinispan.distribution.L1Manager; import org.infinispan.factories.annotations.Inject; import org.infinispan.factories.annotations.Start; +import org.infinispan.remoting.responses.Response; import org.infinispan.remoting.transport.Address; import org.infinispan.remoting.transport.jgroups.SuspectException; import org.infinispan.transaction.LocalTransaction; @@ -50,6 +51,7 @@ import java.util.Collection; import java.util.List; +import java.util.Map; import java.util.concurrent.Future; import java.util.concurrent.TimeoutException; @@ -140,6 +142,16 @@ public Object visitPutKeyValueCommand(InvocationContext ctx, PutKeyValueCommand // If this was a remote put record that which sent it if (isL1CacheEnabled && !ctx.isOriginLocal() && !skrg.generateRecipients().contains(ctx.getOrigin())) l1Manager.addRequestor(command.getKey(), ctx.getOrigin()); + + if (!ctx.isInTxScope() && command.hasFlag(Flag.PUT_FOR_EXTERNAL_READ) && !isSingleOwnerAndLocal(skrg)) { + // putForExternalRead needs to inform owner + List
recipients = skrg.generateRecipients(); + if (recipients.contains(rpcManager.getAddress()) && (!command.isSuccessful())) { + log.trace("Skipping remote invocation as the command hasn't executed correctly on owner"); + } else { + rpcManager.invokeRemotely(recipients, command, defaultSynchronous); + } + } return returnValue; }