If I run the japi-compliance-checker [1] against the 1.12 release branch and 
develop this change pops up as a binary incompatibility.  As Owen noted, this 
would require recompilation to avoid NoSuchMethod errors.

One effect this could have is that a library built on top of Geode (e.g. 
Spring) would not be compatible with both 1.12 and 1.13.

Anthony


[1] https://lvc.github.io/japi-compliance-checker/ 
<https://lvc.github.io/japi-compliance-checker/>


> On Feb 27, 2020, at 5:19 PM, Owen Nichols <onich...@pivotal.io> wrote:
> 
> While changing a void method to have a return type does not break source 
> compatibility, it appears likely to break binary compatibility[1].
> 
> So, if you are compiling your client from source, it will compile 
> successfully against either Geode 1.12 or Geode 1.13.  But if your client was 
> already compiled [against Geode 1.12] and then you upgrade to Geode 1.13, 
> without recompiling your client, I your client will throw 
> MethodNotFoundException[2].
> 
> [1] 
> https://wiki.eclipse.org/Evolving_Java-based_APIs_2#Evolving_API_interfaces_-_API_methods
> [2] 
> https://stackoverflow.com/questions/47476509/can-i-change-a-return-type-to-be-a-strict-subtype-and-retain-binary-compatibilit
> 
>> On Feb 27, 2020, at 5:09 PM, Kirk Lund <kl...@apache.org> wrote:
>> 
>> Remember, if there are any concerns about recent backwards-compatible
>> changes to Geode user APIs, they should be brought on the dev list.
>> 
>> Also, backward-compatible changes are by definition safe and ok for a user
>> API because it won't break the user's code.
>> 
>> Here's an example of a user API that I recently fixed...
>> 
>> The ClientRegionFactory is a builder with methods that are supposed to
>> follow fluent-style API (ie, return the ClientRegionFactory instance so you
>> can chain the calls).
>> 
>> Whoever added setConcurrencyChecksEnabled goofed up and made the return
>> type void. Changing void to ClientRegionFactory is a fully backwards
>> compatible change which corrects the API. Since this fixes the API and
>> doesn't actually change the user API, this should be very safe and improves
>> Geode by correcting a broken API:
>> 
>> *diff --git
>> a/geode-core/src/main/java/org/apache/geode/cache/client/ClientRegionFactory.java
>> b/geode-core/src/main/java/org/apache/geode/cache/client/ClientRegionFactory.java*
>> 
>> *index add35f01a2..2a08307adc 100644*
>> 
>> *---
>> a/geode-core/src/main/java/org/apache/geode/cache/client/ClientRegionFactory.java*
>> 
>> *+++
>> b/geode-core/src/main/java/org/apache/geode/cache/client/ClientRegionFactory.java*
>> 
>> @@ -216,7 +216,7 @@ public interface ClientRegionFactory<K, V> {
>> 
>>   * @since GemFire 7.0
>> 
>>   * @param concurrencyChecksEnabled whether to perform concurrency checks
>> on operations
>> 
>>   */
>> 
>> -  void setConcurrencyChecksEnabled(boolean concurrencyChecksEnabled);
>> 
>> +  ClientRegionFactory<K, V> setConcurrencyChecksEnabled(boolean
>> concurrencyChecksEnabled);
>> 
>> 
>> 
>>  /**
>> 
>>   * Sets the DiskStore name attribute. This causes the region to belong
>> to the DiskStore.
>> 
>> *diff --git
>> a/geode-core/src/main/java/org/apache/geode/cache/client/internal/ClientRegionFactoryImpl.java
>> b/geode-core/src/main/java/org/apache/geode/cache/client/internal/ClientRegionFactoryImpl.java*
>> 
>> *index 64256e8f8e..920deba055 100644*
>> 
>> *---
>> a/geode-core/src/main/java/org/apache/geode/cache/client/internal/ClientRegionFactoryImpl.java*
>> 
>> *+++
>> b/geode-core/src/main/java/org/apache/geode/cache/client/internal/ClientRegionFactoryImpl.java*
>> 
>> @@ -186,8 +186,9 @@ public class ClientRegionFactoryImpl<K, V> implements
>> ClientRegionFactory<K, V>
>> 
>>  }
>> 
>> 
>> 
>>  @Override
>> 
>> -  public void setConcurrencyChecksEnabled(boolean
>> concurrencyChecksEnabled) {
>> 
>> +  public ClientRegionFactory<K, V> setConcurrencyChecksEnabled(boolean
>> concurrencyChecksEnabled) {
>> 
>> 
>> this.attrsFactory.setConcurrencyChecksEnabled(concurrencyChecksEnabled);
>> 
>> +    return this;
>> 
>>  }
>> 
>> 
>> 
>>  @Override
>> 
>> Does anyone have concerns over fixing "void setConcurrencyChecksEnabled"
>> by changing it to "ClientRegionFactory setConcurrencyChecksEnabled"? If
>> there is a concern, is the concern about the change itself or because this
>> was fixed without following a more heavy-weight process?
>> 
>> Thanks,
>> Kirk
> 

Reply via email to