Hi Brian, Thanks for the KIP. I think it looks good and ready for a vote!
One nitpick: we try to avoid being too Java-specific when describing the protocol. Rather than referencing java.lang.Double, it would be more helpful to say something equivalent, like "the float is serialized as a 64-bit IEEE 754 value, ordered as big-endian." That way people who are developing clients in other languages can more easily understand the protocol. best, Colin On Fri, Jan 24, 2020, at 17:18, Brian Byrne wrote: > Thanks for reviewing, Anna, > > In the describe call, the idea is that the API will match the QuotaFilters, > which can be specified in two ways for your example (filter is a type and a > matching string): > > 1) (USER="user-1") returns both > 2) (USER="user-1", CLIENT_ID="") returns just /config/users/”user-1” > > [For (2), it may be better to permit 'null' to indicate "omitted" instead > of the empty string.] > > You're correct for the resolve case, although it may not be highlighting > the difference between them. Let's say you had the following: > > /config/users/<default>, value=100 > > Then --describe with (USER="user-1") returns empty since there's no config > entries for /config/users/”user-1”/*, whereas --resolve with > (USER="user-1") returns (value=100) since the user resolved to the default > user config. In other words, --describe is like doing > Admin#describeConfigs, whereas --resolve is like calling > ClientQuotaCallback#quotaLimit, if that helps any. > > Thanks, > Brian > > > > On Fri, Jan 24, 2020 at 3:19 PM Anna Povzner <a...@confluent.io> wrote: > > > Hi Brian, > > > > The KIP looks good! > > > > I have one clarification question regarding the distinction between > > describe and resolve API. Suppose I set request quota for > > /config/users/”user-1”/clients/"client-1" to 100 and request quota for > > /config/users/”user-1” to 200. Is this correct that describeClientQuotas > > called with /config/users/”user-1” would return two entries in the > > response? > > > > - > > > > /config/users/”user-1”/clients/<client-1>, request quota type, value = > > 100 > > > > > > - > > > > /config/users/”user-1”, request quota type, value = 200 > > > > > > While resolve API for entity "/config/users/”user-1” would return the quota > > setting specifically for /config/users/”user-1”, which is 200 in this case. > > > > Is my understanding correct? > > > > Thanks, > > > > Anna > > > > > > On Fri, Jan 24, 2020 at 11:32 AM Brian Byrne <bby...@confluent.io> wrote: > > > > > My apologies, Rajini. My hasty edits omitted a couple spots. I've done a > > > more thorough scan and should have cleaned up (1) and (2). > > > > > > For (3), Longs are chosen because that's what the ConfigCommand currently > > > uses, and because there's no floating point type in the RPC protocol. > > Longs > > > didn't seem to be an issue for bytes-per-second values, and > > > request_percentage is normalized [0-100], but you're right in that the > > > extensions might require this. > > > > > > To make Double compatible with the RPC protocol, we'd need to serialize > > the > > > value into a String, and then validate the value on the receiving end. > > > Would that be acceptable? > > > > > > Thanks, > > > Brian > > > > > > On Fri, Jan 24, 2020 at 11:07 AM Rajini Sivaram <rajinisiva...@gmail.com > > > > > > wrote: > > > > > > > Thanks Brian. Looks good. > > > > > > > > Just a few minor points: > > > > > > > > 1) We can remove *public ResolveClientQuotasOptions > > > > setOmitOverriddenValues(boolean omitOverriddenValues); * > > > > 2) Under ClientQuotasCommand, the three items are List/Describe/Alter, > > > > rename to match the new naming for operations? > > > > 3) Request quota configs are doubles rather than long. And for > > > > ClientQuotaCallback API, we used doubles everywhere. Wasn't sure if we > > > > deliberately chose Longs for this API. if so, we should mention why > > under > > > > Rejected Alternatives. We actually use request quotas < 1 in > > integration > > > > tests to ensure we can throttle easily. > > > > > > > > > > > > > > > > On Fri, Jan 24, 2020 at 5:28 PM Brian Byrne <bby...@confluent.io> > > wrote: > > > > > > > > > Thanks again, Rajini, > > > > > > > > > > Units will have to be implemented on a per-config basis, then. I've > > > > removed > > > > > all language reference to units and replaced QuotaKey -> String > > (config > > > > > name). I've also renamed DescribeEffective -> Resolve, and replaced > > > > --list > > > > > with --describe, and --describe to --resolve to be consistent with > > the > > > > > config command and clear about what functionality is "new". > > > > > > > > > > Thanks, > > > > > Brian > > > > > > > > > > On Fri, Jan 24, 2020 at 2:27 AM Rajini Sivaram < > > > rajinisiva...@gmail.com> > > > > > wrote: > > > > > > > > > > > Hi Brian, > > > > > > > > > > > > Thanks for the responses. > > > > > > > > > > > > 4) Yes, agree that it would be simpler to leave units out of the > > > > initial > > > > > > design. We currently have units that are interpreted by the > > > > configurable > > > > > > callback. The default callback interprets the value as > > > > > > per-broker-bytes-per-second and per-broker-percentage-cores. But > > > > > callbacks > > > > > > using partition-based throughput quotas for example would interpret > > > the > > > > > > value as cluster-wide-bytes-per-second. We could update callbacks > > to > > > > work > > > > > > with units, but as you said, it may be better to leave it out > > > initially > > > > > and > > > > > > address later. > > > > > > > > > > > > > > > > > > > > > > > > On Thu, Jan 23, 2020 at 6:29 PM Brian Byrne <bby...@confluent.io> > > > > wrote: > > > > > > > > > > > > > Thanks Rajini, > > > > > > > > > > > > > > 1) Good catch, fixed. > > > > > > > > > > > > > > 2) You're right. We'd need to extend > > ClientQuotaCallback#quotaLimit > > > > or > > > > > > add > > > > > > > an alternate function. For the sake of an initial implementation, > > > I'm > > > > > > going > > > > > > > to remove '--show-overridden', and a subsequent KIP will have to > > > > > propose > > > > > > an > > > > > > > extents to ClientQuotaCallback to return more detailed > > information. > > > > > > > > > > > > > > 3) You're correct. I've removed the default. > > > > > > > > > > > > > > 4) The idea of the first iteration is be compatible with the > > > existing > > > > > > API, > > > > > > > so no modification to start. The APIs should be kept consistent. > > > If a > > > > > > user > > > > > > > wants to add custom functionality, say an entity type, they'll > > need > > > > to > > > > > > > update their ConfigEntityType any way, and the quotas APIs are > > > meant > > > > to > > > > > > > handle that gracefully by accepting a String which can be > > > propagated. > > > > > > > > > > > > > > The catch is 'units'. Part of the reason for having a default > > unit > > > > was > > > > > > for > > > > > > > backwards compatibility, but maybe it's best to leave units out > > of > > > > the > > > > > > > initial design. This might lead to adding more configuration > > > entries, > > > > > but > > > > > > > it's also the most flexible option. Thoughts? > > > > > > > > > > > > > > Thanks, > > > > > > > Brian > > > > > > > > > > > > > > > > > > > > > On Thu, Jan 23, 2020 at 4:57 AM Rajini Sivaram < > > > > > rajinisiva...@gmail.com> > > > > > > > wrote: > > > > > > > > > > > > > > > Hi Brian, > > > > > > > > > > > > > > > > Thanks for the KIP. Looks good, hope we finally get this in! > > > > > > > > > > > > > > > > A few comments: > > > > > > > > > > > > > > > > 1) All the Admin interface methods seem to be using method > > names > > > > > > starting > > > > > > > > with upper-case letter, should be lower-case to be follow > > > > > conventions. > > > > > > > > 2) Effective quotas returns not only the actual effective > > quota, > > > > but > > > > > > also > > > > > > > > overridden values. I don't think this works with custom quota > > > > > > callbacks. > > > > > > > > 3) KIP says that all quotas are currently bytes-per-second and > > we > > > > > will > > > > > > > use > > > > > > > > RATE_BPS as the default. Request quotas are a percentage. So > > this > > > > > > doesn't > > > > > > > > quite work. We also need to consider how this works with custom > > > > quota > > > > > > > > callbacks. Can custom quota implementations define their own > > > units? > > > > > > > > 4) We seem to be defining a new set of quota-related classes > > e.g. > > > > for > > > > > > > quota > > > > > > > > types, but we haven't considered what we do with the existing > > API > > > > in > > > > > > > > org.apache.kafka.server.quota. Should we keep these consistent? > > > Are > > > > > we > > > > > > > > planning to deprecate some of those? > > > > > > > > > > > > > > > > > > > > > > > > Regards, > > > > > > > > > > > > > > > > Rajini > > > > > > > > > > > > > > > > > > > > > > > > On Wed, Jan 22, 2020 at 7:28 PM Brian Byrne < > > bby...@confluent.io > > > > > > > > > > wrote: > > > > > > > > > > > > > > > > > Hi Jason, > > > > > > > > > > > > > > > > > > I agree on (1). It was Colin's original suggestion, too, but > > he > > > > had > > > > > > > > changed > > > > > > > > > his mind in preference for enums. Strings are the more > > generic > > > > way > > > > > > for > > > > > > > > now, > > > > > > > > > so hopefully Colin can share his thinking when he's back. The > > > > > > > QuotaFilter > > > > > > > > > usage was an error, this has been corrected. > > > > > > > > > > > > > > > > > > For (2), the config-centric mode is what we have today in > > > > > > > CommandConfig: > > > > > > > > > reading/altering the configuration as it's described. The > > > > > > > > > DescribeEffectiveClientQuotas would be resolving the various > > > > config > > > > > > > > entries > > > > > > > > > to see what actually applies to a particular entity. The > > > examples > > > > > > are a > > > > > > > > > little trivial, but the resolution can become much more > > > > complicated > > > > > > as > > > > > > > > the > > > > > > > > > number of config entries grows. > > > > > > > > > > > > > > > > > > List/describe aren't perfect either. Perhaps describe/resolve > > > > are a > > > > > > > > better > > > > > > > > > pair, with DescribeEffectiveClientQuotas -> > > > ResolveClientQuotas? > > > > > > > > > > > > > > > > > > I appreciate the feedback! > > > > > > > > > > > > > > > > > > Thanks, > > > > > > > > > Brian > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > On Tue, Jan 21, 2020 at 12:09 PM Jason Gustafson < > > > > > ja...@confluent.io > > > > > > > > > > > > > > > > wrote: > > > > > > > > > > > > > > > > > > > Hi Brian, > > > > > > > > > > > > > > > > > > > > Thanks for the proposal! I have a couple > > comments/questions: > > > > > > > > > > > > > > > > > > > > 1. I'm having a hard time understanding the point of > > > > > > > > `QuotaEntity.Type`. > > > > > > > > > It > > > > > > > > > > sounds like this might be just for convenience since the > > APIs > > > > are > > > > > > > using > > > > > > > > > > string types. If so, I think it's a bit misleading to > > > represent > > > > > it > > > > > > as > > > > > > > > an > > > > > > > > > > enum. In particular, I cannot see how the UNKNOWN type > > would > > > be > > > > > > used. > > > > > > > > The > > > > > > > > > > `PrincipalBuilder` plugin allows users to provide their own > > > > > > principal > > > > > > > > > type, > > > > > > > > > > so I think the API should be usable even for unknown entity > > > > > types. > > > > > > > Note > > > > > > > > > > also that we appear to be relying on this enum in > > > `QuotaFilter` > > > > > > > class. > > > > > > > > I > > > > > > > > > > think that should be changed to just a string? > > > > > > > > > > > > > > > > > > > > 2. It's a little annoying that we have two separate APIs to > > > > > > describe > > > > > > > > > client > > > > > > > > > > quotas. The names do not really make it clear which API > > > someone > > > > > > > should > > > > > > > > > use. > > > > > > > > > > It might just be a naming problem. In the command utility, > > it > > > > > looks > > > > > > > > like > > > > > > > > > > you are using --list and --describe to distinguish the two. > > > > > Perhaps > > > > > > > the > > > > > > > > > > APIs can be named similarly: e.g. ListClientQuotas and > > > > > > > > > > DescribeClientQuotas. However, looking at the examples, > > it's > > > > > still > > > > > > > not > > > > > > > > > very > > > > > > > > > > clear to me why we need both options. Basically I'm finding > > > the > > > > > > > > > > "config-centric" mode not very intuitive. > > > > > > > > > > > > > > > > > > > > Thanks, > > > > > > > > > > Jason > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > On Fri, Jan 17, 2020 at 2:14 PM Brian Byrne < > > > > bby...@confluent.io > > > > > > > > > > > > > > wrote: > > > > > > > > > > > > > > > > > > > > > Thanks Colin, I've updated the KIP with the relevant > > > changes. > > > > > > > > > > > > > > > > > > > > > > On Fri, Jan 17, 2020 at 10:17 AM Colin McCabe < > > > > > > cmcc...@apache.org> > > > > > > > > > > wrote: > > > > > > > > > > > > > > > > > > > > > > > I thought about this a little bit more, and maybe we > > can > > > > > leave > > > > > > in > > > > > > > > the > > > > > > > > > > > > enums rather than going with strings. But we need to > > > have > > > > an > > > > > > > > > "UNKNOWN" > > > > > > > > > > > > value for all the enums, so that if a value that the > > > client > > > > > > > doesn't > > > > > > > > > > > > understand is returned, it can get translated to that. > > > > This > > > > > is > > > > > > > > what > > > > > > > > > we > > > > > > > > > > > did > > > > > > > > > > > > with the ACLs API, and it worked out well. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Done. One thing I omitted here was that the API still > > > > > > > accepts/returns > > > > > > > > > > > Strings, since there may be plugins that specify their > > own > > > > > > > > types/units. > > > > > > > > > > If > > > > > > > > > > > we'd like to keep it this way, then the UNKNOWN may be > > > > > > unnecessary. > > > > > > > > Let > > > > > > > > > > me > > > > > > > > > > > know how you'd feel this is best resolved. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > On balance, I think we should leave in "units." It > > could > > > > be > > > > > > > useful > > > > > > > > > for > > > > > > > > > > > > future-proofing. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Done. Also added a comment in the ClientQuotaCommand to > > > > default > > > > > > to > > > > > > > > > > RATE_BPS > > > > > > > > > > > if no unit is supplied to ease adoption. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Also, since there are other kinds of quotas not covered > > > by > > > > > this > > > > > > > > API, > > > > > > > > > we > > > > > > > > > > > > should rename DescribeQuotas -> DescribeClientQuotas, > > > > > > AlterQuotas > > > > > > > > -> > > > > > > > > > > > > AlterClientQuotas, etc. etc. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Done. Updated command and script name, too. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Maybe QuotaFilter doesn't need a "rule" argument to its > > > > > > > constructor > > > > > > > > > > right > > > > > > > > > > > > now. We can just do literal matching for everything. > > > > Like I > > > > > > > said > > > > > > > > > > > earlier, > > > > > > > > > > > > I don't think people do a lot of prefixing of principal > > > > > names. > > > > > > > > When > > > > > > > > > we > > > > > > > > > > > > added the "prefix matching" stuff for ACLs, it was > > mostly > > > > to > > > > > > let > > > > > > > > > people > > > > > > > > > > > do > > > > > > > > > > > > it for topics. Then we made it more generic because it > > > was > > > > > > easy > > > > > > > to > > > > > > > > > do > > > > > > > > > > > so. > > > > > > > > > > > > In this case, the API is probably easier to understand > > if > > > > we > > > > > > just > > > > > > > > do > > > > > > > > > a > > > > > > > > > > > > literal match. We can always have a follow-on KIP to > > add > > > > > > fancier > > > > > > > > > > > filtering > > > > > > > > > > > > if needed. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Done. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > For DescribeEffectiveQuotasResult, if you request all > > > > > relevant > > > > > > > > > quotas, > > > > > > > > > > it > > > > > > > > > > > > would be nice to see which ones apply and which ones > > > don't. > > > > > > > Right > > > > > > > > > now, > > > > > > > > > > > you > > > > > > > > > > > > just get a map, but you don't know which quotas are > > > > actually > > > > > in > > > > > > > > > force, > > > > > > > > > > > and > > > > > > > > > > > > which are not relevant but might be in the future if a > > > > > > different > > > > > > > > > quota > > > > > > > > > > > gets > > > > > > > > > > > > deleted. One way to do this would be to have two > > maps-- > > > > one > > > > > > for > > > > > > > > > > > applicable > > > > > > > > > > > > quotas and one for shadowed quotas. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > So the way it's specified is that it maps QuotaKey -> > > > Value, > > > > > > > however > > > > > > > > > > Value > > > > > > > > > > > is actually defined to have two parts: the entry, and a > > > list > > > > of > > > > > > > > > > overridden > > > > > > > > > > > entries (where an entry is the value, along with the > > > source). > > > > > > > Perhaps > > > > > > > > > the > > > > > > > > > > > Value is poorly named, or maybe there's a simpler > > structure > > > > to > > > > > be > > > > > > > > had? > > > > > > > > > > > > > > > > > > > > > > Thanks, > > > > > > > > > > > Brian > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > On Tue, Jan 14, 2020, at 13:32, Brian Byrne wrote: > > > > > > > > > > > > > Hi Colin, > > > > > > > > > > > > > > > > > > > > > > > > > > Your feedback is appreciated, thank you. > > > > > > > > > > > > > > > > > > > > > > > > > > On Tue, Jan 14, 2020 at 11:34 AM Colin McCabe < > > > > > > > > cmcc...@apache.org> > > > > > > > > > > > > wrote: > > > > > > > > > > > > > > > > > > > > > > > > > > > This is probably a nitpick, but it would be nice to > > > > > specify > > > > > > > > that > > > > > > > > > > this > > > > > > > > > > > > list > > > > > > > > > > > > > > is in order of highest priority to lowest. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Done. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Hmm. Maybe --show-overridden or > > --include-overridden > > > > is > > > > > a > > > > > > > > better > > > > > > > > > > > flag > > > > > > > > > > > > > > name? > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Done (--show-overridden). > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > I think it would be nice to avoid using enums for > > > > > > > > > QuotaEntity#Type, > > > > > > > > > > > > > > QuotaKey#Type, and QuotaFilter#Rule. With enums, > > we > > > > have > > > > > > to > > > > > > > > > worry > > > > > > > > > > > > about > > > > > > > > > > > > > > forwards and backwards compatibility problems. For > > > > > > example, > > > > > > > > what > > > > > > > > > > do > > > > > > > > > > > > you do > > > > > > > > > > > > > > when you're querying a broker that has a new value > > > for > > > > > one > > > > > > of > > > > > > > > > > these, > > > > > > > > > > > > that > > > > > > > > > > > > > > is not in your enum? In the past, we've created > > an > > > > > > UNKNOWN > > > > > > > > > value > > > > > > > > > > > for > > > > > > > > > > > > enum > > > > > > > > > > > > > > types to solve this conundrum, but I'm not sure the > > > > extra > > > > > > > > > > complexity > > > > > > > > > > > is > > > > > > > > > > > > > > worth it here. We can jut make them strings and > > > avoid > > > > > > > worrying > > > > > > > > > > about > > > > > > > > > > > > the > > > > > > > > > > > > > > compatibility issues. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Makes sense. Done. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Is QuotaKey#Units really needed? It seems like > > > perhaps > > > > > > > > > > QuotaKey#Type > > > > > > > > > > > > > > could imply the units used. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Possibly, maybe. It depends on how much structure is > > > > > useful, > > > > > > > > which > > > > > > > > > > > > > influences the implementation in the broker. For > > > example, > > > > > for > > > > > > > the > > > > > > > > > > > > existing > > > > > > > > > > > > > (global) bytes-per-second types (e.g. consumer byte > > > > rate), > > > > > it > > > > > > > may > > > > > > > > > be > > > > > > > > > > > > useful > > > > > > > > > > > > > to define them on a per-broker BPS basis, and in some > > > > > cases, > > > > > > in > > > > > > > > > terms > > > > > > > > > > > of > > > > > > > > > > > > > shares. The question becomes whether it'd be better > > to > > > > > have a > > > > > > > > > module > > > > > > > > > > in > > > > > > > > > > > > the > > > > > > > > > > > > > broker that is capable of deducing the effective > > quota > > > > > > > > > automatically > > > > > > > > > > > > among > > > > > > > > > > > > > different units for the same quota type, or whether > > > each > > > > > > should > > > > > > > > be > > > > > > > > > > > > handled > > > > > > > > > > > > > individually. > > > > > > > > > > > > > > > > > > > > > > > > > > Given we don't expect many units, and some units may > > be > > > > > > > > > incompatible > > > > > > > > > > > with > > > > > > > > > > > > > others, perhaps it is best to have the unit implicit > > in > > > > the > > > > > > > type > > > > > > > > > > > string, > > > > > > > > > > > > to > > > > > > > > > > > > > be handled by the broker appropriately. > > > > > > > > > > > > > > > > > > > > > > > > > > I've updated the KIP to reflect this change, which > > > > factors > > > > > > out > > > > > > > > the > > > > > > > > > > > > > QuotaKey. Let me know your thoughts. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > How common is the prefix matching use-case? I > > > haven't > > > > > > heard > > > > > > > > > about > > > > > > > > > > > > people > > > > > > > > > > > > > > setting up principal names with a common prefix or > > > > > anything > > > > > > > > like > > > > > > > > > > > > that-- is > > > > > > > > > > > > > > that commonly done? > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > It was, in part, for exposition, but would handle a > > > case > > > > > > where > > > > > > > > > > > principals > > > > > > > > > > > > > could be prefixed by organization/team name, > > numbered, > > > or > > > > > the > > > > > > > > like. > > > > > > > > > > If > > > > > > > > > > > > you > > > > > > > > > > > > > prefer I remove the rules and just accept a pattern, > > > > that's > > > > > > > also > > > > > > > > an > > > > > > > > > > > > option. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > I sort of feel like maybe we could have a simpler > > API > > > > for > > > > > > > > > > > > describeQuotas > > > > > > > > > > > > > > where it takes a map of quota entity type to value, > > > and > > > > > we > > > > > > > do a > > > > > > > > > > > > logical AND > > > > > > > > > > > > > > On that. I'm not sure if there's really a reason > > why > > > > it > > > > > > > needs > > > > > > > > to > > > > > > > > > > be > > > > > > > > > > > a > > > > > > > > > > > > > > collection rather than a set, in other words... > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > For clarification, are you suggesting an interface > > > where > > > > > the > > > > > > > user > > > > > > > > > > might > > > > > > > > > > > > > provide {type=user, name=x} and it would return all > > > > > entities > > > > > > > that > > > > > > > > > > > match, > > > > > > > > > > > > > with their resulting quota values? Should I scrap > > > pattern > > > > > > > > matching > > > > > > > > > > for > > > > > > > > > > > > now, > > > > > > > > > > > > > since it's a simple extension that can be done at a > > > > future > > > > > > > time? > > > > > > > > > > > > > > > > > > > > > > > > > > Thanks, > > > > > > > > > > > > > Brian > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > On Wed, Dec 11, 2019, at 15:30, Brian Byrne wrote: > > > > > > > > > > > > > > > Hello all, > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > I'm reviving the discussion for adding a quotas > > API > > > > to > > > > > > the > > > > > > > > > admin > > > > > > > > > > > > client > > > > > > > > > > > > > > by > > > > > > > > > > > > > > > submitting a new proposal. There are some notable > > > > > changes > > > > > > > > from > > > > > > > > > > > > previous > > > > > > > > > > > > > > > attempts, namely a way to deduce the effective > > > quota > > > > > for > > > > > > a > > > > > > > > > client > > > > > > > > > > > > > > (entity), > > > > > > > > > > > > > > > a way to query for configured quotas, and the > > > concept > > > > > of > > > > > > > > > "units" > > > > > > > > > > on > > > > > > > > > > > > > > quotas, > > > > > > > > > > > > > > > among other minor updates. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Please take a look, and I'll be happy to make any > > > > > > > > > clarifications > > > > > > > > > > > and > > > > > > > > > > > > > > > modifications in regards to feedback. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > https://cwiki.apache.org/confluence/display/KAFKA/KIP-546%3A+Add+quota-specific+APIs+to+the+Admin+Client%2C+redux > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Thanks, > > > > > > > > > > > > > > > Brian > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >