Hi Colin, Thanks a lot for the explanation! I've updated the KIP based on your suggestions. Please find my response to your comments below.
> If you can just treat "not present" as version level 0, you can have just checks like the second one. This should lead to simpler code. (Kowshik): Good idea! Done. I've updated the KIP to eliminate FeatureUpdateType.DELETE, and instead use a version level value < 1 to be indicative of feature deletion, or more generally absence of a feature. Thanks for the idea! > I guess this ties in with the discussion above-- I would rather not have a "deleted" state. It doesn't seem to make anything more expressive, and it complicates the code. (Kowshik): As mentioned above, I've eliminated FeatureUpdateType.DELETE now. Thanks for the idea! Cheers, Kowshik On Sat, Apr 4, 2020 at 8:32 PM Colin McCabe <cmcc...@apache.org> wrote: > On Fri, Apr 3, 2020, at 20:32, Kowshik Prakasam wrote: > > > Colin wrote: > > > It would be simpler to just say that a feature flag which doesn't > appear > > > in the znode is considered to be at version level 0. This will also > > > simplify the code a lot, I think, since you won't have to keep track of > > > tricky distinctions between "disabled" and "enabled at version 0." > > > Then you would be able to just use an int in most places. > > > > (Kowshik): I'm not sure I understood why we want do it this way. If an > > entry for some finalized feature is absent in '/features' node, > > alternatively we can just treat this as a feature with a version that > > was never finalized/enabled or it was deleted at some point. Then, we can > > even allow for "enabled at version 0" as the {minVersion, maxVersion} > range > > can be any valid range, not necessarily minVersion > 0. > > Think about the following pseudocode. Which is simpler: > > > if (feature is not present) || (feature level < 1) { > > ... something ... > > } else { > > ... something ... > > } > > or > > > if (feature level < 1) { > > ... something ... > > } else { > > ... something ... > > } > > If you can just treat "not present" as version level 0, you can have just > checks like the second one. This should lead to simpler code. > > > (Kowshik): Yes, the whole change is a transaction. Either all provided > > FeatureUpdate is carried out in ZK, or none happens. That's why we just > > allow for a single error code field, as it is easier that way. This > > transactional guarantee is mentioned under 'Proposed changes > New > > controller API' > > That makes sense, thanks. > > > > Rather than FeatureUpdateType, I would just go with a boolean like > > > "force." I'm not sure what other values we'd want to add to this > later on, > > > if it were an enum. I think the boolean is clearer. > > > > (Kowshik): Since we have decided to go just one API (i.e. > > UpdateFeaturesRequest), it is better that FeatureUpdateType is an enum > with > > multiple values. A FeatureUpdateType is tied to a feature, and the > possible > > values are: ADD_OR_UPDATE, ADD_OR_UPDATE_ALLOW_DOWNGRADE, DELETE. > > I guess this ties in with the discussion above-- I would rather not have a > "deleted" state. It doesn't seem to make anything more expressive, and it > complicates the code. > > > > > > This ties in with my comment earlier, but for the result classes, we > need > > > methods other than just "all". Batch operations aren't usable if > > > you can't get the result per operation.... unless the semantics are > > > transactional and it really is just everything succeeded or everything > > > failed. > > > > (Kowshik): The semantics are transactional, as I explained above. > > Thanks for the clarification. > > > > > > There are a bunch of Java interfaces described like FinalizedFeature, > > > FeatureUpdate, UpdateFeaturesResult, and so on that should just be > > > regular concrete Java classes. In general we'd only use an interface > if > > > we wanted the caller to implement some kind of callback function. We > > > don't make classes that are just designed to hold data into interfaces, > > > since that just imposes extra work on callers (they have to define > > > their own concrete class for each interface just to use the API.) > > > There's also probably no reason to have these classes inherit from > each > > > other or have complex type relationships. One more nitpick is that > Kafka > > > generally doesn't use "get" in the function names of accessors. > > > > (Kowshik): Done, I have changed the KIP. By 'interface', I just meant > > interface from a pseudocode standpoint (i.e. it was just an abstraction > > providing at least the specified behavior). Since that was a bit > confusing, > > I have now renamed it calling it a class. Also I have eliminated the type > > relationships. > > Thanks. > > best, > Colin > > > > > > > Cheers, > > Kowshik > > > > On Fri, Apr 3, 2020 at 5:54 PM Kowshik Prakasam <kpraka...@confluent.io> > > wrote: > > > > > Hi Jun, > > > > > > Thanks for the feedback and suggestions. Please find my response below. > > > > > > > 100.6 For every new request, the admin needs to control who is > allowed to > > > > issue that request if security is enabled. So, we need to assign the > new > > > > request a ResourceType and possible AclOperations. See > > > > > > > > https://cwiki.apache.org/confluence/display/KAFKA/KIP-455%3A+Create+an+Administrative+API+for+Replica+Reassignment > > > > as an example. > > > > > > (Kowshik): I don't see any reference to the words ResourceType or > > > AclOperations > > > in the KIP. Please let me know how I can use the KIP that you linked to > > > know how to > > > setup the appropriate ResourceType and/or ClusterOperation? > > > > > > > 105. If we change delete to disable, it's better to do this > consistently > > > in > > > > request protocol and admin api as well. > > > > > > (Kowshik): The API shouldn't be called 'disable' when it is deleting a > > > feature. > > > I've just changed the KIP to use 'delete'. I don't have a strong > > > preference. > > > > > > > 110. The minVersion/maxVersion for features use int64. Currently, our > > > > release version schema is major.minor.bugfix (e.g. 2.5.0). It's > possible > > > > for new features to be included in minor releases too. Should we > make the > > > > feature versioning match the release versioning? > > > > > > (Kowshik): The release version can be mapped to a set of feature > versions, > > > and this can be done, for example in the tool (or even external to the > > > tool). > > > Can you please clarify what I'm missing? > > > > > > > 111. "During regular operations, the data in the ZK node can be > mutated > > > > only via a specific admin API served only by the controller." I am > > > > wondering why can't the controller auto finalize a feature version > after > > > > all brokers are upgraded? For new users who download the latest > version > > > to > > > > build a new cluster, it's inconvenient for them to have to manually > > > enable > > > > each feature. > > > > > > (Kowshik): I agree that there is a trade-off here, but it will help > > > to decide whether the automation can be thought through in the future > > > in a follow up KIP, or right now in this KIP. We may invest > > > in automation, but we have to decide whether we should do it > > > now or later. > > > > > > For the inconvenience that you mentioned, do you think the problem > that you > > > mentioned can be overcome by asking for the cluster operator to run a > > > bootstrap script when he/she knows that a specific AK release has been > > > almost completely deployed in a cluster for the first time? Idea is > that > > > the > > > bootstrap script will know how to map a specific AK release to > finalized > > > feature versions, and run the `kafka-features.sh` tool appropriately > > > against > > > the cluster. > > > > > > Now, coming back to your automation proposal/question. > > > I do see the value of automated feature version finalization, but I > also > > > see > > > that this will open up several questions and some risks, as explained > > > below. > > > The answers to these depend on the definition of the automation we > choose > > > to build, and how well does it fit into a kafka deployment. > > > Basically, it can be unsafe for the controller to finalize feature > version > > > upgrades automatically, without learning about the intent of the > cluster > > > operator. > > > 1. We would sometimes want to lock feature versions only when we have > > > externally verified > > > the stability of the broker binary. > > > 2. Sometimes only the cluster operator knows that a cluster upgrade is > > > complete, > > > and new brokers are highly unlikely to join the cluster. > > > 3. Only the cluster operator knows that the intent is to deploy the > same > > > version > > > of the new broker release across the entire cluster (i.e. the latest > > > downloaded version). > > > 4. For downgrades, it appears the controller still needs some external > > > input > > > (such as the proposed tool) to finalize a feature version downgrade. > > > > > > If we have automation, that automation can end up failing in some of > the > > > cases > > > above. Then, we need a way to declare that the cluster is "not ready" > if > > > the > > > controller cannot automatically finalize some basic required feature > > > version > > > upgrades across the cluster. We need to make the cluster operator > aware in > > > such a scenario (raise an alert or alike). > > > > > > > 112. DeleteFeaturesResponse: It seems the apiKey should be 49 > instead of > > > 48. > > > > > > (Kowshik): Done. > > > > > > > > > Cheers, > > > Kowshik > > > > > > On Fri, Apr 3, 2020 at 11:24 AM Jun Rao <j...@confluent.io> wrote: > > > > > >> Hi, Kowshik, > > >> > > >> Thanks for the reply. A few more comments below. > > >> > > >> 100.6 For every new request, the admin needs to control who is > allowed to > > >> issue that request if security is enabled. So, we need to assign the > new > > >> request a ResourceType and possible AclOperations. See > > >> > > >> > https://cwiki.apache.org/confluence/display/KAFKA/KIP-455%3A+Create+an+Administrative+API+for+Replica+Reassignment > > >> as > > >> an example. > > >> > > >> 105. If we change delete to disable, it's better to do this > consistently > > >> in > > >> request protocol and admin api as well. > > >> > > >> 110. The minVersion/maxVersion for features use int64. Currently, our > > >> release version schema is major.minor.bugfix (e.g. 2.5.0). It's > possible > > >> for new features to be included in minor releases too. Should we make > the > > >> feature versioning match the release versioning? > > >> > > >> 111. "During regular operations, the data in the ZK node can be > mutated > > >> only via a specific admin API served only by the controller." I am > > >> wondering why can't the controller auto finalize a feature version > after > > >> all brokers are upgraded? For new users who download the latest > version to > > >> build a new cluster, it's inconvenient for them to have to manually > enable > > >> each feature. > > >> > > >> 112. DeleteFeaturesResponse: It seems the apiKey should be 49 instead > of > > >> 48. > > >> > > >> Jun > > >> > > >> > > >> On Fri, Apr 3, 2020 at 1:27 AM Kowshik Prakasam < > kpraka...@confluent.io> > > >> wrote: > > >> > > >> > Hey Jun, > > >> > > > >> > Thanks a lot for the great feedback! Please note that the design > > >> > has changed a little bit on the KIP, and we now propagate the > finalized > > >> > features metadata only via ZK watches (instead of > UpdateMetadataRequest > > >> > from the controller). > > >> > > > >> > Please find below my response to your questions/feedback, with the > > >> prefix > > >> > "(Kowshik):". > > >> > > > >> > > 100. UpdateFeaturesRequest/UpdateFeaturesResponse > > >> > > 100.1 Since this request waits for responses from brokers, should > we > > >> add > > >> > a > > >> > > timeout in the request (like createTopicRequest)? > > >> > > > >> > (Kowshik): Great point! Done. I have added a timeout field. Note: > we no > > >> > longer > > >> > wait for responses from brokers, since the design has been changed > so > > >> that > > >> > the > > >> > features information is propagated via ZK. Nevertheless, it is > right to > > >> > have a timeout > > >> > for the request. > > >> > > > >> > > 100.2 The response schema is a bit weird. Typically, the response > just > > >> > > shows an error code and an error message, instead of echoing the > > >> request. > > >> > > > >> > (Kowshik): Great point! Yeah, I have modified it to just return an > error > > >> > code and a message. > > >> > Previously it was not echoing the "request", rather it was > returning the > > >> > latest set of > > >> > cluster-wide finalized features (after applying the updates). But > you > > >> are > > >> > right, > > >> > the additional info is not required, so I have removed it from the > > >> response > > >> > schema. > > >> > > > >> > > 100.3 Should we add a separate request to list/describe the > existing > > >> > > features? > > >> > > > >> > (Kowshik): This is already present in the KIP via the > 'DescribeFeatures' > > >> > Admin API, > > >> > which, underneath covers uses the ApiVersionsRequest to > list/describe > > >> the > > >> > existing features. Please read the 'Tooling support' section. > > >> > > > >> > > 100.4 We are mixing ADD_OR_UPDATE and DELETE in a single request. > For > > >> > > DELETE, the version field doesn't make sense. So, I guess the > broker > > >> just > > >> > > ignores this? An alternative way is to have a separate > > >> > DeleteFeaturesRequest > > >> > > > >> > (Kowshik): Great point! I have modified the KIP now to have 2 > separate > > >> > controller APIs > > >> > serving these different purposes: > > >> > 1. updateFeatures > > >> > 2. deleteFeatures > > >> > > > >> > > 100.5 In UpdateFeaturesResponse, we have "The monotonically > increasing > > >> > > version of the metadata for finalized features." I am wondering > why > > >> the > > >> > > ordering is important? > > >> > > > >> > (Kowshik): In the latest KIP write-up, it is called epoch (instead > of > > >> > version), and > > >> > it is just the ZK node version. Basically, this is the epoch for the > > >> > cluster-wide > > >> > finalized feature version metadata. This metadata is served to > clients > > >> via > > >> > the > > >> > ApiVersionsResponse (for reads). We propagate updates from the > > >> '/features' > > >> > ZK node > > >> > to all brokers, via ZK watches setup by each broker on the > '/features' > > >> > node. > > >> > > > >> > Now here is why the ordering is important: > > >> > ZK watches don't propagate at the same time. As a result, the > > >> > ApiVersionsResponse > > >> > is eventually consistent across brokers. This can introduce cases > > >> > where clients see an older lower epoch of the features metadata, > after a > > >> > more recent > > >> > higher epoch was returned at a previous point in time. We expect > clients > > >> > to always employ the rule that the latest received higher epoch of > > >> metadata > > >> > always trumps an older smaller epoch. Those clients that are > external to > > >> > Kafka should strongly consider discovering the latest metadata once > > >> during > > >> > startup from the brokers, and if required refresh the metadata > > >> periodically > > >> > (to get the latest metadata). > > >> > > > >> > > 100.6 Could you specify the required ACL for this new request? > > >> > > > >> > (Kowshik): What is ACL, and how could I find out which one to > specify? > > >> > Please could you provide me some pointers? I'll be glad to update > the > > >> > KIP once I know the next steps. > > >> > > > >> > > 101. For the broker registration ZK node, should we bump up the > > >> version > > >> > in > > >> > the json? > > >> > > > >> > (Kowshik): Great point! Done. I've increased the version in the > broker > > >> json > > >> > by 1. > > >> > > > >> > > 102. For the /features ZK node, not sure if we need the epoch > field. > > >> Each > > >> > > ZK node has an internal version field that is incremented on every > > >> > update. > > >> > > > >> > (Kowshik): Great point! Done. I'm using the ZK node version now, > > >> instead of > > >> > explicitly > > >> > incremented epoch. > > >> > > > >> > > 103. "Enabling the actual semantics of a feature version > cluster-wide > > >> is > > >> > > left to the discretion of the logic implementing the feature (ex: > can > > >> be > > >> > > done via dynamic broker config)." Does that mean the broker > > >> registration > > >> > ZK > > >> > > node will be updated dynamically when this happens? > > >> > > > >> > (Kowshik): Not really. The text was just conveying that a broker > could > > >> > "know" of > > >> > a new feature version, but it does not mean the broker should have > also > > >> > activated the effects of the feature version. Knowing vs activation > are > > >> 2 > > >> > separate things, > > >> > and the latter can be achieved by dynamic config. I have reworded > the > > >> text > > >> > to > > >> > make this clear to the reader. > > >> > > > >> > > > >> > > 104. UpdateMetadataRequest > > >> > > 104.1 It would be useful to describe when the feature metadata is > > >> > included > > >> > > in the request. My understanding is that it's only included if (1) > > >> there > > >> > is > > >> > > a change to the finalized feature; (2) broker restart; (3) > controller > > >> > > failover. > > >> > > 104.2 The new fields have the following versions. Why are the > > >> versions 3+ > > >> > > when the top version is bumped to 6? > > >> > > "fields": [ > > >> > > {"name": "Name", "type": "string", "versions": "3+", > > >> > > "about": "The name of the feature."}, > > >> > > {"name": "Version", "type": "int64", "versions": "3+", > > >> > > "about": "The finalized version for the feature."} > > >> > > ] > > >> > > > >> > (Kowshik): With the new improved design, we have completely > eliminated > > >> the > > >> > need to > > >> > use UpdateMetadataRequest. This is because we now rely on ZK to > deliver > > >> the > > >> > notifications for changes to the '/features' ZK node. > > >> > > > >> > > 105. kafka-features.sh: Instead of using update/delete, perhaps > it's > > >> > better > > >> > > to use enable/disable? > > >> > > > >> > (Kowshik): For delete, yes, I have changed it so that we instead > call it > > >> > 'disable'. > > >> > However for 'update', it can now also refer to either an upgrade or > a > > >> > forced downgrade. > > >> > Therefore, I have left it the way it is, just calling it as just > > >> 'update'. > > >> > > > >> > > > >> > Cheers, > > >> > Kowshik > > >> > > > >> > On Tue, Mar 31, 2020 at 6:51 PM Jun Rao <j...@confluent.io> wrote: > > >> > > > >> > > Hi, Kowshik, > > >> > > > > >> > > Thanks for the KIP. Looks good overall. A few comments below. > > >> > > > > >> > > 100. UpdateFeaturesRequest/UpdateFeaturesResponse > > >> > > 100.1 Since this request waits for responses from brokers, should > we > > >> add > > >> > a > > >> > > timeout in the request (like createTopicRequest)? > > >> > > 100.2 The response schema is a bit weird. Typically, the response > just > > >> > > shows an error code and an error message, instead of echoing the > > >> request. > > >> > > 100.3 Should we add a separate request to list/describe the > existing > > >> > > features? > > >> > > 100.4 We are mixing ADD_OR_UPDATE and DELETE in a single request. > For > > >> > > DELETE, the version field doesn't make sense. So, I guess the > broker > > >> just > > >> > > ignores this? An alternative way is to have a separate > > >> > > DeleteFeaturesRequest > > >> > > 100.5 In UpdateFeaturesResponse, we have "The monotonically > increasing > > >> > > version of the metadata for finalized features." I am wondering > why > > >> the > > >> > > ordering is important? > > >> > > 100.6 Could you specify the required ACL for this new request? > > >> > > > > >> > > 101. For the broker registration ZK node, should we bump up the > > >> version > > >> > in > > >> > > the json? > > >> > > > > >> > > 102. For the /features ZK node, not sure if we need the epoch > field. > > >> Each > > >> > > ZK node has an internal version field that is incremented on every > > >> > update. > > >> > > > > >> > > 103. "Enabling the actual semantics of a feature version > cluster-wide > > >> is > > >> > > left to the discretion of the logic implementing the feature (ex: > can > > >> be > > >> > > done via dynamic broker config)." Does that mean the broker > > >> registration > > >> > ZK > > >> > > node will be updated dynamically when this happens? > > >> > > > > >> > > 104. UpdateMetadataRequest > > >> > > 104.1 It would be useful to describe when the feature metadata is > > >> > included > > >> > > in the request. My understanding is that it's only included if (1) > > >> there > > >> > is > > >> > > a change to the finalized feature; (2) broker restart; (3) > controller > > >> > > failover. > > >> > > 104.2 The new fields have the following versions. Why are the > > >> versions 3+ > > >> > > when the top version is bumped to 6? > > >> > > "fields": [ > > >> > > {"name": "Name", "type": "string", "versions": "3+", > > >> > > "about": "The name of the feature."}, > > >> > > {"name": "Version", "type": "int64", "versions": "3+", > > >> > > "about": "The finalized version for the feature."} > > >> > > ] > > >> > > > > >> > > 105. kafka-features.sh: Instead of using update/delete, perhaps > it's > > >> > better > > >> > > to use enable/disable? > > >> > > > > >> > > Jun > > >> > > > > >> > > On Tue, Mar 31, 2020 at 5:29 PM Kowshik Prakasam < > > >> kpraka...@confluent.io > > >> > > > > >> > > wrote: > > >> > > > > >> > > > Hey Boyang, > > >> > > > > > >> > > > Thanks for the great feedback! I have updated the KIP based on > your > > >> > > > feedback. > > >> > > > Please find my response below for your comments, look for > sentences > > >> > > > starting > > >> > > > with "(Kowshik)" below. > > >> > > > > > >> > > > > > >> > > > > 1. "When is it safe for the brokers to begin handling EOS > traffic" > > >> > > could > > >> > > > be > > >> > > > > converted as "When is it safe for the brokers to start > serving new > > >> > > > > Exactly-Once(EOS) semantics" since EOS is not explained > earlier in > > >> > the > > >> > > > > context. > > >> > > > > > >> > > > (Kowshik): Great point! Done. > > >> > > > > > >> > > > > 2. In the *Explanation *section, the metadata version number > part > > >> > > seems a > > >> > > > > bit blurred. Could you point a reference to later section > that we > > >> > going > > >> > > > to > > >> > > > > store it in Zookeeper and update it every time when there is a > > >> > feature > > >> > > > > change? > > >> > > > > > >> > > > (Kowshik): Great point! Done. I've added a reference in the KIP. > > >> > > > > > >> > > > > > >> > > > > 3. For the feature downgrade, although it's a Non-goal of the > KIP, > > >> > for > > >> > > > > features such as group coordinator semantics, there is no > legal > > >> > > scenario > > >> > > > to > > >> > > > > perform a downgrade at all. So having downgrade door open is > > >> pretty > > >> > > > > error-prone as human faults happen all the time. I'm assuming > as > > >> new > > >> > > > > features are implemented, it's not very hard to add a flag > during > > >> > > feature > > >> > > > > creation to indicate whether this feature is "downgradable". > Could > > >> > you > > >> > > > > explain a bit more on the extra engineering effort for > shipping > > >> this > > >> > > KIP > > >> > > > > with downgrade protection in place? > > >> > > > > > >> > > > (Kowshik): Great point! I'd agree and disagree here. While I > agree > > >> that > > >> > > > accidental > > >> > > > downgrades can cause problems, I also think sometimes downgrades > > >> should > > >> > > > be allowed for emergency reasons (not all downgrades cause > issues). > > >> > > > It is just subjective to the feature being downgraded. > > >> > > > > > >> > > > To be more strict about feature version downgrades, I have > modified > > >> the > > >> > > KIP > > >> > > > proposing that we mandate a `--force-downgrade` flag be used in > the > > >> > > > UPDATE_FEATURES api > > >> > > > and the tooling, whenever the human is downgrading a finalized > > >> feature > > >> > > > version. > > >> > > > Hopefully this should cover the requirement, until we find the > need > > >> for > > >> > > > advanced downgrade support. > > >> > > > > > >> > > > > 4. "Each broker’s supported dictionary of feature versions > will be > > >> > > > defined > > >> > > > > in the broker code." So this means in order to restrict a > certain > > >> > > > feature, > > >> > > > > we need to start the broker first and then send a feature > gating > > >> > > request > > >> > > > > immediately, which introduces a time gap and the > intended-to-close > > >> > > > feature > > >> > > > > could actually serve request during this phase. Do you think > we > > >> > should > > >> > > > also > > >> > > > > support configurations as well so that admin user could freely > > >> roll > > >> > up > > >> > > a > > >> > > > > cluster with all nodes complying the same feature gating, > without > > >> > > > worrying > > >> > > > > about the turnaround time to propagate the message only after > the > > >> > > cluster > > >> > > > > starts up? > > >> > > > > > >> > > > (Kowshik): This is a great point/question. One of the > expectations > > >> out > > >> > of > > >> > > > this KIP, which is > > >> > > > already followed in the broker, is the following. > > >> > > > - Imagine at time T1 the broker starts up and registers it’s > > >> presence > > >> > in > > >> > > > ZK, > > >> > > > along with advertising it’s supported features. > > >> > > > - Imagine at a future time T2 the broker receives the > > >> > > > UpdateMetadataRequest > > >> > > > from the controller, which contains the latest finalized > > >> features as > > >> > > > seen by > > >> > > > the controller. The broker validates this data against it’s > > >> > supported > > >> > > > features to > > >> > > > make sure there is no mismatch (it will shutdown if there is > an > > >> > > > incompatibility). > > >> > > > > > >> > > > It is expected that during the time between the 2 events T1 and > T2, > > >> the > > >> > > > broker is > > >> > > > almost a silent entity in the cluster. It does not add any > value to > > >> the > > >> > > > cluster, or carry > > >> > > > out any important broker activities. By “important”, I mean it > is > > >> not > > >> > > doing > > >> > > > mutations > > >> > > > on it’s persistence, not mutating critical in-memory state, > won’t be > > >> > > > serving > > >> > > > produce/fetch requests. Note it doesn’t even know it’s assigned > > >> > > partitions > > >> > > > until > > >> > > > it receives UpdateMetadataRequest from controller. Anything the > > >> broker > > >> > is > > >> > > > doing up > > >> > > > until this point is not damaging/useful. > > >> > > > > > >> > > > I’ve clarified the above in the KIP, see this new section: > > >> > > > > > >> > > > > > >> > > > > >> > > > >> > https://cwiki.apache.org/confluence/display/KAFKA/KIP-584%3A+Versioning+scheme+for+features#KIP-584:Versioningschemeforfeatures-Incompatiblebrokerlifetime > > >> > > > . > > >> > > > > > >> > > > > 5. "adding a new Feature, updating or deleting an existing > > >> Feature", > > >> > > may > > >> > > > be > > >> > > > > I misunderstood something, I thought the features are defined > in > > >> > broker > > >> > > > > code, so admin could not really create a new feature? > > >> > > > > > >> > > > (Kowshik): Great point! You understood this right. Here adding a > > >> > feature > > >> > > > means we are > > >> > > > adding a cluster-wide finalized *max* version for a feature > that was > > >> > > > previously never finalized. > > >> > > > I have clarified this in the KIP now. > > >> > > > > > >> > > > > 6. I think we need a separate error code like > > >> > > FEATURE_UPDATE_IN_PROGRESS > > >> > > > to > > >> > > > > reject a concurrent feature update request. > > >> > > > > > >> > > > (Kowshik): Great point! I have modified the KIP adding the above > > >> (see > > >> > > > 'Tooling support -> Admin API changes'). > > >> > > > > > >> > > > > 7. I think we haven't discussed the alternative solution to > pass > > >> the > > >> > > > > feature information through Zookeeper. Is that mentioned in > the > > >> KIP > > >> > to > > >> > > > > justify why using UpdateMetadata is more favorable? > > >> > > > > > >> > > > (Kowshik): Nice question! The broker reads finalized feature > info > > >> > stored > > >> > > in > > >> > > > ZK, > > >> > > > only during startup when it does a validation. When serving > > >> > > > `ApiVersionsRequest`, the > > >> > > > broker does not read this info from ZK directly. I'd imagine the > > >> risk > > >> > is > > >> > > > that it can increase > > >> > > > the ZK read QPS which can be a bottleneck for the system. > Today, in > > >> > Kafka > > >> > > > we use the > > >> > > > controller to fan out ZK updates to brokers and we want to > stick to > > >> > that > > >> > > > pattern to avoid > > >> > > > the ZK read bottleneck when serving `ApiVersionsRequest`. > > >> > > > > > >> > > > > 8. I was under the impression that user could configure a > range of > > >> > > > > supported versions, what's the trade-off for allowing single > > >> > finalized > > >> > > > > version only? > > >> > > > > > >> > > > (Kowshik): Great question! The finalized version of a feature > > >> basically > > >> > > > refers to > > >> > > > the cluster-wide finalized feature "maximum" version. For > example, > > >> if > > >> > the > > >> > > > 'group_coordinator' feature > > >> > > > has the finalized version set to 10, then, it means that > > >> cluster-wide > > >> > all > > >> > > > versions upto v10 are > > >> > > > supported for this feature. However, note that if some version > (ex: > > >> v0) > > >> > > > gets deprecated > > >> > > > for this feature, then we don’t convey that using this scheme > (also > > >> > > > supporting deprecation is a non-goal). > > >> > > > > > >> > > > (Kowshik): I’ve now modified the KIP at all points, refering to > > >> > finalized > > >> > > > feature "maximum" versions. > > >> > > > > > >> > > > > 9. One minor syntax fix: Note that here the "client" here may > be a > > >> > > > producer > > >> > > > > > >> > > > (Kowshik): Great point! Done. > > >> > > > > > >> > > > > > >> > > > Cheers, > > >> > > > Kowshik > > >> > > > > > >> > > > > > >> > > > On Tue, Mar 31, 2020 at 1:17 PM Boyang Chen < > > >> > reluctanthero...@gmail.com> > > >> > > > wrote: > > >> > > > > > >> > > > > Hey Kowshik, > > >> > > > > > > >> > > > > thanks for the revised KIP. Got a couple of questions: > > >> > > > > > > >> > > > > 1. "When is it safe for the brokers to begin handling EOS > traffic" > > >> > > could > > >> > > > be > > >> > > > > converted as "When is it safe for the brokers to start > serving new > > >> > > > > Exactly-Once(EOS) semantics" since EOS is not explained > earlier in > > >> > the > > >> > > > > context. > > >> > > > > > > >> > > > > 2. In the *Explanation *section, the metadata version number > part > > >> > > seems a > > >> > > > > bit blurred. Could you point a reference to later section > that we > > >> > going > > >> > > > to > > >> > > > > store it in Zookeeper and update it every time when there is a > > >> > feature > > >> > > > > change? > > >> > > > > > > >> > > > > 3. For the feature downgrade, although it's a Non-goal of the > KIP, > > >> > for > > >> > > > > features such as group coordinator semantics, there is no > legal > > >> > > scenario > > >> > > > to > > >> > > > > perform a downgrade at all. So having downgrade door open is > > >> pretty > > >> > > > > error-prone as human faults happen all the time. I'm assuming > as > > >> new > > >> > > > > features are implemented, it's not very hard to add a flag > during > > >> > > feature > > >> > > > > creation to indicate whether this feature is "downgradable". > Could > > >> > you > > >> > > > > explain a bit more on the extra engineering effort for > shipping > > >> this > > >> > > KIP > > >> > > > > with downgrade protection in place? > > >> > > > > > > >> > > > > 4. "Each broker’s supported dictionary of feature versions > will be > > >> > > > defined > > >> > > > > in the broker code." So this means in order to restrict a > certain > > >> > > > feature, > > >> > > > > we need to start the broker first and then send a feature > gating > > >> > > request > > >> > > > > immediately, which introduces a time gap and the > intended-to-close > > >> > > > feature > > >> > > > > could actually serve request during this phase. Do you think > we > > >> > should > > >> > > > also > > >> > > > > support configurations as well so that admin user could freely > > >> roll > > >> > up > > >> > > a > > >> > > > > cluster with all nodes complying the same feature gating, > without > > >> > > > worrying > > >> > > > > about the turnaround time to propagate the message only after > the > > >> > > cluster > > >> > > > > starts up? > > >> > > > > > > >> > > > > 5. "adding a new Feature, updating or deleting an existing > > >> Feature", > > >> > > may > > >> > > > be > > >> > > > > I misunderstood something, I thought the features are defined > in > > >> > broker > > >> > > > > code, so admin could not really create a new feature? > > >> > > > > > > >> > > > > 6. I think we need a separate error code like > > >> > > FEATURE_UPDATE_IN_PROGRESS > > >> > > > to > > >> > > > > reject a concurrent feature update request. > > >> > > > > > > >> > > > > 7. I think we haven't discussed the alternative solution to > pass > > >> the > > >> > > > > feature information through Zookeeper. Is that mentioned in > the > > >> KIP > > >> > to > > >> > > > > justify why using UpdateMetadata is more favorable? > > >> > > > > > > >> > > > > 8. I was under the impression that user could configure a > range of > > >> > > > > supported versions, what's the trade-off for allowing single > > >> > finalized > > >> > > > > version only? > > >> > > > > > > >> > > > > 9. One minor syntax fix: Note that here the "client" here may > be a > > >> > > > producer > > >> > > > > > > >> > > > > Boyang > > >> > > > > > > >> > > > > On Mon, Mar 30, 2020 at 4:53 PM Colin McCabe < > cmcc...@apache.org> > > >> > > wrote: > > >> > > > > > > >> > > > > > On Thu, Mar 26, 2020, at 19:24, Kowshik Prakasam wrote: > > >> > > > > > > Hi Colin, > > >> > > > > > > > > >> > > > > > > Thanks for the feedback! I've changed the KIP to address > your > > >> > > > > > > suggestions. > > >> > > > > > > Please find below my explanation. Here is a link to KIP > 584: > > >> > > > > > > > > >> > > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > >> > https://cwiki.apache.org/confluence/display/KAFKA/KIP-584%3A+Versioning+scheme+for+features > > >> > > > > > > . > > >> > > > > > > > > >> > > > > > > 1. '__data_version__' is the version of the finalized > feature > > >> > > > metadata > > >> > > > > > > (i.e. actual ZK node contents), while the > > >> '__schema_version__' is > > >> > > the > > >> > > > > > > version of the schema of the data persisted in ZK. These > serve > > >> > > > > different > > >> > > > > > > purposes. '__data_version__' is is useful mainly to > clients > > >> > during > > >> > > > > reads, > > >> > > > > > > to differentiate between the 2 versions of eventually > > >> consistent > > >> > > > > > 'finalized > > >> > > > > > > features' metadata (i.e. larger metadata version is more > > >> recent). > > >> > > > > > > '__schema_version__' provides an additional degree of > > >> > flexibility, > > >> > > > > where > > >> > > > > > if > > >> > > > > > > we decide to change the schema for '/features' node in ZK > (in > > >> the > > >> > > > > > future), > > >> > > > > > > then we can manage broker roll outs suitably (i.e. > > >> > > > > > > serialization/deserialization of the ZK data can be > handled > > >> > > safely). > > >> > > > > > > > >> > > > > > Hi Kowshik, > > >> > > > > > > > >> > > > > > If you're talking about a number that lets you know if data > is > > >> more > > >> > > or > > >> > > > > > less recent, we would typically call that an epoch, and not > a > > >> > > version. > > >> > > > > For > > >> > > > > > the ZK data structures, the word "version" is typically > reserved > > >> > for > > >> > > > > > describing changes to the overall schema of the data that is > > >> > written > > >> > > to > > >> > > > > > ZooKeeper. We don't even really change the "version" of > those > > >> > > schemas > > >> > > > > that > > >> > > > > > much, since most changes are backwards-compatible. But we > do > > >> > include > > >> > > > > that > > >> > > > > > version field just in case. > > >> > > > > > > > >> > > > > > I don't think we really need an epoch here, though, since > we can > > >> > just > > >> > > > > look > > >> > > > > > at the broker epoch. Whenever the broker registers, its > epoch > > >> will > > >> > > be > > >> > > > > > greater than the previous broker epoch. And the newly > > >> registered > > >> > > data > > >> > > > > will > > >> > > > > > take priority. This will be a lot simpler than adding a > > >> separate > > >> > > epoch > > >> > > > > > system, I think. > > >> > > > > > > > >> > > > > > > > > >> > > > > > > 2. Regarding admin client needing min and max information > - > > >> you > > >> > are > > >> > > > > > right! > > >> > > > > > > I've changed the KIP such that the Admin API also allows > the > > >> user > > >> > > to > > >> > > > > read > > >> > > > > > > 'supported features' from a specific broker. Please look > at > > >> the > > >> > > > section > > >> > > > > > > "Admin API changes". > > >> > > > > > > > >> > > > > > Thanks. > > >> > > > > > > > >> > > > > > > > > >> > > > > > > 3. Regarding the use of `long` vs `Long` - it was not > > >> deliberate. > > >> > > > I've > > >> > > > > > > improved the KIP to just use `long` at all places. > > >> > > > > > > > >> > > > > > Sounds good. > > >> > > > > > > > >> > > > > > > > > >> > > > > > > 4. Regarding kafka.admin.FeatureCommand tool - you are > right! > > >> > I've > > >> > > > > > updated > > >> > > > > > > the KIP sketching the functionality provided by this tool, > > >> with > > >> > > some > > >> > > > > > > examples. Please look at the section "Tooling support > > >> examples". > > >> > > > > > > > > >> > > > > > > Thank you! > > >> > > > > > > > >> > > > > > > > >> > > > > > Thanks, Kowshik. > > >> > > > > > > > >> > > > > > cheers, > > >> > > > > > Colin > > >> > > > > > > > >> > > > > > > > > >> > > > > > > > > >> > > > > > > Cheers, > > >> > > > > > > Kowshik > > >> > > > > > > > > >> > > > > > > On Wed, Mar 25, 2020 at 11:31 PM Colin McCabe < > > >> > cmcc...@apache.org> > > >> > > > > > wrote: > > >> > > > > > > > > >> > > > > > > > Thanks, Kowshik, this looks good. > > >> > > > > > > > > > >> > > > > > > > In the "Schema" section, do we really need both > > >> > > __schema_version__ > > >> > > > > and > > >> > > > > > > > __data_version__? Can we just have a single version > field > > >> > here? > > >> > > > > > > > > > >> > > > > > > > Shouldn't the Admin(Client) function have some way to > get > > >> the > > >> > min > > >> > > > and > > >> > > > > > max > > >> > > > > > > > information that we're exposing as well? I guess we > could > > >> have > > >> > > > min, > > >> > > > > > max, > > >> > > > > > > > and current. Unrelated: is the use of Long rather than > long > > >> > > > > deliberate > > >> > > > > > > > here? > > >> > > > > > > > > > >> > > > > > > > It would be good to describe how the command line tool > > >> > > > > > > > kafka.admin.FeatureCommand will work. For example the > flags > > >> > that > > >> > > > it > > >> > > > > > will > > >> > > > > > > > take and the output that it will generate to STDOUT. > > >> > > > > > > > > > >> > > > > > > > cheers, > > >> > > > > > > > Colin > > >> > > > > > > > > > >> > > > > > > > > > >> > > > > > > > On Tue, Mar 24, 2020, at 17:08, Kowshik Prakasam wrote: > > >> > > > > > > > > Hi all, > > >> > > > > > > > > > > >> > > > > > > > > I've opened KIP-584 > <https://issues.apache.org/jira/browse/KIP-584> > > >> > > <https://issues.apache.org/jira/browse/KIP-584> < > > >> > > > https://issues.apache.org/jira/browse/KIP-584 > > >> > > > > > > > >> > > > > > > > > which > > >> > > > > > > > > is intended to provide a versioning scheme for > features. > > >> I'd > > >> > > like > > >> > > > > to > > >> > > > > > use > > >> > > > > > > > > this thread to discuss the same. I'd appreciate any > > >> feedback > > >> > on > > >> > > > > this. > > >> > > > > > > > > Here > > >> > > > > > > > > is a link to KIP-584 > <https://issues.apache.org/jira/browse/KIP-584> > > >> > > <https://issues.apache.org/jira/browse/KIP-584>: > > >> > > > > > > > > > > >> > > > > > > > > > >> > > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > >> > https://cwiki.apache.org/confluence/display/KAFKA/KIP-584%3A+Versioning+scheme+for+features > > >> > > > > > > > > . > > >> > > > > > > > > > > >> > > > > > > > > Thank you! > > >> > > > > > > > > > > >> > > > > > > > > > > >> > > > > > > > > Cheers, > > >> > > > > > > > > Kowshik > > >> > > > > > > > > > > >> > > > > > > > > > >> > > > > > > > > >> > > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > >> > > > > > >