[ https://issues.apache.org/jira/browse/GEODE-6032?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
John Blum updated GEODE-6032: ----------------------------- Priority: Critical (was: Major) > Entire object is serialized again (and again) when Delta.hasDelta returns > false and client is using PROXY Region > ---------------------------------------------------------------------------------------------------------------- > > Key: GEODE-6032 > URL: https://issues.apache.org/jira/browse/GEODE-6032 > Project: Geode > Issue Type: Bug > Components: client/server > Reporter: John Blum > Priority: Critical > > Currently, if a cache client application is configured with a client > {{PROXY}} Region, and the application is also using {{DataSerialization}} to > de/serialize objects to/from the servers, and the application domain objects > implement the {{org.apache.geode.Delta}} interface then Apache Geode will > incorrectly send the entire object (again) when {{Delta.hasDelta}} returns > *false*. > It is understandable that the application domain object needs to be > serialized in its entirety the first time the object is sent to the server(s) > (or if the object is later, subsequently removed or has expired/been evicted, > and then needs to be re-added for whatever reason). > However, once the server(s) know about the object, then only ever a "delta" > should be sent, and only when {{Delta.hasDelta()}} returns *true*. > Otherwise, if {{Delta.hasDelta()}} returns *false*, then most certainly, the > entire object should not be sent again, otherwise it is possible for the > application to enter a race condition scenario where the object gets > "overwritten", and as a results, the application can lose data (aka "_lost > updates_"). > If users were to change their client Region data management policy from > {{PROXY}} to {{CACHING_PROXY}} then this works as expected. Apache Geode > will only send for and object it already knows about if there is actually a > "delta", otherwise Geode does nothing (that is, does not send the object, or > rather any delta to the servers since there is technically nothing to send). > Obviously, in the {{CACHING_PROXY}} case, there is "local" state to compare > against, and therefore, Geode knows about the object already, in that it > "exists". It can therefore assess the object to determine if it is the > same/unchanged, and not do anything in the case the {{Delta.hasDelta}} > returns *false*, thus the "application" informing Geode there is nothing to > send. > Clearly, in the {{PROXY}} case, this "local" state does not exist, and > therefore, Geode does not know whether the object (already) exists on the > servers or not. So, if {{Delta.hasDelta()}} returns *false*, it is unsure > whether the objects exists or not and so decides just to send the entire > object again, a "_premature optimization_" to be sure, which now has > sacrificed "_correctness_", and has amplified the possible "_race > conditions_" on the application side. > However, this is no different than if {{Delta.hasDelta()}} returns *true* and > the object is *not yet* known by the servers. When the client sends just the > delta in this case, the server will send back to the client, I don't know > anything about this object for which the delta needs to be applied, and > therefore, the client must turn around and send it the object anyway. > So, in the {{PROXY}} case, it would be better if the client made a > determination about whether the object truly exists on the server side or not > before arbitrarily and falsely assuming the entire object should be sent > again if the {{Delta.hasDelta()}} returns *false*. The client simply does > not know and should "verify" before sending the object. > Obviously this affects performance, but is a small price to pay (and the > "correct" thing to do) compared with "_lost updates_" and amplifying "_race > conditions_", client-side. > There is also a situation where {{CACHING_PROXY}} client Regions can even > *fail*, and that is when {{copy-on-read}} is set to *true*. -- This message was sent by Atlassian JIRA (v7.6.3#76005)