Hi Tom and Colin, I see. Thanks for the comprehensive explanation. I learned a lot.
Although my approach includes a new member field `DescribeLogDirsResult.LogDirInfo.tpToReplicaInfos` to keep binary compatibility, but anyway, you are right - it does not worth except small consistency gain. Best, Dongjin On Fri, Jul 10, 2020 at 3:07 PM Colin McCabe <cmcc...@apache.org> wrote: > Incidentally, whenever we do a hard compatibility break with this API, we > should probably get rid of the function that iterates over every replica on > the broker. That's not a scalable API for the future. We also probably > should have an API to list just the directories that are moving, which is > what most tools care about anyway. > > best, > Colin > > > On Thu, Jul 9, 2020, at 23:04, Colin McCabe wrote: > > Yeah. The issue with subclassing is that it's a source compatibility > > break, although not (I think) a binary compatibility break. I don't > > think it's really worth it given that it leaves us with a weird class > > hierarchy, and we still need to do a hard compatibility break later to > > fix the real problem with either solution. > > > > best, > > Colin > > > > > > On Thu, Jul 9, 2020, at 08:39, Tom Bentley wrote: > > > Hi Dongjin, > > > > > > Thanks for updating the link and sorry that you put effort into writing > > > your own KIP for this. I was aware of KAFKA-8794, but since the PR was > > > about javadocing the internal classes I felt it wasn't quite the same > > > thing. All the same, I should have pinged you on KAFKA-8794, sorry. > > > > > > I did consider subclassing too. Initially I thought it would be binary > > > incompatible, but thinking about it more I realise that, perhaps, it's > > > binary compatible due to erasure, (I'd have to test it to be sure, or > > > perhaps you've already done so, and can confirm). > > > > > > But I think there are a few other reasons to be considered: > > > > > > * The change would not be source compatible (people would have to > change > > > their source code) because the signature of all() and values() use type > > > arguments invariantly, i.e. KafkaFuture<Map<Integer, Map<String, > > > DescribeLogDirsResult .LogDirInfo>>> is not a subtype of > > > KafkaFuture<Map<Integer, Map<String, > DescribeLogDirsResponse.LogDirInfo>>> > > > so you'd get a compile time error as use sites where you were trying to > > > assign the new result to the old type (and this applies to all the > > > intermediate generic types too). > > > * There's also the fact that `replicaInfos` and `error` is accessed > via a > > > field, rather than a method. To fix that you would need to: > > > * Add methods to the new subclasses and deprecate the old fields > (so > > > that a user gets a warning if accessing the field, even though they've > > > eliminated the old class name from the code). > > > * As Colin has mentioned, you'd have to deprecate those classes and > fields, > > > even though they're not really deprecated from the internal PoV, > they're > > > only deprecated from the external PoV. > > > * Using subclassing in this way would introduce a different kind of > > > inconsistency: other APIs don't use internal classes at all, even via > > > inheritance. > > > * Using static member classes is inconsistent with other Admin APIs > such as > > > TopicDescription (though I think this is trivially fixed in your > proposal). > > > > > > The loss of consistency wrt to the method names in the approach > advocated > > > by KIP-621 could eventually be removed by adding "new" values() and > all() > > > methods back with those names but the new types. Indeed, I _think_ this > > > could be done in a major release without breaking SemVer. > > > > > > All considered, I think it's cleaner to deprecate the methods and > create > > > new classes completely independent of the internal ones. > > > > > > Kind regards, > > > > > > Tom > > > > > > On Thu, Jul 9, 2020 at 4:26 PM Dongjin Lee <dong...@apache.org> wrote: > > > > > > > Hi Colin, > > > > > > > > > > > > Thanks for the quick response. Sure, the problem is that the internal > > > > classes (DescribeLogDirsResponse.[LogDirInfo, ReplicaInfo], or 'the > old > > > > ones') are exposed to the public API, not the class itself. You are > right. > > > > > > > > > > > > However, deprecating DescribeLogDirsResult#[all, values] and > defining the > > > > new methods causes another problem: consistency. As of 2.5, most of > the > > > > admin result classes (listed below) have 'all' and 'values' methods. > Since > > > > these methods are public APIs, I think keeping consistency would be > better. > > > > > > > > > > > > > > > > - > > > > > > > > > https://kafka.apache.org/25/javadoc/org/apache/kafka/clients/admin/CreateTopicsResult.html > > > > - > > > > > > > > > https://kafka.apache.org/25/javadoc/org/apache/kafka/clients/admin/AlterPartitionReassignmentsResult.html > > > > - > > > > > > > > > https://kafka.apache.org/25/javadoc/org/apache/kafka/clients/admin/CreateAclsResult.html > > > > - > > > > > > > > > https://kafka.apache.org/25/javadoc/org/apache/kafka/clients/admin/AlterConfigsResult.html > > > > > > > > > > > > In contrast, my approach - deprecating the old ones and defining the > new > > > > ones (DescribeLogDirsResult.[LogDirInfo, ReplicaInfo]) that extends > the old > > > > counterpart - not only not breaking the consistency but also gives > the > > > > users the message that they have to use the new ones. > > > > > > > > > > > > So, the overall process would be: > > > > > > > > > > > > > > > > 1. Deprecate the old ones and make DescribeLogDirsResult#[all, > values] > > > > to return the new ones, without changing the return type. Since > the new > > > > ones extend the old ones, it does not cause any problems. > > > > 2. Since deprecation message guides to move to the new ones, the > uses > > > > will migrate to use the new classes. > > > > 3. After a time, do the following: > > > > 1. Change the return type of DescribeLogDirsResult#[all, > values] from > > > > old ones to the new ones, with a notice. Since we already > deprecated > > > > the > > > > old ones, most users would already be moved into the new ones. > So it > > > > does > > > > not occur any problems. > > > > 2. *Hide the old ones from the public, with removing the > deprecated > > > > annotation.* Since it is not exposed to the public anymore, it > also > > > > does not cause any problems - now we can use it freely in the > > > > internals. > > > > > > > > > > > > Is my intention clear now? If not, please have a brief look at my > draft > > > > implementation here <https://github.com/apache/kafka/pull/7204/files > >. > > > > > > > > > > > > Thanks, > > > > > > > > Dongjin > > > > > > > > On Thu, Jul 9, 2020 at 4:34 AM Colin McCabe <cmcc...@apache.org> > wrote: > > > > > > > > > Hi Dongjin, > > > > > > > > > > Hmm. I'm not sure I follow. How does deprecating > > > > > DescribeLogDirsResponse.LogDirInfo help here? The issue is not so > much > > > > the > > > > > class, but the fact that it's exposed as a public API. So it seems > > > > > appropriate to deprecate the methods that return it, but not the > class > > > > > itself, since we'll continue to use it internally. > > > > > > > > > > best, > > > > > Colin > > > > > > > > > > > > > > > On Wed, Jul 8, 2020, at 07:41, Dongjin Lee wrote: > > > > > > Hi Tom, > > > > > > > > > > > > Thanks for taking this issue. I opened a PR for this issue > earlier, but > > > > > > your KIP was submitted first. So I closed my one > > > > > > < > > > > > > > > > > https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=158866169 > > > > > > > > > > > > . > > > > > > > > > > > > I have a question: for consistency with other methods, how about > > > > > > maintaining the signature of DescribeLogDirsResult#[all, > values]? There > > > > > is > > > > > > an alternative approach to deprecate > > > > DescribeLogDirsResponse.[LogDirInfo, > > > > > > ReplicaInfo]. (Please have a look at my proposal.) > > > > > > > > > > > > Best, > > > > > > Dongjin > > > > > > > > > > > > +1. I updated the link to the discussion thread on your KIP > document. > > > > > > > > > > > > On 2020/06/29 09:31:53, Tom Bentley <t...@redhat.com> wrote: > > > > > > > Hi,> > > > > > > > > > > > > > > Does anyone have any comments about this? If not I'll likely > start a > > > > > > vote> > > > > > > > in a couple of days.> > > > > > > > > > > > > > > Kind regards,> > > > > > > > > > > > > > > Tom> > > > > > > > > > > > > > > On Mon, Jun 8, 2020 at 4:56 PM Tom Bentley <tb...@redhat.com> > > > > wrote:> > > > > > > > > > > > > > > > Hi all,> > > > > > > > >> > > > > > > > > I've opened a small KIP seeking to deprecate and replace a > couple > > > > of> > > > > > > > > methods of DescribeLogDirsResult which refer to internal > classes in > > > > > > their> > > > > > > > > return type.> > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > > > https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=158862109 > > > > > > > > > > > > > >> > > > > > > > > Please take a look if you have the time.> > > > > > > > >> > > > > > > > > Kind regards,> > > > > > > > >> > > > > > > > > Tom> > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > -- > > > > *Dongjin Lee* > > > > > > > > *A hitchhiker in the mathematical world.* > > > > > > > > > > > > > > > > > > > > *github: <http://goog_969573159/>github.com/dongjinleekr > > > > <https://github.com/dongjinleekr>keybase: > https://keybase.io/dongjinleekr > > > > <https://keybase.io/dongjinleekr>linkedin: > kr.linkedin.com/in/dongjinleekr > > > > <https://kr.linkedin.com/in/dongjinleekr>speakerdeck: > > > > speakerdeck.com/dongjin > > > > <https://speakerdeck.com/dongjin>* > > > > > > > > > > -- *Dongjin Lee* *A hitchhiker in the mathematical world.* *github: <http://goog_969573159/>github.com/dongjinleekr <https://github.com/dongjinleekr>keybase: https://keybase.io/dongjinleekr <https://keybase.io/dongjinleekr>linkedin: kr.linkedin.com/in/dongjinleekr <https://kr.linkedin.com/in/dongjinleekr>speakerdeck: speakerdeck.com/dongjin <https://speakerdeck.com/dongjin>*