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.
> > >     >> > > > > >     >     >     >> > > > > > >
> > >     >> >

Reply via email to