Darrel Schneider created GEODE-8127:
---------------------------------------

             Summary: redis function+delta may not always execute function on 
primary
                 Key: GEODE-8127
                 URL: https://issues.apache.org/jira/browse/GEODE-8127
             Project: Geode
          Issue Type: Bug
          Components: redis
            Reporter: Darrel Schneider


The redis use of regions depends on the code that will modify the region that 
is storing redis data, to always execute on the primary. It thought it was 
accomplishing this by marking the function as "optimizeForWrite=true" and by 
routing the function to the node with the bucket using "withFilter(key)". This 
works most of the time. But in some cases the function executes on a redundant 
copy. It looks like what is happening is that at the time the function is 
dispatched it has one idea of who the primary is and sends the function to that 
node. But before it executes the primary moves from this node to another that 
is doing redundancy recovery. Then when our function finally does a "put" on 
the localDataSet it ends up being a remote operation that is sent to the other 
node.

If our redis function could get a lock that prevents the bucket primary status 
from changing (see BucketRegion doLockForPrimary) and then check to see if we 
are the primary (if not throw an exception that causes the function sender to 
retry  (see BucketMovedException) otherwise execute the function and at the end 
release the lock (see BucketRegion doUnlockForPrimary).

We could enable this with a new method added to Function (much like the 
existing isHA and optimizeForWrite). This new method could be executeOnPrimary 
and default to false (adding a default method to the Function interface will 
not cause backwards compatibility issues unless a current class that implements 
Function already had added a method named "executeOnPrimary").



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to