Alexander Kolbasov created SENTRY-1881:
------------------------------------------

             Summary: PrivilegeOperatePersistence throws wrong type of 
exceptions
                 Key: SENTRY-1881
                 URL: https://issues.apache.org/jira/browse/SENTRY-1881
             Project: Sentry
          Issue Type: New Feature
          Components: Sentry
    Affects Versions: 1.8.0, 2.0.0
            Reporter: Alexander Kolbasov
            Assignee: Sergio Peña


The PrivilegeOperatePersistenc class uses wrong exceptions to throw, e.g.:

{code}
  private BitFieldAction getAction(String component, String name) {
    BitFieldActionFactory actionFactory = getActionFactory(component);
    BitFieldAction action = actionFactory.getActionByName(name);
    if (action == null) {
      throw new RuntimeException("can't get BitFieldAction for name:" + name);
    }
    return action;
  }
{code}

Notice that it throws RuntimeException (which is a completely wrong exception 
to throw here). The problem is that these exceptions are retried at the 
TransactionManager level and never succeed so we are just waisting time. This 
particular bit is triggered by a test 
{{org.apache.sentry.provider.db.generic.service.thrift.TestAuditLogForSentryGenericService}}
 and we get the following exception which is retried many times:

{code}
java.lang.RuntimeException: can't get BitFieldAction for name:invalidaction
        at 
org.apache.sentry.provider.db.generic.service.persistent.PrivilegeOperatePersistence.getAc
tion(PrivilegeOperatePersistence.java:523)
        at 
org.apache.sentry.provider.db.generic.service.persistent.PrivilegeOperatePersistence.grant
RolePartial(PrivilegeOperatePersistence.java:191)
        at 
org.apache.sentry.provider.db.generic.service.persistent.PrivilegeOperatePersistence.grant
Privilege(PrivilegeOperatePersistence.java:181)
        at 
org.apache.sentry.provider.db.generic.service.persistent.DelegateSentryStore$1.execute(Del
egateSentryStore.java:132)
        at 
org.apache.sentry.provider.db.service.persistent.TransactionManager.executeTransaction(Tra
nsactionManager.java:123)
        at 
org.apache.sentry.provider.db.service.persistent.TransactionManager$1.call(TransactionMana
ger.java:192)
        at 
org.apache.sentry.provider.db.service.persistent.TransactionManager$ExponentialBackoff.exe
cute(TransactionManager.java:233)
        at 
org.apache.sentry.provider.db.service.persistent.TransactionManager.executeTransactionWith
Retry(TransactionManager.java:188)
        at 
org.apache.sentry.provider.db.generic.service.persistent.DelegateSentryStore.alterRoleGran
tPrivilege(DelegateSentryStore.java:119)
        at 
org.apache.sentry.provider.db.generic.service.thrift.SentryGenericPolicyProcessor$5.handle
(SentryGenericPolicyProcessor.java:435)
        at 
org.apache.sentry.provider.db.generic.service.thrift.SentryGenericPolicyProcessor.requestH
andle(SentryGenericPolicyProcessor.java:183)
        at 
org.apache.sentry.provider.db.generic.service.thrift.SentryGenericPolicyProcessor.alter_se
ntry_role_grant_privilege(SentryGenericPolicyProcessor.java:431)
        at 
org.apache.sentry.provider.db.generic.service.thrift.SentryGenericPolicyService$Processor$
alter_sentry_role_grant_privilege.getResult(SentryGenericPolicyService.java:877)
        at 
org.apache.sentry.provider.db.generic.service.thrift.SentryGenericPolicyService$Processor$
alter_sentry_role_grant_privilege.getResult(SentryGenericPolicyService.java:862)
        at org.apache.thrift.ProcessFunction.process(ProcessFunction.java:39)
        at org.apache.thrift.TBaseProcessor.process(TBaseProcessor.java:39)
        at 
org.apache.sentry.provider.db.generic.service.thrift.SentryGenericPolicyProcessorWrapper.p
rocess(SentryGenericPolicyProcessorWrapper.java:37)
        at 
org.apache.thrift.TMultiplexedProcessor.process(TMultiplexedProcessor.java:123)
        at 
org.apache.thrift.server.TThreadPoolServer$WorkerProcess.run(TThreadPoolServer.java:286)
        at 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)
{code)

Not only it is wrong, but also it sometimes triggers test failures because we 
may retry for longer then the test allocated time. We should use Sentry 
exceptions which are not retried by TransactionManager instead.




--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

Reply via email to