John Blum created GEODE-6152:
--------------------------------

             Summary: Client PROXY Regions may return the same Object instance 
on get(key) and cause Thread-safety issues.
                 Key: GEODE-6152
                 URL: https://issues.apache.org/jira/browse/GEODE-6152
             Project: Geode
          Issue Type: Bug
          Components: client/server, regions
            Reporter: John Blum


According to Apache Geode's documentation (e.g. 
[Javadoc|http://geode.apache.org/releases/latest/javadoc/org/apache/geode/cache/client/ClientRegionShortcut.html#PROXY]),
 client PROXY Regions are expected to return a new Object for each value on 
each {{Region.get(key)}} invocation.

The documentation states:

{quote}
A PROXY region has no local state and forwards all operations to a server.
{quote}

Given the client cache (i.e. Region) contains "no local state" and "all 
operations are forwarded to a server", then this implies that the object, the 
Region's value mapped to the key, is serialized when sent to a server and 
deserialized when received from a server.  The act of de/serialization 
constitutes a new object every, single, time.

However, in a highly concurrent application (e.g. a Web application), with 
multiple Threads in the application potentially making concurrent data requests 
for the same "logical" domain object stored in Apache Geode, it is possible for 
the same object reference to be returned, even for a client {{PROXY}} Region.

This is to be expected when using a {{CACHING_PROXY}}, since the client then 
has "local state", but for a client {{PROXY}} Region, there is, or should be no 
"local state".

It turns out that internally, Geode applies an optimization wherein, if 2 or 
more Threads are concurrently making a data request for the same "logical" 
object, then only 1 Thread is allowed to proceed with the request while the 
other Threads will wait for the response that the permitted, requesting Thread 
received, thereby sharing the same object reference.

This poses grave danger (race conditions due to lost updates, or incorrect 
decisions made due to stale state) if the non-unique object type is not 
Thread-safe.  Under other conditions/configurations (e.g. when sending 
{{Deltas}}), it is even possible to "lose data" due to competing and 
conflicting data access operations, which results in a "_last-one-wins_" 
scenario.




--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to