> On Dec. 18, 2017, 6:55 p.m., Alexander Kolbasov wrote: > > sentry-provider/sentry-provider-db/src/main/java/org/apache/sentry/provider/db/generic/service/persistent/DelegateSentryStore.java > > Line 267 (original), 271 (patched) > > <https://reviews.apache.org/r/64661/diff/3/?file=1922322#file1922322line271> > > > > I think there is a way to directly test for membership in the JDOQL - > > can you check this? > > > > We have similar code in SentryStore which does that. > > Arjun Mishra wrote: > Sasha not sure what exactly you are asking for? Are you asking for cases > when a role is not mapped to any group? Also are your comments specific to my > change? > > I did look at SentryStore. There are many places in the class where we > addRolesFilter and run executeWithMap but I didn't see any check for > membership being done here. > > Alexander Kolbasov wrote: > I mean something similar to this: > > private Set<String> getRoleNamesForGroupsCore(PersistenceManager > pm, Set<String> groups) { > Query query = pm.newQuery(MSentryGroup.class); > query.setFilter(":p1.contains(this.groupName)"); > List<MSentryGroup> sentryGroups = (List) > query.execute(groups.toArray()); > > Arjun Mishra wrote: > I did add addRolesFilter check. See below. And addRolesFilter does the > contains check. So something similar to the above is already being done. Yes? > > ***************************************************************************************** > QueryParamBuilder paramBuilder = QueryParamBuilder.addRolesFilter(query, > null, roles); > > > ***************************************************************************************** > public static QueryParamBuilder addRolesFilter(Query query, > QueryParamBuilder paramBuilder, > Set<String> roleNames) { > query.declareVariables(MSentryRole.class.getName() + " role"); > if (paramBuilder == null) { > paramBuilder = new QueryParamBuilder(); > } > if (roleNames == null || roleNames.isEmpty()) { > return paramBuilder; > } > paramBuilder.newChild().addSet("role.roleName == ", roleNames); > paramBuilder.addString("roles.contains(role)"); > return paramBuilder; > } > > Arjun Mishra wrote: > Sasha, I get the below exception when not adding the map link. So it > looks like we need to explitly addRolesFilter and execute with map > > > ============================================================================================================================================================================================== > javax.jdo.JDOUserException: Query has reference to member "roleName" of > class "org.apache.sentry.provider.db.service.model.MSentryGroup" yet this > doesnt exist! > at > org.apache.sentry.provider.db.generic.service.persistent.TestDelegateSentryStore.testGetGroupsByRoleNames(TestDelegateSentryStore.java:160) > Caused by: org.datanucleus.exceptions.NucleusUserException: Query has > reference to member "roleName" of class > "org.apache.sentry.provider.db.service.model.MSentryGroup" yet this doesnt > exist! > at > org.apache.sentry.provider.db.generic.service.persistent.TestDelegateSentryStore.testGetGroupsByRoleNames(TestDelegateSentryStore.java:160) > > > ==============================================================================================================================================================================================
MSentryGroup doesn't have roleName, it has roles instead. I am not sure that you can do similar check here. But looking at the caller: Set<String> roleNames = store.getRolesByGroups(request.getComponent(), groups); Set<TSentryRole> tSentryRoles = Sets.newHashSet(); for (String roleName : roleNames) { Set<String> groupsForRoleName = store.getGroupsByRoles(request.getComponent(), Sets.newHashSet(roleName)); tSentryRoles.add(new TSentryRole(roleName, groupsForRoleName)); } So first it gets all roles belonging to given set of groups. Then it walks all roles and for each role it gets groups belonging to this role. This is a weird request, but putting this aside, would it make sense to use a single transaction to answer this question? Otherwise, if group belongs to N roles, we need to use N transactions to get this - Alexander ----------------------------------------------------------- This is an automatically generated e-mail. To reply, visit: https://reviews.apache.org/r/64661/#review194080 ----------------------------------------------------------- On Dec. 19, 2017, 8:04 p.m., Arjun Mishra wrote: > > ----------------------------------------------------------- > This is an automatically generated e-mail. To reply, visit: > https://reviews.apache.org/r/64661/ > ----------------------------------------------------------- > > (Updated Dec. 19, 2017, 8:04 p.m.) > > > Review request for sentry, Alexander Kolbasov, Brian Towles, kalyan kumar > kalvagadda, Na Li, Sergio Pena, and Vadim Spector. > > > Repository: sentry > > > Description > ------- > > When Solr is using Sentry server for authorization, it issues a lot of calls > to {{getGroupsByRoles()}} function in {{DelegateSentryStore}}. > > This function isn't very efficient - it walks over each role in the set, > obtains role by name, get groups for each role, and collects all group names > into a set. > > It may be possible to optimize it. > > > Diffs > ----- > > > sentry-provider/sentry-provider-db/src/main/java/org/apache/sentry/provider/db/generic/service/persistent/DelegateSentryStore.java > 4cb46abc5 > > sentry-provider/sentry-provider-db/src/test/java/org/apache/sentry/provider/db/generic/service/persistent/TestDelegateSentryStore.java > 69d16238f > > > Diff: https://reviews.apache.org/r/64661/diff/4/ > > > Testing > ------- > > mvn -f sentry-provider/sentry-provider-db/pom.xml test > > > Thanks, > > Arjun Mishra > >