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