Thanks Kirk and team! +1 for bubbling up some of the internal APIs and having consistency and/or functional parity.
One suggestion is, perhaps a quick note could be sent out to the Geode devs with a title/subject of "*NOTICE: Frameworks/Tooling*" with a body detailing the API (public/internal) changes that would affect 3rd party projects (e.g. access modifier changes, removing methods, changing signatures, introducing new types/properties, etc) Another suggestion... it might be nice to list the more formal/official projects, like SDG, that the community is working on for the Apache Geode ecosystem. I literally have no idea what additional projects exist that might benefit the community. *Pivotal GemFire* could be even counted among these ecosystem projects/products.... perhaps another section similar to " *Deployments*" on the Community page <http://geode.apache.org/community/> [1]. Food for thought. Thanks, John [1] http://geode.apache.org/community/ On Thu, May 18, 2017 at 10:31 AM, Kirk Lund <kl...@apache.org> wrote: > I think we should definitely try to refactor any Geode internals that SDG > is using to be public API or SPI. We'll need to take a closer look at how > SDG is using those classes to plan what to do. > > If I change or any classes on your list (or public APIs), I'll give you > heads up next time. > > On Thu, May 18, 2017 at 10:21 AM, John Blum <jb...@pivotal.io> wrote: > > > Hi Kirk (also responding to Bruce as I was writing this before he sent)- > > > > Thank you for following up. > > > > Regarding the addition of the getOnlineLocators()... > > > > SDG does implement > > <http://docs.spring.io/spring-data-gemfire/docs/current/api/ > > org/springframework/data/gemfire/client/support/package-summary.html> > > [1] > > a few Geode interfaces, such as *org.apache.geode.cache.client.Pool*. > > This > > is due in part since not all the state for certain Geode objects (e.g. > > Pool) is known in advance as the actual object may not have been created > by > > the *Spring* container yet. However, that state is captured in *Spring* > > FactoryBeans, which will be used to construct the actual object at the > > appropriate time. > > > > Anyway, like the "internal" API, I have tried to keep such > implementations > > of Geode interfaces/classes to a minimum. Still, it is a good indicator > of > > when something has changed since I will most certainly get a compilation > > failure. This leads me to, I do need to know when APIs change to provide > > appropriate support in SDG, possibly in configuration, whether XML of via > > Java/annotations with the FactoryBeans, e.g. PoolFactoryBean > > <http://docs.spring.io/spring-data-gemfire/docs/current/api/ > > org/springframework/data/gemfire/client/PoolFactoryBean.html> > > [2], > > especially if it is a configuration property/attribute. Other cases my > be > > important from an accessibility or information standpoint (probably more > so > > for tooling). > > > > As for the InternalDataSerializer... > > > > No worries. I found an acceptable and actually better workaround. > Again, > > I am trying to reduce or completely eliminate the use of "internal" > classes > > in SDG. Unfortunately, a quick search (using regex) in SDG for "import > > org\.apache\.geode.*internal" reveals 35 occurrences, the most pertinent > > ones being... > > > > org.apache.geode.internal.GemFireVersion (used in debugging) > > org.apache.geode.internal.DistributionLocator > > org.apache.geode.internal.InternalDataSerializer > > org.apache.geode.internal.cache.GemFireCacheImpl > > org.apache.geode.internal.cache.LocalRegion (used to inspect whether a > > server proxy is present to acquire the appropriate QueryService) > > org.apache.geode.internal.cache.PartitionedRegion > > org.apache.geode.internal.cache.UserSpecifiedRegionAttributes > > org.apache.geode.internal.cache.lru.LRUCapacityController > > org.apache.geode.internal.cache.lru.MemLRUCapacityController > > org.apache.geode.internal.cache.query.internal.ResultsBag > > org.apache.geode.internal.distributed.internal.DistributionConfig > > org.apache.geode.internal.distributed.internal.InternalDistributedSystem > > org.apache.geode.internal.distributed.internal.InternalLocator > > org.apache.geode.internal.datasource.ConfigProperty (JNDI support) > > org.apache.geode.internal.jndi.JNDIInvoker (JNDI support) > > org.apache.geode.internal.security.SecurityService (my doing) > > > > Most of this was added before my time. I just need time to review these > > more carefully, and how each is used. I know many of these are used for > > good reason. > > > > Thanks, > > John > > > > > > [1] > > http://docs.spring.io/spring-data-gemfire/docs/current/api/ > > org/springframework/data/gemfire/client/support/package-summary.html > > [2] > > http://docs.spring.io/spring-data-gemfire/docs/current/api/ > > org/springframework/data/gemfire/client/PoolFactoryBean.html > > > > > > On Thu, May 18, 2017 at 10:18 AM, Bruce Schuchardt < > bschucha...@pivotal.io > > > > > wrote: > > > > > John, is it possible to list the internal APIs needed by SDG? I don't > > > think we can live with a requirement that all internal API changes need > > to > > > be communicated and blessed. We need to address SDG's needs in the > > public > > > APIs and get rid of this dependency. > > > > > > > > > Le 5/18/2017 à 9:36 AM, Kirk Lund a écrit : > > > > > >> Hi John! How did the addition of getOnlineLocators() cause SDG build > to > > >> fail? I checked [9] but I couldn't quite grok what happened. I > would've > > >> thought that adding would be ok but removing could potentially break > > SDG. > > >> > > >> The InternalDataSerializer change was probably mine. I reduced scope > of > > >> methods and variables where possible. Sorry about that. Do you need me > > to > > >> restore getSerializer to public? > > >> > > >> On Wed, May 17, 2017 at 4:42 PM, John Blum <jb...@pivotal.io> wrote: > > >> > > >> Geode devs- > > >>> > > >>> I am not sure how decisions are made when changing Geode's API, but I > > >>> would > > >>> caution that more care should be taken when doing so, regardless of > > >>> whether > > >>> the APIs are public or not, but especially when they are public. > > >>> > > >>> Unfortunately, in this particular case, the API in question is deemed > > >>> "internal", which I know, are subject to change. However, the > problem > > >>> with > > >>> this is, the public API is insufficient in some cases, particularly > for > > >>> "frameworks" (e.g. SDG) and "tooling" building on Geode and > attempting > > to > > >>> uphold Geode's functional/behavioral contract. > > >>> > > >>> By way of example, a recent *Spring Data Geode* build broke > > >>> <https://build.spring.io/browse/SGF-NAG-556/log> [1] because, the > > >>> org.apache.geode.internal.InternalDataSerializer class was recently > > >>> changed. The scope of getSerializer(:Class):DataSerializer was > changed > > >>> from *public > > >>> <https://github.com/apache/geode/blob/rel/v1.1.1/geode- > > >>> core/src/main/java/org/apache/geode/internal/InternalDataSer > > >>> ializer.java# > > >>> L1113>* > > >>> [2] > > >>> to *private > > >>> <https://github.com/apache/geode/blob/a44585316a8d7eed35917c1dfd8293 > > >>> 15b34ce316/geode-core/src/main/java/org/apache/geode/internal/ > > >>> InternalDataSerializer.java#L1090>* > > >>> [3] > > >>> in a seemingly unrelated commit. > > >>> > > >>> There is a class > > >>> <https://github.com/spring-projects/spring-data-geode/ > > >>> blob/master/src/main/java/org/springframework/data/gemfire/ > > >>> serialization/EnumSerializer.java#L39> > > >>> [4] > > >>> in SDG that extends DataSerializer > > >>> <http://gemfire-90-javadocs.docs.pivotal.io/org/apache/ > > >>> geode/DataSerializer.html> > > >>> [5] > > >>> (in Geode's public API) but must use the InternalDataSerializer > > (internal > > >>> Geode API) when changes (e.g. "supported classes") to the SDG > > serializer > > >>> need to be "distributed" across the cluster. SDG"s serializer use to > > >>> call > > >>> this getSerializer(:Class):DataSerializer method. However, in this > > >>> case, > > >>> I > > >>> fixed the problem by not calling this "overloaded" method as it was > not > > >>> strictly necessary. > > >>> > > >>> While I am trying to avoid the use of "internal" Geode classes and > APIs > > >>> in > > >>> SDG in general, as I mention above, this is not always possible. For > > >>> instance, there are a few API blunders such as the ability to > register > > >>> <http://gemfire-90-javadocs.docs.pivotal.io/org/apache/ > > >>> geode/DataSerializer.html#register-java.lang.Class-> > > >>> [6] > > >>> a DataSerializer class but not "unregister" it; that is in > > >>> <https://github.com/apache/geode/blob/rel/v1.1.1/geode- > > >>> core/src/main/java/org/apache/geode/internal/InternalDataSer > > >>> ializer.java# > > >>> L1077> > > >>> [7] > > >>> InternalDataSerializer. The other bad API practices on this class > > (i.e. > > >>> (Internal)DataSerializer) alone. > > >>> > > >>> Framework and tool developers must occasionally rely on "internal" > APIs > > >>> (especially when the public API is insufficient) to order to achieve > a > > >>> similar experience to Geode alone; something to keep in mind as > Geode's > > >>> ecosystem grows. > > >>> > > >>> Finally, I'll also add that, I do need to know anytime the public API > > >>> changes as well. Recently the getOnlineLocators() method > > >>> <https://github.com/apache/geode/blob/61f676b0187e8918ca62f4a2ec9b6b > > >>> d3baa942d3/geode-core/src/main/java/org/apache/geode/ > > >>> cache/client/Pool.java#L210> > > >>> [8] > > >>> was added to org.apache.geode.cache.client.Pool, which caused > another > > >>> SDG > > >>> build <https://build.spring.io/browse/SGF-NAG-552> [9] to fail. > > >>> > > >>> Special thank you to *Nabarun* and *Diane* for the recent heads about > > the > > >>> LuceneQueryFactory method name change... from setResultLimit(:int) to > > >>> setLimit(:int). > > >>> > > >>> Regards, > > >>> > > >>> -- > > >>> -John > > >>> > > >>> > > >>> [1] https://build.spring.io/browse/SGF-NAG-556/log > > >>> [2] > > >>> https://github.com/apache/geode/blob/rel/v1.1.1/geode- > > >>> core/src/main/java/org/apache/geode/internal/InternalDataSer > > >>> ializer.java# > > >>> L1113 > > >>> [3] > > >>> https://github.com/apache/geode/blob/a44585316a8d7eed35917c1dfd8293 > > >>> 15b34ce316/geode-core/src/main/java/org/apache/geode/internal/ > > >>> InternalDataSerializer.java#L1090 > > >>> [4] > > >>> https://github.com/spring-projects/spring-data-geode/ > > >>> blob/master/src/main/java/org/springframework/data/gemfire/ > > >>> serialization/EnumSerializer.java#L39 > > >>> [5] > > >>> http://gemfire-90-javadocs.docs.pivotal.io/org/apache/ > > >>> geode/DataSerializer.html > > >>> [6] > > >>> http://gemfire-90-javadocs.docs.pivotal.io/org/apache/ > > >>> geode/DataSerializer.html#register-java.lang.Class- > > >>> [7] > > >>> https://github.com/apache/geode/blob/rel/v1.1.1/geode- > > >>> core/src/main/java/org/apache/geode/internal/InternalDataSer > > >>> ializer.java# > > >>> L1077 > > >>> [8] > > >>> https://github.com/apache/geode/blob/61f676b0187e8918ca62f4a2ec9b6b > > >>> d3baa942d3/geode-core/src/main/java/org/apache/geode/ > > >>> cache/client/Pool.java#L210 > > >>> [9] https://build.spring.io/browse/SGF-NAG-552 > > >>> > > >>> > > > > > > > > > -- > > -John > > john.blum10101 (skype) > > > -- -John john.blum10101 (skype)