> On May 2, 2016, 9:45 p.m., Gregory Chanan wrote:
> > Why put the caching at the client layer instead of the provider backend
> > layer? It seems unlikely to me that the average client actually wants
> > caching or need caching, whereas an arbitrary external service probably
> > does.
>
> Ashish Singh wrote:
> Any arbitrary external service will need a client, right? Can't think of
> a use case where a service would want to maintain a provider backend without
> creating a client. Maybe I don't have complete context. Mind providing some
> info here?
>
> Ashish Singh wrote:
> Never mind, I completely mixed up Client impl and provider backend :(.
> Yea, you are correct that it makes sense to have caching in provider backend
> instead. Will update.
>
> Ashish Singh wrote:
> Ok, I think I am running into circles now :), but with each round
> hopefully there will be more info. So, provider backend is going to use a
> client as well, right? Depending on what the provider wants, it can enable or
> disable caching. I think it is better to have a generic client impl with
> caching support, which can then be used by multiple provider backends than
> having one of the provider backend have caching support.
>
> Gregory Chanan wrote:
> You are right, I think implementing at the client level is reasonable. I
> don't think inserting the code into the DefaultImpl is a good idea, though,
> consider:
> 1) If I write another client, I'll have to write my own caching mechanism
> when there isn't really anything specific about your implementaiton
> 2) Whether I cache or not is sort of magic, i.e. there's no enforced
> guarantee that the GenericServiceClientFactory returns a default impl and
> thus no guarantee that the caching will be enforced.
>
> So, I think this needs two changes:
> 1) Define your own GenericServiceClient that has another
> GenericServiceClient and provides caching on top of it. In this way, any
> client can easily gain the ability to cache
> 2) You need some way of specifying that you want caching. For example,
> check that caching is enabled in the conf in the factory method and return a
> caching client if so.
>
> Gregory Chanan wrote:
> Actually, now that I've gone through and read the code, I'm not sure
> implementing at the client level is the best idea right now. I think your
> arguments for why a cache at the client level makes sense are totally valid,
> but in reality the client APIs are overly complicated right, and you have to
> implement each one. Specificially:
>
> 1) You need to implement all of the following APIs:
> Set<TSentryRole> listRolesByGroupName(
> String requestorUserName,
> String groupName,
> String component)
> throws SentryUserException;
>
> Set<TSentryRole> listUserRoles(String requestorUserName, String
> component)
> throws SentryUserException;
>
> Set<TSentryRole> listAllRoles(String requestorUserName, String
> component)
> throws SentryUserException;
>
> Set<TSentryPrivilege> listPrivilegesByRoleName(
> String requestorUserName, String roleName, String component,
> String serviceName, List<? extends Authorizable> authorizables)
> throws SentryUserException;
>
> Set<TSentryPrivilege> listPrivilegesByRoleName(
> String requestorUserName, String roleName, String component,
> String serviceName) throws SentryUserException;
>
> Set<String> listPrivilegesForProvider(String component,
> String serviceName, ActiveRoleSet roleSet, Set<String> groups,
> List<? extends Authorizable> authorizables) throws
> SentryUserException;
>
> when you had the code embedded in the DefaultImpl, you were able to
> reduce the number of cases by looking at the actual implementation of the
> DefaultImpl, e.g. some of these functions called other ones. But if you are
> implementing a generic cache, you can't depend on that behavior; my arbitrary
> client doesn't necessary have the same implement as the DefaultImpl.
>
> 2) It's difficult to cache these in such a way that makes sense and
> follows the API. For example, listPrivilegesByRoleName: you need to key your
> cache based on the combination of {roleName, component, serviceName} at a
> minimum as well as implement the logic for filtering based on authorizable.
> That in general doesn't look like it was done correctly in this review.
>
> 3) The client/cache interface doesn't make complete sense yet. E.g. I've
> defined a cache...what do you cache when I do dropRole? You'd really want
> different interfaces for read/write and be able to specify/pass in caches for
> the read behaviors.
>
> In contract, implementing this at the ProviderBackend level has none of
> these issues.
>
> 1) The ProviderBackend only has 3 functions to implement:
> ImmutableSet<String> getPrivileges(Set<String> groups, ActiveRoleSet
> roleSet, Authorizable... authorizableHierarchy);
>
> ImmutableSet<String> getPrivileges(Set<String> groups, Set<String> users,
> ActiveRoleSet roleSet, Authorizable... authorizableHierarchy);
>
> ImmutableSet<String> getRoles(Set<String> groups, ActiveRoleSet roleSet);
>
> and remarkably, these functions already have an implementation! Assuming
> you have a Role x Group x Privilege table (i.e. a cache), the
> SimpleFileProviderBackend already implements a ProviderBackend. You just
> need to separate out the initialize/validate code and you are done.
>
> 2) Again, it's trivial to implement the cache at the ProviderBackend
> level because of the SimpleFileProviderBackend implementation.
>
> 3) Since the ProviderBackend only has READ interfaces, these is no
> confusion about what a cache means.
I agree moving to provider backend will definitely provide the ease of
implementation and other benefits you have mentioned. I think you have
convinced me to move to provider backend. I will give it a try and hope that
nothing pops up to make me go back to the clients approach :). Thanks for the
valuabke feedback. Btw, I was so amazed by the way public APIs are defined and
docuemnted in Sentry that I could not stop myself from filing a super vague
JIRA, SENTRY-1214. I think it will be really worthwhile if some Sentry pros
spend some time to refactor Sentry's APIs.
- Ashish
-----------------------------------------------------------
This is an automatically generated e-mail. To reply, visit:
https://reviews.apache.org/r/46909/#review131381
-----------------------------------------------------------
On May 2, 2016, 9:32 p.m., Ashish Singh wrote:
>
> -----------------------------------------------------------
> This is an automatically generated e-mail. To reply, visit:
> https://reviews.apache.org/r/46909/
> -----------------------------------------------------------
>
> (Updated May 2, 2016, 9:32 p.m.)
>
>
> Review request for sentry, Dapeng Sun, Gregory Chanan, Hao Hao, and Sravya
> Tirukkovalur.
>
>
> Bugs: SENTRY-1229
> https://issues.apache.org/jira/browse/SENTRY-1229
>
>
> Repository: sentry
>
>
> Description
> -------
>
> SENTRY-1229: Add caching to SentryGenericServiceClientDefaultImpl.
>
>
> Diffs
> -----
>
>
> sentry-provider/sentry-provider-db/src/main/java/org/apache/sentry/provider/db/generic/service/thrift/SentryGenericServiceClient.java
> 60502895a0fcdd781f5bd61b29a676a7c96f81b8
>
> sentry-provider/sentry-provider-db/src/main/java/org/apache/sentry/provider/db/generic/service/thrift/SentryGenericServiceClientDefaultImpl.java
> dce3dade7f42fe35a849612c5caf2e98d2dac578
>
> sentry-provider/sentry-provider-db/src/main/java/org/apache/sentry/service/thrift/ServiceConstants.java
> 00e3fbde76ebf84704ee110adfca30869845a7b8
>
> sentry-provider/sentry-provider-db/src/test/java/org/apache/sentry/provider/db/generic/service/thrift/TestSentryGenericServiceIntegration.java
> fcf0e7b9dc45eb12cc1b76f3084efd6340c039a4
>
> sentry-provider/sentry-provider-db/src/test/java/org/apache/sentry/provider/db/generic/service/thrift/TestSentryGenericServiceIntegrationWithCaching.java
> PRE-CREATION
>
> Diff: https://reviews.apache.org/r/46909/diff/
>
>
> Testing
> -------
>
> Extended unit tests. Will be running perf tests for Kafka-Sentry integration
> with caching turned on.
>
>
> Thanks,
>
> Ashish Singh
>
>