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.
>     >> > > > > >     >     >     >> > > > > > >
>     >> > > > > >     >     >     >> > > > > > > Regards,
>     >> > > > > >     >     >     >> > > > > > >
>     >> > > > > >     >     >     >> > > > > > > Rajini
>     >> > > > > >     >     >     >> > > > > > >
>     >> > > > > >     >     >     >> > > > > > > On Mon, Aug 12, 2019 at
> 5:54 PM
>     >> > David
>     >> > > > > Jacot
>     >> > > > > > <
>     >> > > > > >     >     >     >> dja...@confluent.io>
>     >> > > > > >     >     >     >> > > wrote:
>     >> > > > > >     >     >     >> > > > > > >
>     >> > > > > >     >     >     >> > > > > > > > Hi Rajini,
>     >> > > > > >     >     >     >> > > > > > > >
>     >> > > > > >     >     >     >> > > > > > > > Thank you for the KIP.
>     >> Overall, it
>     >> > > > looks
>     >> > > > > > good
>     >> > > > > >     > to me.
>     >> > > > > >     >     > I have
>     >> > > > > >     >     >     >> few
>     >> > > > > >     >     >     >> > > > > > > > questions/suggestions:
>     >> > > > > >     >     >     >> > > > > > > >
>     >> > > > > >     >     >     >> > > > > > > > 1. It is hard to grasp
> what
>     >> > > > > > `Action#count` is
>     >> > > > > >     > for. I
>     >> > > > > >     >     > guess I
>     >> > > > > >     >     >     >> > > understand
>     >> > > > > >     >     >     >> > > > > > > > where you want to go
> with it
>     >> but
>     >> > it
>     >> > > > took
>     >> > > > > > me a
>     >> > > > > >     > while to
>     >> > > > > >     >     >     >> figure it
>     >> > > > > >     >     >     >> > > out.
>     >> > > > > >     >     >     >> > > > > > > > Perhaps, we could come
> up with
>     >> a
>     >> > > > better
>     >> > > > > > name
>     >> > > > > >     > than
>     >> > > > > >     >     > `count`?
>     >> > > > > >     >     >     >> > > > > > > >
>     >> > > > > >     >     >     >> > > > > > > > 2. I had a hard time
> trying to
>     >> > > > > understand
>     >> > > > > > the
>     >> > > > > >     >     >     >> `AuthorizationMode`
>     >> > > > > >     >     >     >> > > > > > > concept,
>     >> > > > > >     >     >     >> > > > > > > > especially wrt. the
> OPTIONAL
>     >> one.
>     >> > My
>     >> > > > > >     > understanding is
>     >> > > > > >     >     > that
>     >> > > > > >     >     >     >> an
>     >> > > > > >     >     >     >> > > ACL is
>     >> > > > > >     >     >     >> > > > > > > either
>     >> > > > > >     >     >     >> > > > > > > > defined or not. Could you
>     >> > elaborate
>     >> > > a
>     >> > > > > bit
>     >> > > > > > more
>     >> > > > > >     > on
>     >> > > > > >     >     > that?
>     >> > > > > >     >     >     >> > > > > > > >
>     >> > > > > >     >     >     >> > > > > > > > Thanks,
>     >> > > > > >     >     >     >> > > > > > > > David
>     >> > > > > >     >     >     >> > > > > > > >
>     >> > > > > >     >     >     >> > > > > > > > On Fri, Aug 9, 2019 at
> 10:26 PM
>     >> > Don
>     >> > > > > Bosco
>     >> > > > > > Durai
>     >> > > > > >     > <
>     >> > > > > >     >     >     >> > > bo...@apache.org>
>     >> > > > > >     >     >     >> > > > > > > wrote:
>     >> > > > > >     >     >     >> > > > > > > >
>     >> > > > > >     >     >     >> > > > > > > > > Hi Rajini
>     >> > > > > >     >     >     >> > > > > > > > >
>     >> > > > > >     >     >     >> > > > > > > > > 3.2 - This makes sense.
>     >> Thanks
>     >> > for
>     >> > > > > > clarifying.
>     >> > > > > >     >     >     >> > > > > > > > >
>     >> > > > > >     >     >     >> > > > > > > > > Rest looks fine. Once
> the
>     >> > > > > > implementations are
>     >> > > > > >     > done,
>     >> > > > > >     >     > it
>     >> > > > > >     >     >     >> will be
>     >> > > > > >     >     >     >> > > more
>     >> > > > > >     >     >     >> > > > > > > clear
>     >> > > > > >     >     >     >> > > > > > > > > on the different values
>     >> > > RequestType
>     >> > > > > and
>     >> > > > > > Mode.
>     >> > > > > >     >     >     >> > > > > > > > >
>     >> > > > > >     >     >     >> > > > > > > > > Thanks
>     >> > > > > >     >     >     >> > > > > > > > >
>     >> > > > > >     >     >     >> > > > > > > > > Bosco
>     >> > > > > >     >     >     >> > > > > > > > >
>     >> > > > > >     >     >     >> > > > > > > > >
>     >> > > > > >     >     >     >> > > > > > > > > On 8/9/19, 5:08 AM,
> "Rajini
>     >> > > > Sivaram"
>     >> > > > > <
>     >> > > > > >     >     >     >> rajinisiva...@gmail.com
>     >> > > > > >     >     >     >> > > >
>     >> > > > > >     >     >     >> > > > > > wrote:
>     >> > > > > >     >     >     >> > > > > > > > >
>     >> > > > > >     >     >     >> > > > > > > > >     Hi Don,
>     >> > > > > >     >     >     >> > > > > > > > >
>     >> > > > > >     >     >     >> > > > > > > > >     Thanks for the
>     >> suggestions.
>     >> > A
>     >> > > > few
>     >> > > > > >     > responses
>     >> > > > > >     >     > below:
>     >> > > > > >     >     >     >> > > > > > > > >
>     >> > > > > >     >     >     >> > > > > > > > >     3.1 Can rename and
>     >> improve
>     >> > > docs
>     >> > > > if
>     >> > > > > > we keep
>     >> > > > > >     >     > this. Let's
>     >> > > > > >     >     >     >> > > finish the
>     >> > > > > >     >     >     >> > > > > > > > >     discussion on
> Colin's
>     >> > > > suggestions
>     >> > > > > >     > regarding this
>     >> > > > > >     >     >     >> first.
>     >> > > > > >     >     >     >> > > > > > > > >     3.2 No, I was
> thinking of
>     >> > some
>     >> > > > > > requests
>     >> > > > > >     > that
>     >> > > > > >     >     > have an
>     >> > > > > >     >     >     >> old
>     >> > > > > >     >     >     >> > > way of
>     >> > > > > >     >     >     >> > > > > > > > > authorizing
>     >> > > > > >     >     >     >> > > > > > > > >     and a new way
> where we
>     >> have
>     >> > > > > > retained the
>     >> > > > > >     > old
>     >> > > > > >     >     > way for
>     >> > > > > >     >     >     >> > > backward
>     >> > > > > >     >     >     >> > > > > > > > >     compatibility. One
>     >> example
>     >> > is
>     >> > > > > >     > Cluster:Create
>     >> > > > > >     >     >     >> permission to
>     >> > > > > >     >     >     >> > > create
>     >> > > > > >     >     >     >> > > > > > > > > topics.
>     >> > > > > >     >     >     >> > > > > > > > >     We have replaced
> this
>     >> with
>     >> > > > > > fine-grained
>     >> > > > > >     > topic
>     >> > > > > >     >     > create
>     >> > > > > >     >     >     >> > > access using
>     >> > > >

Reply via email to