Thanks Ismael. That is good point. I have updated the javadoc. On Sun, Sep 8, 2019 at 5:38 PM Ismael Juma <ism...@juma.me.uk> wrote:
> Hi Rajini, > > Can you please update the javadoc for every sync method to be explicit > about the fact that they should not block and the reasoning? > > Ismael > > On Sun, Sep 8, 2019, 9:21 AM Rajini Sivaram <rajinisiva...@gmail.com> > wrote: > > > Hi all, > > > > Thanks everyone for the very useful discussion. I have updated the KIP to > > make *createAcls()* and *deleteAcls()* asynchronous. Also added a section > > under `*Rejected Alternatives*` for async *authorize()*, which we can > > revisit in future if requirement arises. > > > > Regards, > > > > Rajini > > > > > > On Fri, Sep 6, 2019 at 9:17 PM Ismael Juma <ism...@juma.me.uk> wrote: > > > > > It's not uncommon for people to do large numbers of admin operations > per > > > second. We've seen it many times in production. It's often a bug, but > the > > > system must cope with it without affecting other users of the same > Kafka > > > cluster. > > > > > > Ismael > > > > > > On Fri, Sep 6, 2019, 9:32 AM Don Bosco Durai <bo...@apache.org> wrote: > > > > > > > +1 > > > > > > > > I might be wrong here, but here are few of my assumptions.. > > > > > > > > 1. Unlike transactional services, in Kafka most of the users are > > > > application users, so once the connection is established, then they > are > > > > going to be long running sessions. So the caching is more predictable > > and > > > > heavy lifting can be done during initial session setup and cache can > be > > > > frequently updated using background thread. KSQL might have a > different > > > > flow, but I don't have enough datapoints for it. > > > > 2. For publish/consume authorization calls, providing async option > will > > > be > > > > misleading for Kafka like load > > > > 3. For admin calls, hopefully no one does hundreds of call in > multiple > > > > thread within few seconds. This would be a bad design. > > > > > > > > So I feel, we should be okay with sync calls for now. And consider > > async > > > > in the future if needed. At least in Apache Ranger implementation, we > > > would > > > > be okay using sync operation. I am not sure if any other plugin > > > > implementation would benefit from async implementation. > > > > > > > > Thanks > > > > > > > > Bosco > > > > > > > > On 9/6/19, 8:45 AM, "Ismael Juma" <ism...@juma.me.uk> wrote: > > > > > > > > One more thing: if people have strong opinions that authorize has > > to > > > be > > > > sync, we could leave it like that for now. If needed, we can > later > > > add > > > > an > > > > authorizeAsync with another method returning a Boolean indicating > > > that > > > > it's > > > > supported. That is, there is a path to evolve the interface (even > > if > > > a > > > > bit > > > > ugly). > > > > > > > > What about the other methods, is there consensus that they should > > be > > > > updated to return CompletionStage? > > > > > > > > Ismael > > > > > > > > On Fri, Sep 6, 2019, 8:32 AM Ismael Juma <ism...@juma.me.uk> > > wrote: > > > > > > > > > I'm on the move, but what Rajini said seems reasonable. I don't > > > think > > > > > using SSDs solves the issue. They can still hang for seconds > when > > > > they > > > > > fail. Also, many people may not have local SSDs available > (remote > > > > SSDs like > > > > > EBS hang for tens of seconds when there are issues). > > > > > > > > > > We are currently vulnerable to all of these in the normal > > > read/write > > > > path, > > > > > but it seems suboptimal to continue assuming non blocking > > behavior > > > > for > > > > > things that actually do block. > > > > > > > > > > Ismael > > > > > > > > > > On Fri, Sep 6, 2019, 8:24 AM Rajini Sivaram < > > > rajinisiva...@gmail.com > > > > > > > > > > wrote: > > > > > > > > > >> Hi Jun, > > > > >> > > > > >> For ACLs, the size is also dependent on the number of users. > So > > in > > > > >> deployments with large number of users where some users are > not > > > > active, an > > > > >> LRU cache may be useful. Agree that there may be other > solutions > > > > that help > > > > >> avoid the requirement for an async API even for this case. > > > > >> > > > > >> I wasn't expecting our threading model to change very much. > > Having > > > > said > > > > >> that, I haven't figured out how the purgatory can be adapted > to > > > work > > > > >> efficiently for this. I was thinking: > > > > >> 1) If authorization future is complete when returning from > > > > authorize() > > > > >> call, we invoke the method immediately on the request thread > > > > >> 2) If future is not complete, the request goes into a > purgatory > > > > >> 3) When future completes, we mark the request ready to be run. > > > This > > > > can be > > > > >> done on ForkJoinPool.commonPool or an executor. But we don't > > > handle > > > > the > > > > >> request on that thread > > > > >> 4) We handle the request on the request thread after 3). > > > > >> > > > > >> I totally agree that this adds complexity to the code. Will > wait > > > for > > > > >> Ismael > > > > >> to comment on whether he had a different model in mind. > > > > >> > > > > >> Thanks, > > > > >> > > > > >> Rajini > > > > >> > > > > >> > > > > >> On Thu, Sep 5, 2019 at 10:29 PM Jun Rao <j...@confluent.io> > > wrote: > > > > >> > > > > >> > Hi, Ismael, > > > > >> > > > > > >> > Yes, I agree that there are 2 separate discussion points, > one > > on > > > > the API > > > > >> > and the other on the implementation. > > > > >> > > > > > >> > First on the API, in general, my feeling is that the > > authorize() > > > > call is > > > > >> > expected to be fast to reduce request latency. Adding an > async > > > API > > > > >> could be > > > > >> > mis-leading since it might give users the impression that it > > > > would be > > > > >> > arbitrarily long. In the short term, currently, we cache all > > > > partition > > > > >> > level metadata on every broker. The authorization metadata > is > > > > >> proportional > > > > >> > to the number of topics, which typically is less in size. So > > it > > > > we can > > > > >> > cache all partition level metadata, we should be able to > cache > > > all > > > > >> > authorization metadata. Longer term, if we want to support > > more > > > > metadata > > > > >> > beyond memory, another option is to put all metadata in an > SSD > > > > backed > > > > >> > key/value store. The lookup time could still be under 1ms, > > which > > > > we > > > > >> could > > > > >> > potentially absorb in the request threads. So, I am not sure > > > async > > > > >> > authorize() api is strictly needed even in the long term. > > > > >> > > > > > >> > Second on the implementation. I was more concerned about the > > > > impact on > > > > >> our > > > > >> > threading model. If we make authorize() async, some threads > > have > > > > to > > > > >> > complete the future when it's ready. It seems to me that > those > > > > threads > > > > >> have > > > > >> > to be inside the Authorizer implementation since only it > knows > > > > when to > > > > >> > complete a future? If so, it feels weird that all the logic > of > > > > request > > > > >> > handling post authorize() is now handled by external threads > > > > inside a > > > > >> > plugin. It's not clear how we can configure and monitor > them, > > > and > > > > how > > > > >> > throttling would work. Perhaps we can provide a bit more > > detail > > > > on the > > > > >> new > > > > >> > threading model. > > > > >> > > > > > >> > Thanks, > > > > >> > > > > > >> > Jun > > > > >> > > > > > >> > On Wed, Sep 4, 2019 at 9:56 PM Ismael Juma < > ism...@juma.me.uk > > > > > > > wrote: > > > > >> > > > > > >> > > Hi Jun, > > > > >> > > > > > > >> > > I think it's important to discuss the pluggable API versus > > the > > > > calling > > > > >> > > implementation as two separate points. > > > > >> > > > > > > >> > > From an API perspective, are you suggesting that we should > > > tell > > > > users > > > > >> > that > > > > >> > > they cannot block in authorize? Or are you saying that > it's > > OK > > > > to > > > > >> block > > > > >> > on > > > > >> > > authorize on occasion and the recommendation would be for > > > > people to > > > > >> > > increase the number of threads in the request thread pool? > > > > >> > Architecturally, > > > > >> > > this feels wrong in my opinion. > > > > >> > > > > > > >> > > From the calling implementation perspective, you don't > need > > a > > > > >> callback. > > > > >> > You > > > > >> > > can basically say: > > > > >> > > > > > > >> > > authorize(...).map { result => > > > > >> > > ... > > > > >> > > } > > > > >> > > > > > > >> > > And then have a common method take that Future and handle > it > > > > >> > synchronously > > > > >> > > if it's already complete or submit it to the purgatory if > > not. > > > > This is > > > > >> > > similar to how many modern async web libraries work. > > > > >> > > > > > > >> > > As Rajini said, this could be done later. The initial > > > > implementation > > > > >> > could > > > > >> > > simply do `toCompletableFuture().get()` to do it > > > synchronously. > > > > But it > > > > >> > > would mean that we could add this functionality without > > > > changing the > > > > >> > > pluggable interface. > > > > >> > > > > > > >> > > Ismael > > > > >> > > > > > > >> > > On Wed, Sep 4, 2019 at 5:29 AM Jun Rao <j...@confluent.io> > > > > wrote: > > > > >> > > > > > > >> > > > Hi, Rajini, > > > > >> > > > > > > > >> > > > Thanks for the KIP. I was concerned about #4 too. If we > > > > change the > > > > >> > > handling > > > > >> > > > of all requests to use an async authorize() api, will > that > > > > cause the > > > > >> > code > > > > >> > > > much harder to understand? There are quite a few > callbacks > > > > already. > > > > >> I > > > > >> > am > > > > >> > > > not sure that we want to introduce more of those. The > > > benefit > > > > from > > > > >> > async > > > > >> > > > authorize() api seems limited. > > > > >> > > > > > > > >> > > > Jun > > > > >> > > > > > > > >> > > > On Wed, Sep 4, 2019 at 5:38 PM Rajini Sivaram < > > > > >> rajinisiva...@gmail.com > > > > >> > > > > > > >> > > > wrote: > > > > >> > > > > > > > >> > > > > Hi Don, > > > > >> > > > > > > > > >> > > > > Thanks for your note. > > > > >> > > > > > > > > >> > > > > 1) The intention is to avoid blocking in the calling > > > > thread. We > > > > >> > already > > > > >> > > > > have several requests that are put into a purgatory > when > > > > waiting > > > > >> for > > > > >> > > > remote > > > > >> > > > > communication, for example produce request waiting for > > > > >> replication. > > > > >> > > Since > > > > >> > > > > we have a limited number of request threads in the > > broker, > > > > we > > > > >> want to > > > > >> > > > make > > > > >> > > > > progress with other requests, while one is waiting on > > any > > > > form of > > > > >> > > remote > > > > >> > > > > communication. > > > > >> > > > > > > > > >> > > > > 2) Async management calls will be useful with the > > default > > > > >> authorizer > > > > >> > > when > > > > >> > > > > KIP-500 removes ZK and we rely on Kafka instead. Our > > > current > > > > >> ZK-based > > > > >> > > > > implementation as well as any custom implementations > > that > > > > don't > > > > >> want > > > > >> > to > > > > >> > > > be > > > > >> > > > > async will just need to return a sync'ed value. So > > instead > > > > of > > > > >> > > returning ` > > > > >> > > > > value`, the code would just return > > > > >> > > > > `CompletableFuture.completedFuture(value) > > > > >> > > > > `. So it would be just a single line change in the > > > > implementation > > > > >> > with > > > > >> > > > the > > > > >> > > > > new API. The caller would treat completedFuture > exactly > > as > > > > it does > > > > >> > > today, > > > > >> > > > > processing the request synchronously without using a > > > > purgatory. > > > > >> > > > > > > > > >> > > > > 3) For implementations that return a completedFuture > as > > > > described > > > > >> in > > > > >> > > 2), > > > > >> > > > > the behaviour would remain exactly the same. No > > additional > > > > >> threads or > > > > >> > > > > purgatory will be used for this case. So there would > be > > no > > > > >> > performance > > > > >> > > > > penalty. For implementations that return a future that > > is > > > > not > > > > >> > complete, > > > > >> > > > we > > > > >> > > > > prioritise running more requests concurrently. So in a > > > > deployment > > > > >> > with > > > > >> > > a > > > > >> > > > > large number of clients, we would improve performance > by > > > > allowing > > > > >> > other > > > > >> > > > > requests to be processed on the request threads while > > some > > > > are > > > > >> > waiting > > > > >> > > > for > > > > >> > > > > authorization metadata. > > > > >> > > > > > > > > >> > > > > 4) I was concerned about this too. The goal is to make > > the > > > > API > > > > >> > flexible > > > > >> > > > > enough to handle large scale deployments in future > when > > > > caching > > > > >> all > > > > >> > > > > authorization metadata in each broker is not viable. > > Using > > > > an > > > > >> async > > > > >> > API > > > > >> > > > > that returns CompletionStage, the caller has the > option > > to > > > > handle > > > > >> the > > > > >> > > > > result synchronously or asynchronously, so we don't > > > > necessarily > > > > >> need > > > > >> > to > > > > >> > > > > update the calling code right away. Custom authorizers > > > > using the > > > > >> > async > > > > >> > > > API > > > > >> > > > > have full control over whether authorization is > > performed > > > > in-line > > > > >> > since > > > > >> > > > > completedFuture will always be handled synchronously. > We > > > do > > > > need > > > > >> to > > > > >> > > > update > > > > >> > > > > KafkaApis to take advantage of the asynchronous API to > > > > improve > > > > >> scale. > > > > >> > > > Even > > > > >> > > > > though this is a big change, since we will be doing > the > > > > same for > > > > >> all > > > > >> > > > > requests, it shouldn't be too hard to maintain since > the > > > > same > > > > >> pattern > > > > >> > > > will > > > > >> > > > > be used for all requests. > > > > >> > > > > > > > > >> > > > > Regards, > > > > >> > > > > > > > > >> > > > > Rajini > > > > >> > > > > > > > > >> > > > > On Tue, Sep 3, 2019 at 11:48 PM Don Bosco Durai < > > > > bo...@apache.org > > > > >> > > > > > >> > > > wrote: > > > > >> > > > > > > > > >> > > > > > Hi Rajini > > > > >> > > > > > > > > > >> > > > > > Help me understand this a bit more. > > > > >> > > > > > > > > > >> > > > > > 1. For all practical purpose, without authorization > > you > > > > can't > > > > >> go to > > > > >> > > the > > > > >> > > > > > next step. The calling code needs to block anyway. > So > > > > should we > > > > >> > just > > > > >> > > > let > > > > >> > > > > > the implementation code do the async part? > > > > >> > > > > > 2. If you feel management calls need to be async, > then > > > we > > > > should > > > > >> > > > consider > > > > >> > > > > > another set of async APIs. I don't feel we should > > > > complicate it > > > > >> > > > further ( > > > > >> > > > > > 3. Another concern I have is wrt performance. Kafka > > has > > > > been > > > > >> built > > > > >> > to > > > > >> > > > > > handle 1000s per second requests. Not sure whether > > > making > > > > it > > > > >> async > > > > >> > > will > > > > >> > > > > add > > > > >> > > > > > any unnecessary overhead. > > > > >> > > > > > 4. How much complication would this add on the > calling > > > > side? > > > > >> And is > > > > >> > > it > > > > >> > > > > > worth it? > > > > >> > > > > > > > > > >> > > > > > Thanks > > > > >> > > > > > > > > > >> > > > > > Bosco > > > > >> > > > > > > > > > >> > > > > > > > > > >> > > > > > On 9/3/19, 8:50 AM, "Rajini Sivaram" < > > > > rajinisiva...@gmail.com> > > > > >> > > wrote: > > > > >> > > > > > > > > > >> > > > > > Hi all, > > > > >> > > > > > > > > > >> > > > > > Ismael brought up a point that it will be good > to > > > > make the > > > > >> > > > Authorizer > > > > >> > > > > > interface asynchronous to avoid blocking request > > > > threads > > > > >> during > > > > >> > > > > remote > > > > >> > > > > > operations. > > > > >> > > > > > > > > > >> > > > > > 1) Since we want to support different backends > for > > > > >> > authorization > > > > >> > > > > > metadata, > > > > >> > > > > > making createAcls() and deleteAcls() > asynchronous > > > > makes > > > > >> sense > > > > >> > > since > > > > >> > > > > > these > > > > >> > > > > > always involve remote operations. When KIP-500 > > > removes > > > > >> > ZooKeeper, > > > > >> > > > we > > > > >> > > > > > would > > > > >> > > > > > want to move ACLs to Kafka and async updates > will > > > > avoid > > > > >> > > unnecessary > > > > >> > > > > > blocking. > > > > >> > > > > > 2) For authorize() method, we currently use > cached > > > > ACLs in > > > > >> the > > > > >> > > > > built-in > > > > >> > > > > > authorizers, so synchronous authorise operations > > > work > > > > well > > > > >> now. > > > > >> > > But > > > > >> > > > > > async > > > > >> > > > > > authorize() would support this scenario as well > as > > > > >> authorizers > > > > >> > in > > > > >> > > > > large > > > > >> > > > > > organisations where an LRU cache would enable a > > > > smaller > > > > >> cache > > > > >> > > even > > > > >> > > > > > when the > > > > >> > > > > > backend holds a large amount of ACLs for > > > infrequently > > > > used > > > > >> > > > resources > > > > >> > > > > or > > > > >> > > > > > users who don't use the system frequently. > > > > >> > > > > > > > > > >> > > > > > For both cases, the built-in authorizer will > > > continue > > > > to be > > > > >> > > > > > synchronous, > > > > >> > > > > > using CompletableFuture.completedFuture() to > > return > > > > the > > > > >> actual > > > > >> > > > > result. > > > > >> > > > > > But > > > > >> > > > > > async API will make custom authorizer > > > implementations > > > > more > > > > >> > > > flexible. > > > > >> > > > > I > > > > >> > > > > > would like to know if there are any concerns > with > > > > these > > > > >> changes > > > > >> > > > > before > > > > >> > > > > > updating the KIP. > > > > >> > > > > > > > > > >> > > > > > *Proposed API:* > > > > >> > > > > > public interface Authorizer extends > Configurable, > > > > Closeable > > > > >> { > > > > >> > > > > > > > > > >> > > > > > Map<Endpoint, CompletionStage<Void>> > > > > >> > > start(AuthorizerServerInfo > > > > >> > > > > > serverInfo); > > > > >> > > > > > List<CompletionStage<AuthorizationResult>> > > > > >> > > > > > authorize(AuthorizableRequestContext > > requestContext, > > > > >> > List<Action> > > > > >> > > > > > actions); > > > > >> > > > > > List<CompletionStage<AclCreateResult>> > > > > >> > > > > > createAcls(AuthorizableRequestContext > > > requestContext, > > > > >> > > > > List<AclBinding> > > > > >> > > > > > aclBindings); > > > > >> > > > > > List<CompletionStage<AclDeleteResult>> > > > > >> > > > > > deleteAcls(AuthorizableRequestContext > > > requestContext, > > > > >> > > > > > List<AclBindingFilter> aclBindingFilters); > > > > >> > > > > > CompletionStage<Collection<AclBinding>> > > > > >> > acls(AclBindingFilter > > > > >> > > > > > filter); > > > > >> > > > > > } > > > > >> > > > > > > > > > >> > > > > > > > > > >> > > > > > Thank you, > > > > >> > > > > > > > > > >> > > > > > Rajini > > > > >> > > > > > > > > > >> > > > > > On Sun, Aug 18, 2019 at 6:25 PM Don Bosco Durai > < > > > > >> > > bo...@apache.org> > > > > >> > > > > > wrote: > > > > >> > > > > > > > > > >> > > > > > > Hi Rajini > > > > >> > > > > > > > > > > >> > > > > > > Thanks for clarifying. I am good for now. > > > > >> > > > > > > > > > > >> > > > > > > Regards > > > > >> > > > > > > > > > > >> > > > > > > Bosco > > > > >> > > > > > > > > > > >> > > > > > > > > > > >> > > > > > > On 8/16/19, 11:30 AM, "Rajini Sivaram" < > > > > >> > > rajinisiva...@gmail.com > > > > >> > > > > > > > > >> > > > > > wrote: > > > > >> > > > > > > > > > > >> > > > > > > Hi Don, > > > > >> > > > > > > > > > > >> > > > > > > That should be fine. I guess Ranger loads > > > > policies > > > > >> from > > > > >> > the > > > > >> > > > > > database > > > > >> > > > > > > synchronously when the authorizer is > > > configured, > > > > >> similar > > > > >> > to > > > > >> > > > > > > SimpleAclAuthorizer loading from > ZooKeeper. > > > > Ranger can > > > > >> > > > continue > > > > >> > > > > > to load > > > > >> > > > > > > synchronously from `configure()` or > > `start()` > > > > and > > > > >> return > > > > >> > an > > > > >> > > > > > empty map > > > > >> > > > > > > from > > > > >> > > > > > > `start()`. That would retain the existing > > > > behaviour.. > > > > >> > When > > > > >> > > > the > > > > >> > > > > > same > > > > >> > > > > > > database stores policies for all listeners > > and > > > > the > > > > >> > policies > > > > >> > > > are > > > > >> > > > > > not > > > > >> > > > > > > stored > > > > >> > > > > > > in Kafka, there is no value in making the > > load > > > > >> > > asynchronous. > > > > >> > > > > > > > > > > >> > > > > > > Regards, > > > > >> > > > > > > > > > > >> > > > > > > Rajini > > > > >> > > > > > > > > > > >> > > > > > > > > > > >> > > > > > > On Fri, Aug 16, 2019 at 6:43 PM Don Bosco > > > Durai > > > > < > > > > >> > > > > > bo...@apache.org> > > > > >> > > > > > > wrote: > > > > >> > > > > > > > > > > >> > > > > > > > Hi Rajini > > > > >> > > > > > > > > > > > >> > > > > > > > Assuming this doesn't affect custom > > plugins, > > > > I don't > > > > >> > have > > > > >> > > > any > > > > >> > > > > > > concerns > > > > >> > > > > > > > regarding this. > > > > >> > > > > > > > > > > > >> > > > > > > > I do have one question regarding: > > > > >> > > > > > > > > > > > >> > > > > > > > "For authorizers that don’t store > metadata > > > in > > > > >> > ZooKeeper, > > > > >> > > > > > ensure that > > > > >> > > > > > > > authorizer metadata for each listener is > > > > available > > > > >> > before > > > > >> > > > > > starting > > > > >> > > > > > > up the > > > > >> > > > > > > > listener. This enables different > > > authorization > > > > >> metadata > > > > >> > > > > stores > > > > >> > > > > > for > > > > >> > > > > > > > different listeners." > > > > >> > > > > > > > > > > > >> > > > > > > > Since Ranger uses its own database for > > > storing > > > > >> > policies, > > > > >> > > do > > > > >> > > > > you > > > > >> > > > > > > anticipate > > > > >> > > > > > > > any issues? > > > > >> > > > > > > > > > > > >> > > > > > > > Thanks > > > > >> > > > > > > > > > > > >> > > > > > > > Bosco > > > > >> > > > > > > > > > > > >> > > > > > > > > > > > >> > > > > > > > On 8/16/19, 6:49 AM, "Rajini Sivaram" < > > > > >> > > > > > rajinisiva...@gmail.com> > > > > >> > > > > > > wrote: > > > > >> > > > > > > > > > > > >> > > > > > > > Hi all, > > > > >> > > > > > > > > > > > >> > > > > > > > I made another change to the KIP. > The > > > KIP > > > > was > > > > >> > > > originally > > > > >> > > > > > > proposing to > > > > >> > > > > > > > extend SimpleAclAuthorizer to also > > > > implement the > > > > >> > new > > > > >> > > > API > > > > >> > > > > > (in > > > > >> > > > > > > addition > > > > >> > > > > > > > to > > > > >> > > > > > > > the existing API). But since we use > > the > > > > new API > > > > >> > when > > > > >> > > > > > available, > > > > >> > > > > > > this > > > > >> > > > > > > > can > > > > >> > > > > > > > break custom authorizers that extend > > > this > > > > class > > > > >> and > > > > >> > > > > > override > > > > >> > > > > > > specific > > > > >> > > > > > > > methods of the old API. To avoid > > > breaking > > > > any > > > > >> > > existing > > > > >> > > > > > custom > > > > >> > > > > > > > implementations that extend this > > class, > > > > >> > particularly > > > > >> > > > > > because it > > > > >> > > > > > > is in > > > > >> > > > > > > > the > > > > >> > > > > > > > public package kafka.security.auth, > > the > > > > KIP now > > > > >> > > > proposes > > > > >> > > > > to > > > > >> > > > > > > retain the > > > > >> > > > > > > > old > > > > >> > > > > > > > authorizer as-is. > SimpleAclAuthorizer > > > > will > > > > >> > continue > > > > >> > > to > > > > >> > > > > > > implement the > > > > >> > > > > > > > old > > > > >> > > > > > > > API, but will be deprecated. A new > > > > authorizer > > > > >> > > > > > implementation > > > > >> > > > > > > > > > kafka.security.authorizer.AclAuthorizer > > > > will be > > > > >> > added > > > > >> > > > for > > > > >> > > > > > the > > > > >> > > > > > > new API > > > > >> > > > > > > > (this > > > > >> > > > > > > > will not be in the public package). > > > > >> > > > > > > > > > > > >> > > > > > > > Please let me know if you have any > > > > concerns. > > > > >> > > > > > > > > > > > >> > > > > > > > Regards, > > > > >> > > > > > > > > > > > >> > > > > > > > Rajini > > > > >> > > > > > > > > > > > >> > > > > > > > > > > > >> > > > > > > > On Fri, Aug 16, 2019 at 8:48 AM > Rajini > > > > Sivaram < > > > > >> > > > > > > > rajinisiva...@gmail.com> > > > > >> > > > > > > > wrote: > > > > >> > > > > > > > > > > > >> > > > > > > > > Thanks Colin. > > > > >> > > > > > > > > > > > > >> > > > > > > > > If there are no other concerns, I > > will > > > > start > > > > >> vote > > > > >> > > > later > > > > >> > > > > > today. > > > > >> > > > > > > Many > > > > >> > > > > > > > thanks > > > > >> > > > > > > > > to every one for the feedback. > > > > >> > > > > > > > > > > > > >> > > > > > > > > Regards, > > > > >> > > > > > > > > > > > > >> > > > > > > > > Rajini > > > > >> > > > > > > > > > > > > >> > > > > > > > > > > > > >> > > > > > > > > On Thu, Aug 15, 2019 at 11:57 PM > > Colin > > > > McCabe > > > > >> < > > > > >> > > > > > > cmcc...@apache.org> > > > > >> > > > > > > > wrote: > > > > >> > > > > > > > > > > > > >> > > > > > > > >> Thanks, Rajini. It looks good to > > me. > > > > >> > > > > > > > >> > > > > >> > > > > > > > >> best, > > > > >> > > > > > > > >> Colin > > > > >> > > > > > > > >> > > > > >> > > > > > > > >> > > > > >> > > > > > > > >> On Thu, Aug 15, 2019, at 11:37, > > > Rajini > > > > >> Sivaram > > > > >> > > > wrote: > > > > >> > > > > > > > >> > Hi Colin, > > > > >> > > > > > > > >> > > > > > >> > > > > > > > >> > Thanks for the review. I have > > > > updated the > > > > >> KIP > > > > >> > to > > > > >> > > > > move > > > > >> > > > > > the > > > > >> > > > > > > > interfaces for > > > > >> > > > > > > > >> > request context and server info > > to > > > > the > > > > >> > > authorizer > > > > >> > > > > > package. > > > > >> > > > > > > These > > > > >> > > > > > > > are now > > > > >> > > > > > > > >> > called > AuthorizableRequestContext > > > and > > > > >> > > > > > AuthorizerServerInfo. > > > > >> > > > > > > > Endpoint is > > > > >> > > > > > > > >> now > > > > >> > > > > > > > >> > a class in > > org.apache.kafka.common > > > > to make > > > > >> it > > > > >> > > > > reusable > > > > >> > > > > > > since we > > > > >> > > > > > > > already > > > > >> > > > > > > > >> > have multiple implementations > of > > > it. > > > > I have > > > > >> > > > removed > > > > >> > > > > > > requestName > > > > >> > > > > > > > from the > > > > >> > > > > > > > >> > request context interface since > > > > authorizers > > > > >> > can > > > > >> > > > > > distinguish > > > > >> > > > > > > > follower > > > > >> > > > > > > > >> fetch > > > > >> > > > > > > > >> > and consumer fetch from the > > > > operation being > > > > >> > > > > > authorized. So > > > > >> > > > > > > 16-bit > > > > >> > > > > > > > >> request > > > > >> > > > > > > > >> > type should be sufficient for > > audit > > > > >> logging. > > > > >> > > Also > > > > >> > > > > > replaced > > > > >> > > > > > > > AuditFlag > > > > >> > > > > > > > >> with > > > > >> > > > > > > > >> > two booleans as you suggested. > > > > >> > > > > > > > >> > > > > > >> > > > > > > > >> > Can you take another look and > see > > > if > > > > the > > > > >> KIP > > > > >> > is > > > > >> > > > > ready > > > > >> > > > > > for > > > > >> > > > > > > voting? > > > > >> > > > > > > > >> > > > > > >> > > > > > > > >> > Thanks for all your help! > > > > >> > > > > > > > >> > > > > > >> > > > > > > > >> > Regards, > > > > >> > > > > > > > >> > > > > > >> > > > > > > > >> > Rajini > > > > >> > > > > > > > >> > > > > > >> > > > > > > > >> > On Wed, Aug 14, 2019 at 8:59 PM > > > Colin > > > > >> McCabe < > > > > >> > > > > > > cmcc...@apache.org> > > > > >> > > > > > > > >> wrote: > > > > >> > > > > > > > >> > > > > > >> > > > > > > > >> > > Hi Rajini, > > > > >> > > > > > > > >> > > > > > > >> > > > > > > > >> > > I think it would be good to > > > rename > > > > >> > > > > > KafkaRequestContext to > > > > >> > > > > > > > something > > > > >> > > > > > > > >> like > > > > >> > > > > > > > >> > > AuthorizableRequestContext, > and > > > > put it in > > > > >> > the > > > > >> > > > > > > > >> > > > > > org.apache.kafka.server.authorizer > > > > >> > namespace. > > > > >> > > > If > > > > >> > > > > > we put > > > > >> > > > > > > it in > > > > >> > > > > > > > the > > > > >> > > > > > > > >> > > org.apache.kafka.common > > > namespace, > > > > then > > > > >> it's > > > > >> > > not > > > > >> > > > > > really > > > > >> > > > > > > clear > > > > >> > > > > > > > that > > > > >> > > > > > > > >> it's > > > > >> > > > > > > > >> > > part of the Authorizer API. > > > Since > > > > this > > > > >> > class > > > > >> > > is > > > > >> > > > > > purely an > > > > >> > > > > > > > interface, > > > > >> > > > > > > > >> with > > > > >> > > > > > > > >> > > no concrete implementation of > > > > anything, > > > > >> > > there's > > > > >> > > > > > nothing > > > > >> > > > > > > common > > > > >> > > > > > > > to > > > > >> > > > > > > > >> really > > > > >> > > > > > > > >> > > reuse in any case. We > > definitely > > > > don't > > > > >> want > > > > >> > > > > > someone to > > > > >> > > > > > > > accidentally > > > > >> > > > > > > > >> add or > > > > >> > > > > > > > >> > > remove methods because they > > think > > > > this is > > > > >> > just > > > > >> > > > > > another > > > > >> > > > > > > internal > > > > >> > > > > > > > class > > > > >> > > > > > > > >> used > > > > >> > > > > > > > >> > > for requests. > > > > >> > > > > > > > >> > > > > > > >> > > > > > > > >> > > The BrokerInfo class is a > nice > > > > >> improvement. > > > > >> > > It > > > > >> > > > > > looks > > > > >> > > > > > > like it > > > > >> > > > > > > > will be > > > > >> > > > > > > > >> > > useful for passing in > > information > > > > about > > > > >> the > > > > >> > > > > context > > > > >> > > > > > we're > > > > >> > > > > > > > running > > > > >> > > > > > > > >> in. It > > > > >> > > > > > > > >> > > would be nice to call this > > class > > > > >> ServerInfo > > > > >> > > > rather > > > > >> > > > > > than > > > > >> > > > > > > > BrokerInfo, > > > > >> > > > > > > > >> since > > > > >> > > > > > > > >> > > we will want to run the > > > authorizer > > > > on > > > > >> > > > controllers > > > > >> > > > > > as well > > > > >> > > > > > > as on > > > > >> > > > > > > > >> brokers, > > > > >> > > > > > > > >> > > and the controller may run > as a > > > > separate > > > > >> > > process > > > > >> > > > > > post > > > > >> > > > > > > KIP-500. > > > > >> > > > > > > > I also > > > > >> > > > > > > > >> > > think that this class should > be > > > in > > > > the > > > > >> > > > > > > > >> > org.apache.kafka.server.authorizer > > > > >> > > > > > > > >> > > namespace. Again, it is an > > > > interface, > > > > >> not a > > > > >> > > > > > concrete > > > > >> > > > > > > > implementation, > > > > >> > > > > > > > >> and > > > > >> > > > > > > > >> > > it's an interface that is > very > > > > >> specifically > > > > >> > > for > > > > >> > > > > the > > > > >> > > > > > > authorizer. > > > > >> > > > > > > > >> > > > > > > >> > > > > > > > >> > > I agree that we probably > don't > > > have > > > > >> enough > > > > >> > > > > > information > > > > >> > > > > > > > preserved for > > > > >> > > > > > > > >> > > requests currently to always > > know > > > > what > > > > >> > entity > > > > >> > > > made > > > > >> > > > > > them. > > > > >> > > > > > > So we > > > > >> > > > > > > > can > > > > >> > > > > > > > >> leave > > > > >> > > > > > > > >> > > that out for now (except in > the > > > > special > > > > >> case > > > > >> > > of > > > > >> > > > > > Fetch). > > > > >> > > > > > > > Perhaps we > > > > >> > > > > > > > >> can add > > > > >> > > > > > > > >> > > this later if it's needed. > > > > >> > > > > > > > >> > > > > > > >> > > > > > > > >> > > I understand the intention > > behind > > > > >> > > > > AuthorizationMode > > > > >> > > > > > > (which is > > > > >> > > > > > > > now > > > > >> > > > > > > > >> called > > > > >> > > > > > > > >> > > AuditFlag in the latest > > > > revision). But > > > > >> it > > > > >> > > still > > > > >> > > > > > feels > > > > >> > > > > > > > complex. What > > > > >> > > > > > > > >> if we > > > > >> > > > > > > > >> > > just had two booleans in > > Action: > > > > >> > logSuccesses > > > > >> > > > and > > > > >> > > > > > > logFailures? > > > > >> > > > > > > > That > > > > >> > > > > > > > >> seems > > > > >> > > > > > > > >> > > to cover all the cases here. > > > > >> > > > MANDATORY_AUTHORIZE > > > > >> > > > > = > > > > >> > > > > > true, > > > > >> > > > > > > true. > > > > >> > > > > > > > >> > > OPTIONAL_AUTHORIZE = true, > > false. > > > > >> FILTER = > > > > >> > > > true, > > > > >> > > > > > false. > > > > >> > > > > > > > >> LIST_AUTHORIZED = > > > > >> > > > > > > > >> > > false, false. Would there be > > > > anything > > > > >> lost > > > > >> > > > versus > > > > >> > > > > > having > > > > >> > > > > > > the > > > > >> > > > > > > > enum? > > > > >> > > > > > > > >> > > > > > > >> > > > > > > > >> > > best, > > > > >> > > > > > > > >> > > Colin > > > > >> > > > > > > > >> > > > > > > >> > > > > > > > >> > > > > > > >> > > > > > > > >> > > On Wed, Aug 14, 2019, at > 06:29, > > > > Mickael > > > > >> > Maison > > > > >> > > > > > wrote: > > > > >> > > > > > > > >> > > > Hi Rajini, > > > > >> > > > > > > > >> > > > > > > > >> > > > > > > > >> > > > Thanks for the KIP! > > > > >> > > > > > > > >> > > > I really like that > > authorize() > > > > will be > > > > >> > able > > > > >> > > to > > > > >> > > > > > take a > > > > >> > > > > > > batch of > > > > >> > > > > > > > >> > > > requests, this will speed > up > > > many > > > > >> > > > > implementations! > > > > >> > > > > > > > >> > > > > > > > >> > > > > > > > >> > > > On Tue, Aug 13, 2019 at > 5:57 > > PM > > > > Rajini > > > > >> > > > Sivaram < > > > > >> > > > > > > > >> rajinisiva...@gmail.com> > > > > >> > > > > > > > >> > > wrote: > > > > >> > > > > > > > >> > > > > > > > > >> > > > > > > > >> > > > > Thanks David! I have > fixed > > > the > > > > typo. > > > > >> > > > > > > > >> > > > > > > > > >> > > > > > > > >> > > > > Also made a couple of > > changes > > > > to make > > > > >> > the > > > > >> > > > > > context > > > > >> > > > > > > > interfaces more > > > > >> > > > > > > > >> > > generic. > > > > >> > > > > > > > >> > > > > KafkaRequestContext now > > > > returns the > > > > >> > 16-bit > > > > >> > > > API > > > > >> > > > > > key as > > > > >> > > > > > > Colin > > > > >> > > > > > > > >> suggested > > > > >> > > > > > > > >> > > as > > > > >> > > > > > > > >> > > > > well as the friendly name > > > used > > > > in > > > > >> > metrics > > > > >> > > > > which > > > > >> > > > > > are > > > > >> > > > > > > useful > > > > >> > > > > > > > in > > > > >> > > > > > > > >> audit > > > > >> > > > > > > > >> > > logs. > > > > >> > > > > > > > >> > > > > `Authorizer#start` is now > > > > provided a > > > > >> > > generic > > > > >> > > > > > > `BrokerInfo` > > > > >> > > > > > > > >> interface > > > > >> > > > > > > > >> > > that > > > > >> > > > > > > > >> > > > > gives cluster id, broker > id > > > and > > > > >> endpoint > > > > >> > > > > > information. > > > > >> > > > > > > The > > > > >> > > > > > > > generic > > > > >> > > > > > > > >> > > interface > > > > >> > > > > > > > >> > > > > can potentially be used > in > > > > other > > > > >> broker > > > > >> > > > > plugins > > > > >> > > > > > in > > > > >> > > > > > > future > > > > >> > > > > > > > and > > > > >> > > > > > > > >> provides > > > > >> > > > > > > > >> > > > > dynamically generated > > configs > > > > like > > > > >> > broker > > > > >> > > id > > > > >> > > > > > and ports > > > > >> > > > > > > > which are > > > > >> > > > > > > > >> > > currently > > > > >> > > > > > > > >> > > > > not available to plugins > > > > unless these > > > > >> > > > configs > > > > >> > > > > > are > > > > >> > > > > > > statically > > > > >> > > > > > > > >> > > configured. > > > > >> > > > > > > > >> > > > > Please let me know if > there > > > > are any > > > > >> > > > concerns. > > > > >> > > > > > > > >> > > > > > > > > >> > > > > > > > >> > > > > Regards, > > > > >> > > > > > > > >> > > > > > > > > >> > > > > > > > >> > > > > Rajini > > > > >> > > > > > > > >> > > > > > > > > >> > > > > > > > >> > > > > On Tue, Aug 13, 2019 at > > 4:30 > > > > PM David > > > > >> > > Jacot > > > > >> > > > < > > > > >> > > > > > > > dja...@confluent.io> > > > > >> > > > > > > > >> > > wrote: > > > > >> > > > > > > > >> > > > > > > > > >> > > > > > > > >> > > > > > Hi Rajini, > > > > >> > > > > > > > >> > > > > > > > > > >> > > > > > > > >> > > > > > Thank you for the > update! > > > It > > > > looks > > > > >> > good > > > > >> > > to > > > > >> > > > > me. > > > > >> > > > > > > There is a > > > > >> > > > > > > > typo > > > > >> > > > > > > > >> in the > > > > >> > > > > > > > >> > > > > > `AuditFlag` enum: > > > > >> > `MANDATORY_AUTHOEIZE` > > > > >> > > -> > > > > >> > > > > > > > >> `MANDATORY_AUTHORIZE`. > > > > >> > > > > > > > >> > > > > > > > > > >> > > > > > > > >> > > > > > Regards, > > > > >> > > > > > > > >> > > > > > David > > > > >> > > > > > > > >> > > > > > > > > > >> > > > > > > > >> > > > > > On Mon, Aug 12, 2019 at > > > 2:54 > > > > PM > > > > >> Rajini > > > > >> > > > > > Sivaram < > > > > >> > > > > > > > >> > > rajinisiva...@gmail.com> > > > > >> > > > > > > > >> > > > > > wrote: > > > > >> > > > > > > > >> > > > > > > > > > >> > > > > > > > >> > > > > > > Hi David, > > > > >> > > > > > > > >> > > > > > > > > > > >> > > > > > > > >> > > > > > > Thanks for reviewing > > the > > > > KIP! > > > > >> Since > > > > >> > > > > > questions > > > > >> > > > > > > about > > > > >> > > > > > > > >> `authorization > > > > >> > > > > > > > >> > > mode` > > > > >> > > > > > > > >> > > > > > > and `count` have come > > up > > > > multiple > > > > >> > > > times, I > > > > >> > > > > > have > > > > >> > > > > > > renamed > > > > >> > > > > > > > both. > > > > >> > > > > > > > >> > > > > > > > > > > >> > > > > > > > >> > > > > > > 1) Renamed `count` to > > > > >> > > > > > `resourceReferenceCount`. > > > > >> > > > > > > It is > > > > >> > > > > > > > the > > > > >> > > > > > > > >> number > > > > >> > > > > > > > >> > > of times > > > > >> > > > > > > > >> > > > > > > the resource being > > > > authorized is > > > > >> > > > > referenced > > > > >> > > > > > > within the > > > > >> > > > > > > > >> request. > > > > >> > > > > > > > >> > > > > > > > > > > >> > > > > > > > >> > > > > > > 2) Renamed > > > > `AuthorizationMode` to > > > > >> > > > > > `AuditFlag`. It > > > > >> > > > > > > is > > > > >> > > > > > > > provided > > > > >> > > > > > > > >> to > > > > >> > > > > > > > >> > > improve > > > > >> > > > > > > > >> > > > > > > audit logging in the > > > > authorizer. > > > > >> The > > > > >> > > > enum > > > > >> > > > > > values > > > > >> > > > > > > have > > > > >> > > > > > > > javadoc > > > > >> > > > > > > > >> which > > > > >> > > > > > > > >> > > > > > > indicate how the > > > > authorization > > > > >> > result > > > > >> > > is > > > > >> > > > > > used in > > > > >> > > > > > > each > > > > >> > > > > > > > of the > > > > >> > > > > > > > >> modes > > > > >> > > > > > > > >> > > to > > > > >> > > > > > > > >> > > > > > > enable authorizers to > > log > > > > audit > > > > >> > > messages > > > > >> > > > > at > > > > >> > > > > > the > > > > >> > > > > > > right > > > > >> > > > > > > > severity > > > > >> > > > > > > > >> > > level. > > > > >> > > > > > > > >> > > > > > > > > > > >> > >