And now by module, $ find . -iname '*.java' -exec grep -n '@VisibleForTesting' {} \+ | cut -d/ -f2 | sort | uniq -c 6 hbase-backup 87 hbase-client 40 hbase-common 1 hbase-endpoint 7 hbase-hadoop-compat 3 hbase-http 18 hbase-mapreduce 1 hbase-metrics-api 24 hbase-procedure 10 hbase-replication 456 hbase-server 2 hbase-thrift 1 hbase-zookeeper
I prefer we not make this change a prerequisite to 2.3. I would rather we restore the one method modified by HBASE-24221 and do the work for VisibleForTesting for 2.4.0. On Thu, Jun 25, 2020 at 12:57 PM Nick Dimiduk <ndimi...@apache.org> wrote: > On Thu, Jun 25, 2020 at 12:36 PM Andrew Purtell <apurt...@apache.org> > wrote: > >> I think we are in agreement except for a need to have a deprecation cycle. >> Just remove VisibleForTesting and replace with whatever alternative you >> like. Certainly in the next minors. No strong opinion either way about >> patch releases, leave as is? >> > > Thanks Andrew and Bharath, I now better understand your positions. > > The annotation is fairly common in our codebase, from branch-2.3, > > $ find . -iname '*.java' -exec grep -n '@VisibleForTesting' {} \+ | wc -l > 668 > > I don't have an easy way to cross-reference this with our AI annotations, > but my concern is that any change we make here without a deprecation cycle > will be disruptive to users. > > On Thu, Jun 25, 2020 at 11:30 AM Nick Dimiduk <ndimi...@apache.org> wrote: >> >> > On Wed, Jun 24, 2020 at 3:19 PM Andrew Purtell <apurt...@apache.org> >> > wrote: >> > >> > > It is possible some users may not understand what Guava's >> > VisibleForTesting >> > > implies, but those users are much more likely to be Java developers or >> > Java >> > > developer adjacent, and familiar with what this fad entailed. Such >> > tagging >> > > was/is done specifically to indicate the exposed field or method was >> only >> > > made to allow test access to internals, as something less than public. >> > > >> > > For us to treat such annotated fields and methods as public after all >> is >> > > unnecessary, possibly surprising, and not semantically sound (IMHO). >> > > >> > >> > I don't want to preserve use of VisibleForTesting as an indicator of >> public >> > API. I want to ensure that we're clear to our downstream users >> > that its presence is not a factor in determining public API. For >> example, I >> > don't want to update our book to give any meaning to this annotation, >> and I >> > don't want to update our javadoc filters to take it into account when >> > generating the various versions of javadoc that we publish. I want to >> purge >> > it from the discussion by annotating the methods it decorates with the >> > symbols we do use to define our public API. The steps I propose above >> are >> > my suggestion of how we work toward that goal. >> > >> > Does anyone have a counter-proposal to the steps I've outlined above? A >> > resolution to this discussion is now the final blocker on 2.3.0rc1. >> > >> > Thanks, >> > Nick >> > >> > On Wed, Jun 24, 2020 at 2:53 PM Sean Busbey <bus...@apache.org> wrote: >> > > >> > > > Andrew are you specifically opposed to using a deprecation cycle to >> > > > formally label as private anything that currently has a >> > VisibleForTesting >> > > > annotation? >> > > > >> > > > On Wed, Jun 24, 2020, 16:07 Andrew Purtell <apurt...@apache.org> >> > wrote: >> > > > >> > > > > I am -1 on treating VisibleForTesting as public API. Semantically >> it >> > > > makes >> > > > > no sense. >> > > > > >> > > > > On Wed, Jun 24, 2020 at 12:22 PM Nick Dimiduk < >> ndimi...@apache.org> >> > > > wrote: >> > > > > >> > > > > > I'd like to get this [DISCUSS] wrapped up so we can proceed with >> > > > release >> > > > > > candidates. >> > > > > > >> > > > > > I don't see a clear consensus here. The conclusion I read is >> that >> > > > > > developers generally intended the VisibleForTesting annotation >> to >> > > > > indicate >> > > > > > a method is not a part of our public API, but because we don't >> > > > explicitly >> > > > > > say this in our guide, we can't really stand on that for the >> > > community. >> > > > > > >> > > > > > I propose we take the following, conservative steps going >> forward: >> > > > > > >> > > > > > 1. restore any VisibleForTesting method signatures for 2.3.0, >> treat >> > > > this >> > > > > as >> > > > > > public API going forward. >> > > > > > 2. annotate any existing methods carrying the VisibleForTesting >> > > > > annotation >> > > > > > as Deprecated in 2.3.x+, for removal in 4.0.0 >> > > > > > 3. purge the VisibleForTesting annotation from our codebase for >> > > 4.0.0, >> > > > > > involving: >> > > > > > 3a. replace VisibleForTesting with IA.Private anywhere method >> > > > visibility >> > > > > > cannot be limited >> > > > > > 3b. perhaps add a new Yetus check that would ban new use of >> > > > > > VisibleForTesting >> > > > > > >> > > > > > Did I miss anything? >> > > > > > >> > > > > > Thanks, >> > > > > > Nick >> > > > > > >> > > > > > On Wed, Jun 24, 2020 at 12:22 AM Viraj Jasani < >> vjas...@apache.org> >> > > > > wrote: >> > > > > > >> > > > > > > +1 to "be clear in javadoc" and to the fact that guava >> dependency >> > > > just >> > > > > to >> > > > > > > express intention which can be done through javadoc is not >> > > > > > > required unless the library is capable of breaking >> compilation of >> > > > > > > downstream >> > > > > > > projects if they use VFT annotated classes/methods saying you >> > can't >> > > > use >> > > > > > > this >> > > > > > > (what if we have such fancy thing? :) ). >> > > > > > > >> > > > > > > >> > > > > > > On 2020/06/23 20:01:40, Sean Busbey <bus...@apache.org> >> wrote: >> > > > > > > > +1 to "do it in javadoc" unless there's some magic for IDEs >> > > brought >> > > > > > about >> > > > > > > > via the VFT annotation that I'm missing. >> > > > > > > > >> > > > > > > > On Tue, Jun 23, 2020, 13:04 Andrew Purtell < >> > apurt...@apache.org> >> > > > > > wrote: >> > > > > > > > >> > > > > > > > > I don't find the VisibleForTesting annotation provides a >> lot >> > of >> > > > > > value. >> > > > > > > It >> > > > > > > > > became fashionable to use this annotation when a single >> line >> > of >> > > > > > Javadoc >> > > > > > > > > would serve the same purpose and not make yet another >> > > dependency >> > > > on >> > > > > > > Guava. >> > > > > > > > > My advice is to remove them all and replace with Javadoc. >> > > > > > > > > >> > > > > > > > > Even if in an IA.Public or LimitedPrivate we can decorate >> > > > > individual >> > > > > > > > > field/methods that are public but not intended to be part >> of >> > > the >> > > > > > public >> > > > > > > > > portion of the API with a field or method level IA.Private >> > > > > > decoration. >> > > > > > > It's >> > > > > > > > > maybe not nice to do, but that would directly and clearly >> > > express >> > > > > > > intent. >> > > > > > > > > >> > > > > > > > > On Tue, Jun 23, 2020 at 10:15 AM Sean Busbey < >> > > bus...@apache.org> >> > > > > > > wrote: >> > > > > > > > > >> > > > > > > > > > I think the intent behind VisibleForTesting is clear: >> the >> > > > person >> > > > > > > using >> > > > > > > > > that >> > > > > > > > > > annotation does not intend for it to be used by >> > > downstreamers. >> > > > > > > > > > >> > > > > > > > > > However, our stated API promises are in terms of the >> > > Interface >> > > > > > > Audience >> > > > > > > > > > annotations only. So I think a downsteamer who e.g. used >> > > > > automated >> > > > > > > > > tooling >> > > > > > > > > > to ensure they only used things marked IA.Public would >> be >> > > > correct >> > > > > > to >> > > > > > > be >> > > > > > > > > > upset with us if we incompatibly changed an IA.Public >> > member >> > > > that >> > > > > > is >> > > > > > > > > > annotated VisibleForTesting. >> > > > > > > > > > >> > > > > > > > > > Given that VisibleForTesting is in guava and we go to >> pains >> > > to >> > > > > > about >> > > > > > > > > > exposing downstream to non-relocated guava I think it >> would >> > > be >> > > > a >> > > > > > bad >> > > > > > > idea >> > > > > > > > > > to use it when defining our public API. >> > > > > > > > > > >> > > > > > > > > > We should find places that use it, make sure they also >> > carry >> > > an >> > > > > > > > > IA.Private >> > > > > > > > > > if needed, and make sure our docs for developers are >> clear >> > > > about >> > > > > > > which >> > > > > > > > > > annotations carry meaning for downstreamers (i.e. only >> > > > Interface >> > > > > > > Audience >> > > > > > > > > > and Interface Stability). >> > > > > > > > > > >> > > > > > > > > > On Tue, Jun 23, 2020, 11:29 Nick Dimiduk < >> > > ndimi...@apache.org> >> > > > > > > wrote: >> > > > > > > > > > >> > > > > > > > > > > My hope is that we can clarify our policy and update >> the >> > > book >> > > > > > > > > > accordingly. >> > > > > > > > > > > >> > > > > > > > > > > On Tue, Jun 23, 2020 at 9:01 AM Wellington Chevreuil < >> > > > > > > > > > > wellington.chevre...@gmail.com> wrote: >> > > > > > > > > > > >> > > > > > > > > > > > > >> > > > > > > > > > > > > For the current problem, what is the class? I >> think >> > > > > changing >> > > > > > a >> > > > > > > > > method >> > > > > > > > > > > > > signature for a protected method will only break >> the >> > > > > > > compatibility >> > > > > > > > > > when >> > > > > > > > > > > > > users extend the class. >> > > > > > > > > > > > > >> > > > > > > > > > > > This specific case is >> > > > > > *LoadIncrementalHFiles.tryAtomicRegionLoad, >> > > > > > > > > > *mostly >> > > > > > > > > > > > an end user tool, not likely to be extended. Bring >> back >> > > the >> > > > > > > original >> > > > > > > > > > > method >> > > > > > > > > > > > would not be much of an issue, though, I guess the >> > > > discussion >> > > > > > is >> > > > > > > more >> > > > > > > > > > on >> > > > > > > > > > > > how to interpret @VisibleForTesting in general. >> > > > > > > > > > > > >> > > > > > > > > > > > Em ter., 23 de jun. de 2020 às 15:42, 张铎(Duo Zhang) >> < >> > > > > > > > > > > palomino...@gmail.com >> > > > > > > > > > > > > >> > > > > > > > > > > > escreveu: >> > > > > > > > > > > > >> > > > > > > > > > > > > Technically, I do not think the developer who >> makes a >> > > > field >> > > > > > or >> > > > > > > > > method >> > > > > > > > > > > > > public for an IA.Public class but marks it with >> > > > > > > @VisibleForTesting, >> > > > > > > > > > > > > actually wants to expose this field or method to >> end >> > > > users. >> > > > > > > > > > > > > But this could be a problem for end users, so I >> think >> > > we >> > > > > > should >> > > > > > > > > avoid >> > > > > > > > > > > > doing >> > > > > > > > > > > > > this on an IA.Public class in the future. >> > > > > > > > > > > > > >> > > > > > > > > > > > > For the current problem, what is the class? I >> think >> > > > > changing >> > > > > > a >> > > > > > > > > method >> > > > > > > > > > > > > signature for a protected method will only break >> the >> > > > > > > compatibility >> > > > > > > > > > when >> > > > > > > > > > > > > users extend the class. In fact, most of the >> classes >> > in >> > > > our >> > > > > > > public >> > > > > > > > > > API >> > > > > > > > > > > > are >> > > > > > > > > > > > > not designed to be extended by end users. >> > > > > > > > > > > > > >> > > > > > > > > > > > > Thanks. >> > > > > > > > > > > > > >> > > > > > > > > > > > > Wellington Chevreuil < >> wellington.chevre...@gmail.com >> > > >> > > > > > > > > 于2020年6月23日周二 >> > > > > > > > > > > > > 下午10:33写道: >> > > > > > > > > > > > > >> > > > > > > > > > > > > > My opinion expressed on the 2.3.0RC0 thread was >> > that >> > > > > > > > > > > @VisibleForTesting >> > > > > > > > > > > > > > would flag class/method/variable as private. I >> > > believe >> > > > > the >> > > > > > > > > > annotation >> > > > > > > > > > > > > label >> > > > > > > > > > > > > > is pretty suggestive and (I also believe) it's >> > common >> > > > > sense >> > > > > > > that >> > > > > > > > > it >> > > > > > > > > > > > > should >> > > > > > > > > > > > > > be treated as private by developers. I don't >> think >> > > the >> > > > > fact >> > > > > > > it's >> > > > > > > > > > > > > > omitted from our guidelines changes perception >> of >> > it. >> > > > > > > > > > > > > > >> > > > > > > > > > > > > > Em ter., 23 de jun. de 2020 às 01:15, Bharath >> > > > > Vissapragada >> > > > > > < >> > > > > > > > > > > > > > bhara...@apache.org> escreveu: >> > > > > > > > > > > > > > >> > > > > > > > > > > > > > > Sorry, I should've been clearer. It's the >> former. >> > > My >> > > > > > point >> > > > > > > is, >> > > > > > > > > > any >> > > > > > > > > > > > > method >> > > > > > > > > > > > > > > tagged with @VisibleForTesting is only >> intended >> > for >> > > > > > testing >> > > > > > > > > > > purposes >> > > > > > > > > > > > > and >> > > > > > > > > > > > > > > should _not_ be considered public, its >> visibility >> > > > scope >> > > > > > is >> > > > > > > > > wider >> > > > > > > > > > > than >> > > > > > > > > > > > > > > necessary only because it was needed by some >> test >> > > > > method. >> > > > > > > > > That's >> > > > > > > > > > > how >> > > > > > > > > > > > > I'd >> > > > > > > > > > > > > > > interpret it (Actually, that's what I thought >> you >> > > > > meant, >> > > > > > > now >> > > > > > > > > I'm >> > > > > > > > > > > > > confused >> > > > > > > > > > > > > > > :-)). >> > > > > > > > > > > > > > > >> > > > > > > > > > > > > > > On Mon, Jun 22, 2020 at 4:02 PM Nick Dimiduk < >> > > > > > > > > > ndimi...@apache.org> >> > > > > > > > > > > > > > wrote: >> > > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > On Mon, Jun 22, 2020 at 3:45 PM Bharath >> > > > Vissapragada >> > > > > < >> > > > > > > > > > > > > > > bhara...@apache.org> >> > > > > > > > > > > > > > > > wrote: >> > > > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > I share the same opinion. Infact hadoop >> (from >> > > > which >> > > > > > our >> > > > > > > > > > > > annotations >> > > > > > > > > > > > > > are >> > > > > > > > > > > > > > > > > derived I believe), talks about this, >> "Also, >> > > > > certain >> > > > > > > APIs >> > > > > > > > > are >> > > > > > > > > > > > > > annotated >> > > > > > > > > > > > > > > > as >> > > > > > > > > > > > > > > > > @VisibleForTesting (from com.google.common >> > > > > > > > > > > > > > > > .annotations.VisibleForTesting) >> > > > > > > > > > > > > > > > > - these are meant to be used strictly for >> > unit >> > > > > tests >> > > > > > > and >> > > > > > > > > > should >> > > > > > > > > > > > be >> > > > > > > > > > > > > > > > treated >> > > > > > > > > > > > > > > > > as “Private” APIs." >> > > > > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > >> > > > > > > > > > > > > > > >> > > > > > > > > > > > > > >> > > > > > > > > > > > > >> > > > > > > > > > > > >> > > > > > > > > > > >> > > > > > > > > > >> > > > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > >> > > >> > >> https://hadoop.apache.org/docs/r3.1.2/hadoop-project-dist/hadoop-common/InterfaceClassification.html >> > > > > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > Sorry Bharath, I don't follow. Are you >> saying >> > "I >> > > > > share >> > > > > > > the >> > > > > > > > > > > opinion >> > > > > > > > > > > > > that >> > > > > > > > > > > > > > > the >> > > > > > > > > > > > > > > > VisibleForTesting annotation should be >> > considered >> > > > as >> > > > > > > > > defining a >> > > > > > > > > > > > > method >> > > > > > > > > > > > > > as >> > > > > > > > > > > > > > > > IA.Private," and this is an omission from >> our >> > > > > community >> > > > > > > > > > > guidelines >> > > > > > > > > > > > > > > > document? Or are you saying "no, it does not >> > > count >> > > > as >> > > > > > an >> > > > > > > > > > > interface >> > > > > > > > > > > > > > > audience >> > > > > > > > > > > > > > > > marker," and we are obliged to treat methods >> > such >> > > > as >> > > > > in >> > > > > > > this >> > > > > > > > > > > > example >> > > > > > > > > > > > > as >> > > > > > > > > > > > > > > > public API? >> > > > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > Thanks, >> > > > > > > > > > > > > > > > Nick >> > > > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > On Mon, Jun 22, 2020 at 10:15 AM Sean >> Busbey < >> > > > > > > > > > bus...@apache.org> >> > > > > > > > > > > > > > wrote: >> > > > > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > Yeah I would say no as well. We should >> make >> > > > clear >> > > > > > on >> > > > > > > our >> > > > > > > > > > dev >> > > > > > > > > > > > > guide >> > > > > > > > > > > > > > > that >> > > > > > > > > > > > > > > > > you >> > > > > > > > > > > > > > > > > > also should be marking those things >> with an >> > > > > > Interface >> > > > > > > > > > > Audience >> > > > > > > > > > > > > > > marking >> > > > > > > > > > > > > > > > if >> > > > > > > > > > > > > > > > > > you don't intend them to be at the >> > downstream >> > > > API >> > > > > > > > > > visibility >> > > > > > > > > > > of >> > > > > > > > > > > > > the >> > > > > > > > > > > > > > > > > parent >> > > > > > > > > > > > > > > > > > class. >> > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > (IIRC we also use VisibleForTesting in >> > > > IA.Private >> > > > > > > classes >> > > > > > > > > > to >> > > > > > > > > > > > > > > > proactively >> > > > > > > > > > > > > > > > > > explain why some internal looking >> member is >> > > at >> > > > a >> > > > > > > wider >> > > > > > > > > Java >> > > > > > > > > > > > > access >> > > > > > > > > > > > > > > > > scope.) >> > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > On Mon, Jun 22, 2020, 11:39 Nick >> Dimiduk < >> > > > > > > > > > > ndimi...@apache.org> >> > > > > > > > > > > > > > > wrote: >> > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > Hello, >> > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > This came up over on the 2.3.0RC0 >> thread, >> > > so >> > > > > > let's >> > > > > > > open >> > > > > > > > > > it >> > > > > > > > > > > > for >> > > > > > > > > > > > > > > proper >> > > > > > > > > > > > > > > > > > > discussion. In that context, we >> observe >> > > > method >> > > > > > > > > signature >> > > > > > > > > > > > > changes >> > > > > > > > > > > > > > > to a >> > > > > > > > > > > > > > > > > > > method marked with the Guava >> > > > VisibleForTesting >> > > > > > > > > > annotation. >> > > > > > > > > > > > The >> > > > > > > > > > > > > > > method >> > > > > > > > > > > > > > > > > is >> > > > > > > > > > > > > > > > > > a >> > > > > > > > > > > > > > > > > > > protected method on a IA.Public class. >> > > There >> > > > is >> > > > > > no >> > > > > > > > > > > > method-level >> > > > > > > > > > > > > > IA >> > > > > > > > > > > > > > > > > > > annotation. >> > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > Do we consider the VisibleForTesting >> > > > annotation >> > > > > > as >> > > > > > > a >> > > > > > > > > > > > specifier >> > > > > > > > > > > > > > for >> > > > > > > > > > > > > > > > our >> > > > > > > > > > > > > > > > > > > compatibility guidelines? >> > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > I am of the opinion that no, it is >> not an >> > > > > > > > > > InterfaceAudience >> > > > > > > > > > > > > > > > annotation, >> > > > > > > > > > > > > > > > > > and >> > > > > > > > > > > > > > > > > > > so it is not applicable for defining >> our >> > > > public >> > > > > > > API. >> > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > What do you think? >> > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > Thanks, >> > > > > > > > > > > > > > > > > > > Nick >> > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > >> > > > > > > > > > > > > > > >> > > > > > > > > > > > > > >> > > > > > > > > > > > > >> > > > > > > > > > > > >> > > > > > > > > > > >> > > > > > > > > > >> > > > > > > > > >> > > > > > > > > >> > > > > > > > > -- >> > > > > > > > > Best regards, >> > > > > > > > > Andrew >> > > > > > > > > >> > > > > > > > > Words like orphans lost among the crosstalk, meaning torn >> > from >> > > > > > truth's >> > > > > > > > > decrepit hands >> > > > > > > > > - A23, Crosstalk >> > > > > > > > > >> > > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > >> > > > > -- >> > > > > Best regards, >> > > > > Andrew >> > > > > >> > > > > Words like orphans lost among the crosstalk, meaning torn from >> > truth's >> > > > > decrepit hands >> > > > > - A23, Crosstalk >> > > > > >> > > > >> > > >> > > >> > > -- >> > > Best regards, >> > > Andrew >> > > >> > > Words like orphans lost among the crosstalk, meaning torn from truth's >> > > decrepit hands >> > > - A23, Crosstalk >> > > >> > >> >> >> -- >> Best regards, >> Andrew >> >> Words like orphans lost among the crosstalk, meaning torn from truth's >> decrepit hands >> - A23, Crosstalk >> >