[ 
https://issues.apache.org/jira/browse/GEODE-6152?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

John Blum updated GEODE-6152:
-----------------------------
    External issue URL: https://jira-pivotal.atlassian.net/browse/GEM-2277
                Labels: Proxy Region client  (was: )

> 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
>    Affects Versions: 1.3.0, 1.2.1, 1.4.0, 1.5.0, 1.6.0, 1.7.0
>            Reporter: John Blum
>            Priority: Critical
>              Labels: Proxy, Region, client
>
> 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