That is what I meant. I will add topicSet() instead of changing the signature of topics() for compatibility reasons. But should we not add a @deprecated flag for topics() or do you want to keep it around for the long run?
On Thu, Jul 19, 2018 at 7:27 PM Guozhang Wang <wangg...@gmail.com> wrote: > We cannot change the signature of the function named "topics" from "String" > to "Set<String>", as Matthias mentioned it is a compatibility breaking > change. > > That's why I was proposing add a new function like "Set<String> > topicSet()", while keeping "String topics()" as is. > > Guozhang > > On Thu, Jul 19, 2018 at 5:22 PM, Nishanth Pradeep <nishanth...@gmail.com> > wrote: > > > Right, adding topicNames() instead of changing the return type of > topics() > > in order preserve backwards compatibility is a good idea. But is it not > > better to depreciate topics() because it would be redundant? In our case, > > it would only be calling topicNames/topicSet#toString(). > > > > I still agree that perhaps changing the other API's might be unnecessary > > since it's only a name change. > > > > I have made the change to the KIP to only add, not change, preexisting > > APIs. But where do we stand on deprecating topics()? > > > > Best, > > Nishanth Pradeep > > > > On Thu, Jul 19, 2018 at 1:44 PM Guozhang Wang <wangg...@gmail.com> > wrote: > > > > > Personally I'd prefer to keep the deprecation-related changes as small > as > > > possible unless they are really necessary, and hence I'd prefer to just > > add > > > > > > List<String> topicList() /* or Set<String> topicSet() */ > > > > > > in addition to topicPattern to Source, in addition to > > `topicNameExtractor` > > > to Sink, and leaving the current APIs as-is. > > > > > > Guozhang > > > > > > On Thu, Jul 19, 2018 at 10:36 AM, Matthias J. Sax < > matth...@confluent.io > > > > > > wrote: > > > > > > > Thanks for updating the KIP. > > > > > > > > The current `Source` interface has a method `String topics()` atm. > > Thus, > > > > we cannot just add `Set<String> Source#topics()` because this would > > > > replace the existing method and would be an incompatible change. > > > > > > > > I think, we should deprecate `String topics()` and add a method with > > > > different name: > > > > > > > > `Set<String> Source#topicNames()` > > > > > > > > The method name `topicNames` is more appropriate anyway, as we > return a > > > > set of String (ie, names) but no `Topic` objects. This raises one > more > > > > thought: we might want to rename `Processor#stores()` to > > > > `Processor#storeNames()` as well ass `Sink#topic()` to > > > > `Sink#topicName()`, too. This would keep the naming in the API > > > consistent. > > > > > > > > > > > > WDYT? Hope that other can chime in as well. > > > > > > > > > > > > -Matthias > > > > > > > > On 7/18/18 7:49 PM, Nishanth Pradeep wrote: > > > > > I have revised the KIP > > > > > <https://cwiki.apache.org/confluence/display/KAFKA/KIP- > > 321%3A+Update+ > > > > TopologyDescription+to+better+represent+Source+and+Sink+Nodes>. > > > > > Here is a summary of the changes. > > > > > > > > > > 1. Changed return type from String to Set<String> for > > > Source#topics(). > > > > > > > > > > Set<String> Source#topics() > > > > > > > > > > 2. Added method in TopologyDescription#Source to return the > > Pattern > > > > used > > > > > by the Source node. > > > > > > > > > > Pattern Source#topicPattern() > > > > > > > > > > 3. Changed return type of Sink#topicNameExtractor from Class<? > > > extends > > > > > TopicNameExtractor> to just TopicNameExtractor. > > > > > > > > > > TopicNameExtractor Sink#topicNameExtractor() > > > > > > > > > > Best, > > > > > Nishanth Pradeep > > > > > > > > > > On Sun, Jul 15, 2018 at 11:24 PM Guozhang Wang <wangg...@gmail.com > > > > > > wrote: > > > > > > > > > >> Hi Nishanth, > > > > >> > > > > >> Since even combining these two the scope is still relatively small > > I'd > > > > >> suggest just do it in one KIP if you're willing to work on them. > If > > > you > > > > do > > > > >> not then pleas feel free to create the JIRA for the second step so > > > that > > > > >> others can pick it up. > > > > >> > > > > >> > > > > >> Guozhang > > > > >> > > > > >> On Sun, Jul 15, 2018 at 6:14 PM, Matthias J. Sax < > > > matth...@confluent.io > > > > > > > > > >> wrote: > > > > >> > > > > >>> There is no general protocol. We can include the changes in the > > > current > > > > >>> KIP or do a second KIP. > > > > >>> > > > > >>> If you don't want to include the change in this KIP, please > create > > a > > > > new > > > > >>> JIRA to track the other changes. You can assign the JIRA to > > yourself > > > > and > > > > >>> start a second KIP if you want. You can also "link" both JIRAs as > > > > >>> related to each other. > > > > >>> > > > > >>> > > > > >>> -Matthias > > > > >>> > > > > >>> On 7/15/18 12:50 PM, Nishanth Pradeep wrote: > > > > >>>> Thank you for the comments! I agree with these changes. > > > > >>>> > > > > >>>> So is the general protocol to update the same KIP, or is to > scrap > > > the > > > > >>>> current KIP and create a new one since it's beyond the scope of > > the > > > > >>>> original KIP? I am happy to do either. > > > > >>>> > > > > >>>> On Wed, Jul 4, 2018 at 1:48 PM Matthias J. Sax < > > > matth...@confluent.io > > > > > > > > > >>>> wrote: > > > > >>>> > > > > >>>>> Sounds good to me. > > > > >>>>> > > > > >>>>> -Matthias > > > > >>>>> > > > > >>>>> On 7/4/18 10:53 AM, Guozhang Wang wrote: > > > > >>>>>> After looked through the current TopologyDescription I think > I'd > > > > want > > > > >>> to > > > > >>>>>> combine the suggestions from John and Matthias on the API > > > proposal. > > > > >> The > > > > >>>>>> motivations is that we have two relatively different > > > functionalities > > > > >>>>>> provided from the APIs today: > > > > >>>>>> > > > > >>>>>> 1. Each interface's public functions, like > > > > >>>>>> SourceNode#topics(), GlobalStore#source(), which returns > > > non-String > > > > >>> typed > > > > >>>>>> data. The hope was to let users programmatically leverage on > > those > > > > >> APIs > > > > >>>>> for > > > > >>>>>> runtime checking. > > > > >>>>>> 2. Each interface's impl class also have an implicit > toString() > > > > >>>>> overridden > > > > >>>>>> to print the necessary information. This was designed for > > > debugging > > > > >>>>>> purposes only during development cycles. > > > > >>>>>> > > > > >>>>>> What we've observed so far, though, is that users leverage 2) > > much > > > > >> more > > > > >>>>>> than 1) in practice, since it is more convienent to parse > > strings > > > > >> than > > > > >>>>>> recursively calling the APIs to get non-string fields. On the > > > other > > > > >>> hand, > > > > >>>>>> the discussion controversy is more around 1), not 2). As for > 2) > > > > >> people > > > > >>>>> seem > > > > >>>>>> to be on the right page anyways: print the topic lists if it > is > > > not > > > > >>>>>> dynamic, or print extractor string format otherwise. For 1) > > above > > > we > > > > >>>>> should > > > > >>>>>> probably have all three `Set<String> topics()`, `Pattern > > > > >>> topicPattern()` > > > > >>>>>> and `TopicNameExtractor topicExtractor()`; while for 2) I feel > > > > >>>>> comfortable > > > > >>>>>> relying on the TopicNameExtractor#toString() in > > > `Source#toString()` > > > > >>> impl > > > > >>>>>> since even if users do not override this function, the default > > > value > > > > >>>>>> `className@hashcode` still looks fine to me. > > > > >>>>>> > > > > >>>>>> > > > > >>>>>> Guozhang > > > > >>>>>> > > > > >>>>>> > > > > >>>>>> > > > > >>>>>> On Tue, Jul 3, 2018 at 11:22 PM, Matthias J. Sax < > > > > >>> matth...@confluent.io> > > > > >>>>>> wrote: > > > > >>>>>> > > > > >>>>>>> I just double checked the discussion thread of KIP-120 that > > > > >> introduced > > > > >>>>>>> `TopologyDescription`. Back than the argument was, that using > > the > > > > >>>>>>> simplest option might be sufficient because the description > is > > > > >> mostly > > > > >>>>>>> used for debugging. > > > > >>>>>>> > > > > >>>>>>> Not sure if this argument holds. It seem that people built > > first > > > > >> more > > > > >>>>>>> sophisticated tools using TopologyDescription. > > > > >>>>>>> > > > > >>>>>>> Final note: if we really want to add `topicPattern()` we > might > > > want > > > > >> to > > > > >>>>>>> deprecate `topic()` and replace with `Set<String> topics()`, > > > > >> because a > > > > >>>>>>> source node can take a multiple topics, too. > > > > >>>>>>> > > > > >>>>>>> Just adding this for completeness of context to the > discussion. > > > > >>>>>>> > > > > >>>>>>> > > > > >>>>>>> -Matthias > > > > >>>>>>> > > > > >>>>>>> On 7/3/18 11:09 PM, Matthias J. Sax wrote: > > > > >>>>>>>> John, > > > > >>>>>>>> > > > > >>>>>>>> I am a little bit on the fence. In retrospective, it might > > have > > > > >> been > > > > >>>>>>>> better to add `topic()` and `topicPattern()` to source node > > and > > > > >>> return > > > > >>>>> a > > > > >>>>>>>> proper `Pattern` object instead of the pattern as a String. > > > > >>>>>>>> > > > > >>>>>>>> All other "payload" is just names and thus String naturally. > > > From > > > > >> my > > > > >>>>>>>> point of view `TopologyDescription` should represent the > > > > `Topology` > > > > >>> in > > > > >>>>> a > > > > >>>>>>>> "machine readable" form plus a default "human readable" from > > via > > > > >>>>>>>> `toString()` -- this does not imply that all return types > > should > > > > be > > > > >>>>>>> String. > > > > >>>>>>>> > > > > >>>>>>>> Let me know what you think. If you agree, we could even add > > > > >>>>>>>> `Source#topicPattern()` in another KIP. > > > > >>>>>>>> > > > > >>>>>>>> > > > > >>>>>>>> -Matthias > > > > >>>>>>>> > > > > >>>>>>>> On 6/26/18 3:45 PM, John Roesler wrote: > > > > >>>>>>>>> Sorry for the late comment, > > > > >>>>>>>>> > > > > >>>>>>>>> Looking at the other pieces of TopologyDescription, I > noticed > > > > that > > > > >>>>>>> pretty > > > > >>>>>>>>> much all of the "payload" of these description nodes are > > > strings. > > > > >>>>>>> Should we > > > > >>>>>>>>> consider returning a string from `topicNameExtractor()` > > > instead? > > > > >>>>>>>>> > > > > >>>>>>>>> In fact, if we did that, we could consider calling > > `toString()` > > > > on > > > > >>> the > > > > >>>>>>>>> extractor instead of returning the class name. This would > > allow > > > > >>>>> authors > > > > >>>>>>> of > > > > >>>>>>>>> the extractors to provide more information about the > > extractor > > > > >> than > > > > >>>>> just > > > > >>>>>>>>> its name. This might be especially useful in the case of > > > > anonymous > > > > >>>>>>>>> implementations. > > > > >>>>>>>>> > > > > >>>>>>>>> Thanks for the KIP, > > > > >>>>>>>>> -John > > > > >>>>>>>>> > > > > >>>>>>>>> On Mon, Jun 25, 2018 at 11:52 PM Ted Yu < > yuzhih...@gmail.com > > > > > > > >>> wrote: > > > > >>>>>>>>> > > > > >>>>>>>>>> My previous response was talking about the new method in > > > > >>>>>>>>>> InternalTopologyBuilder. > > > > >>>>>>>>>> The exception just means there is no uniform extractor for > > all > > > > >> the > > > > >>>>>>> sinks. > > > > >>>>>>>>>> > > > > >>>>>>>>>> On Mon, Jun 25, 2018 at 8:02 PM, Matthias J. Sax < > > > > >>>>>>> matth...@confluent.io> > > > > >>>>>>>>>> wrote: > > > > >>>>>>>>>> > > > > >>>>>>>>>>> Ted, > > > > >>>>>>>>>>> > > > > >>>>>>>>>>> Why? Each sink can have a different TopicNameExtractor. > > > > >>>>>>>>>>> > > > > >>>>>>>>>>> > > > > >>>>>>>>>>> -Matthias > > > > >>>>>>>>>>> > > > > >>>>>>>>>>> On 6/25/18 5:19 PM, Ted Yu wrote: > > > > >>>>>>>>>>>> If there are different TopicNameExtractor classes from > > > > multiple > > > > >>>>> sink > > > > >>>>>>>>>>> nodes, > > > > >>>>>>>>>>>> the new method should throw exception alerting user of > > such > > > > >>>>> scenario. > > > > >>>>>>>>>>>> > > > > >>>>>>>>>>>> > > > > >>>>>>>>>>>> On Mon, Jun 25, 2018 at 2:23 PM, Bill Bejeck < > > > > >> bbej...@gmail.com> > > > > >>>>>>>>>> wrote: > > > > >>>>>>>>>>>> > > > > >>>>>>>>>>>>> Thanks for the KIP! > > > > >>>>>>>>>>>>> > > > > >>>>>>>>>>>>> Overall I'm +1 on the KIP. I have one question. > > > > >>>>>>>>>>>>> > > > > >>>>>>>>>>>>> The KIP states that the method "topicNameExtractor()" > is > > > > added > > > > >>> to > > > > >>>>>>> the > > > > >>>>>>>>>>>>> InternalTopologyBuilder.java. > > > > >>>>>>>>>>>>> > > > > >>>>>>>>>>>>> It could be that I'm missing something, but wow does > this > > > > work > > > > >>> if > > > > >>>>> a > > > > >>>>>>>>>> user > > > > >>>>>>>>>>>>> has provided different TopicNameExtractor instances to > > > > >> multiple > > > > >>>>> sink > > > > >>>>>>>>>>> nodes? > > > > >>>>>>>>>>>>> > > > > >>>>>>>>>>>>> Thanks, > > > > >>>>>>>>>>>>> Bill > > > > >>>>>>>>>>>>> > > > > >>>>>>>>>>>>> > > > > >>>>>>>>>>>>> > > > > >>>>>>>>>>>>> On Mon, Jun 25, 2018 at 1:25 PM Guozhang Wang < > > > > >>> wangg...@gmail.com > > > > >>>>>> > > > > >>>>>>>>>>> wrote: > > > > >>>>>>>>>>>>> > > > > >>>>>>>>>>>>>> Yup I agree, generally speaking the `toString()` > output > > is > > > > >> not > > > > >>>>>>>>>>>>> recommended > > > > >>>>>>>>>>>>>> to be relied on programmatically in user's code, but > > we've > > > > >>>>> observed > > > > >>>>>>>>>>>>>> convenience-beats-any-other-reasons again and again in > > > > >>>>> development > > > > >>>>>>>>>>>>>> unfortunately. I think we should still not claiming it > > is > > > > >> part > > > > >>> of > > > > >>>>>>> the > > > > >>>>>>>>>>>>>> public APIs that would not be changed anyhow in the > > > future, > > > > >> but > > > > >>>>>>> just > > > > >>>>>>>>>>>>>> mentioning it in the wiki for people to be aware is > > fine. > > > > >>>>>>>>>>>>>> > > > > >>>>>>>>>>>>>> > > > > >>>>>>>>>>>>>> Guozhang > > > > >>>>>>>>>>>>>> > > > > >>>>>>>>>>>>>> On Sun, Jun 24, 2018 at 5:01 PM, Matthias J. Sax < > > > > >>>>>>>>>>> matth...@confluent.io> > > > > >>>>>>>>>>>>>> wrote: > > > > >>>>>>>>>>>>>> > > > > >>>>>>>>>>>>>>> Thanks for the KIP! > > > > >>>>>>>>>>>>>>> > > > > >>>>>>>>>>>>>>> I am don't have any further comments. > > > > >>>>>>>>>>>>>>> > > > > >>>>>>>>>>>>>>> For Guozhang's comment: if we mention anything about > > > > >>>>> `toString()`, > > > > >>>>>>>>>> we > > > > >>>>>>>>>>>>>>> should make explicit that `toString()` output is > still > > > not > > > > >>>>> public > > > > >>>>>>>>>>>>>>> contract and users should not rely on the output. > > > > >>>>>>>>>>>>>>> > > > > >>>>>>>>>>>>>>> Furhtermore, for the actual uses output, I would > > replace > > > > >>>>> "topic:" > > > > >>>>>>> by > > > > >>>>>>>>>>>>>>> "extractor class:" to make the difference obvious. > > > > >>>>>>>>>>>>>>> > > > > >>>>>>>>>>>>>>> I am just hoping that people actually to not rely on > > > > >>>>> `toString()` > > > > >>>>>>>>>> what > > > > >>>>>>>>>>>>>>> defeats the purpose to the `TopologyDescription` > class > > > that > > > > >>> was > > > > >>>>>>>>>>>>>>> introduced to avoid the dependency... (Just a side > > > comment, > > > > >>> not > > > > >>>>>>>>>> really > > > > >>>>>>>>>>>>>>> related to this KIP proposal itself). > > > > >>>>>>>>>>>>>>> > > > > >>>>>>>>>>>>>>> > > > > >>>>>>>>>>>>>>> If there are no further comments in the next days, > feel > > > > free > > > > >>> to > > > > >>>>>>>>>> start > > > > >>>>>>>>>>>>>>> the VOTE and open a PR. > > > > >>>>>>>>>>>>>>> > > > > >>>>>>>>>>>>>>> > > > > >>>>>>>>>>>>>>> > > > > >>>>>>>>>>>>>>> > > > > >>>>>>>>>>>>>>> -Matthias > > > > >>>>>>>>>>>>>>> > > > > >>>>>>>>>>>>>>> On 6/22/18 6:04 PM, Guozhang Wang wrote: > > > > >>>>>>>>>>>>>>>> Thanks for writing the KIP! > > > > >>>>>>>>>>>>>>>> > > > > >>>>>>>>>>>>>>>> I'm +1 on the proposed changes over all. One minor > > > > >>> suggestion: > > > > >>>>> we > > > > >>>>>>>>>>>>>> should > > > > >>>>>>>>>>>>>>>> also mention that the `Sink#toString` will also be > > > > updated, > > > > >>> in > > > > >>>>> a > > > > >>>>>>>>>> way > > > > >>>>>>>>>>>>>> that > > > > >>>>>>>>>>>>>>>> if `topic()` returns null, use the other call, etc. > > This > > > > is > > > > >>>>>>> because > > > > >>>>>>>>>>>>>>>> although we do not explicitly state the following > > logic > > > as > > > > >>>>> public > > > > >>>>>>>>>>>>>>> protocols: > > > > >>>>>>>>>>>>>>>> > > > > >>>>>>>>>>>>>>>> ``` > > > > >>>>>>>>>>>>>>>> > > > > >>>>>>>>>>>>>>>> "Sink: " + name + " (topic: " + topic() + ")\n > > <-- > > > " > > > > + > > > > >>>>>>>>>>>>>>>> nodeNames(predecessors); > > > > >>>>>>>>>>>>>>>> > > > > >>>>>>>>>>>>>>>> > > > > >>>>>>>>>>>>>>>> ``` > > > > >>>>>>>>>>>>>>>> > > > > >>>>>>>>>>>>>>>> There are already some users that rely on > > > > >>>>>>>>>>>>>> `topology.describe().toString( > > > > >>>>>>>>>>>>>>> )` > > > > >>>>>>>>>>>>>>>> to have runtime checks on the returned string > values, > > so > > > > >>>>> changing > > > > >>>>>>>>>>>>> this > > > > >>>>>>>>>>>>>>>> means that their app will break and hence need to > make > > > > code > > > > >>>>>>>>>> changes. > > > > >>>>>>>>>>>>>>>> > > > > >>>>>>>>>>>>>>>> Guozhang > > > > >>>>>>>>>>>>>>>> > > > > >>>>>>>>>>>>>>>> On Wed, Jun 20, 2018 at 7:20 PM, Nishanth Pradeep < > > > > >>>>>>>>>>>>>> nishanth...@gmail.com > > > > >>>>>>>>>>>>>>>> > > > > >>>>>>>>>>>>>>>> wrote: > > > > >>>>>>>>>>>>>>>> > > > > >>>>>>>>>>>>>>>>> Hello Everyone, > > > > >>>>>>>>>>>>>>>>> > > > > >>>>>>>>>>>>>>>>> I have created a new KIP to discuss extending > > > > >>>>>>> TopologyDescription. > > > > >>>>>>>>>>>>> You > > > > >>>>>>>>>>>>>>> can > > > > >>>>>>>>>>>>>>>>> find it here: > > > > >>>>>>>>>>>>>>>>> > > > > >>>>>>>>>>>>>>>>> https://cwiki.apache.org/ > > confluence/display/KAFKA/KIP- > > > > >>>>>>>>>>>>>>>>> 321%3A+Add+method+to+get+TopicNameExtractor+in+ > > > > >>>>>>> TopologyDescription > > > > >>>>>>>>>>>>>>>>> > > > > >>>>>>>>>>>>>>>>> Please provide any feedback that you might have. > > > > >>>>>>>>>>>>>>>>> > > > > >>>>>>>>>>>>>>>>> Best, > > > > >>>>>>>>>>>>>>>>> Nishanth Pradeep > > > > >>>>>>>>>>>>>>>>> > > > > >>>>>>>>>>>>>>>> > > > > >>>>>>>>>>>>>>>> > > > > >>>>>>>>>>>>>>>> > > > > >>>>>>>>>>>>>>> > > > > >>>>>>>>>>>>>>> > > > > >>>>>>>>>>>>>> > > > > >>>>>>>>>>>>>> > > > > >>>>>>>>>>>>>> -- > > > > >>>>>>>>>>>>>> -- Guozhang > > > > >>>>>>>>>>>>>> > > > > >>>>>>>>>>>>> > > > > >>>>>>>>>>>> > > > > >>>>>>>>>>> > > > > >>>>>>>>>>> > > > > >>>>>>>>>> > > > > >>>>>>>>> > > > > >>>>>>>> > > > > >>>>>>> > > > > >>>>>>> > > > > >>>>>> > > > > >>>>>> > > > > >>>>> > > > > >>>>> > > > > >>>> > > > > >>> > > > > >>> > > > > >> > > > > >> > > > > >> -- > > > > >> -- Guozhang > > > > >> > > > > > > > > > > > > > > > > > > > > > > -- > > > -- Guozhang > > > > > > > > > -- > -- Guozhang >