Vamsee Yarlagadda created SENTRY-1821:
-----------------------------------------

             Summary: Transactions could fail to commit to the database under 
load
                 Key: SENTRY-1821
                 URL: https://issues.apache.org/jira/browse/SENTRY-1821
             Project: Sentry
          Issue Type: Sub-task
          Components: Sentry
    Affects Versions: sentry-ha-redesign
            Reporter: Vamsee Yarlagadda


I notice this problem when trying to issue some GRANT commands where the 
transactions fail after exhausting the number of retries to commit to the 
database. 

Current load conditions:
* 20 parallel clients each issuing a GRANT command on MariaDB backed Sentry 
server.

Even with this relatively small load, we came across this issue which could get 
become a major problem under high load. Looking at the retry logic, we do have 
static wait before retrying but most probably all the clients are waking up at 
the same time which keeps hitting the same problem and thus exhausts all the 
retries. 

Instead of a static wait, we can think of implementing an exponential backoff 
as a way to avoid this.
{code}
Caused by: java.lang.RuntimeException: Unknown error for request: 
TAlterSentryRoleGrantPrivilegeRequest(protocol_version:2, 
requestorUserName:hive, roleName:gr_role_2017_06_27_16_48_10_0_0_8, 
privileges:[TSentryPrivilege(privilegeScope:DATABASE, serverName:server1, 
dbName:gr_db_2017_06_27_16_48_10, tableName:, URI:, action:*, 
createTime:1498607304833, grantOption:FALSE, columnName:)]), message: The 
transaction has reached max retry number, Exception thrown when executing 
query. Server Stacktrace: java.lang.Exception: The transaction has reached max 
retry number, Exception thrown when executing query
        at 
org.apache.sentry.provider.db.service.persistent.TransactionManager.executeTransactionBlocksWithRetry(TransactionManager.java:224)
        at 
org.apache.sentry.provider.db.service.persistent.SentryStore.execute(SentryStore.java:3272)
        at 
org.apache.sentry.provider.db.service.persistent.SentryStore.alterSentryRoleGrantPrivilege(SentryStore.java:589)
        at 
org.apache.sentry.provider.db.service.persistent.SentryStore.alterSentryRoleGrantPrivileges(SentryStore.java:629)
        at 
org.apache.sentry.provider.db.service.thrift.SentryPolicyStoreProcessor.alter_sentry_role_grant_privilege(SentryPolicyStoreProcessor.java:256)
        at 
org.apache.sentry.provider.db.service.thrift.SentryPolicyService$Processor$alter_sentry_role_grant_privilege.getResult(SentryPolicyService.java:997)
        at 
org.apache.sentry.provider.db.service.thrift.SentryPolicyService$Processor$alter_sentry_role_grant_privilege.getResult(SentryPolicyService.java:982)
        at org.apache.thrift.ProcessFunction.process(ProcessFunction.java:39)
        at org.apache.thrift.TBaseProcessor.process(TBaseProcessor.java:39)
        at 
org.apache.sentry.provider.db.service.thrift.SentryProcessorWrapper.process(SentryProcessorWrapper.java:36)
        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:1145)
        at 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:745)
Caused by: javax.jdo.JDOException: Exception thrown when executing query
NestedThrowables:
java.sql.BatchUpdateException: Duplicate entry '1153' for key 'PRIMARY'
        at 
org.datanucleus.api.jdo.NucleusJDOHelper.getJDOExceptionForNucleusException(NucleusJDOHelper.java:596)
        at org.datanucleus.api.jdo.JDOQuery.execute(JDOQuery.java:252)
        at 
org.apache.sentry.provider.db.service.persistent.SentryStore.getRole(SentryStore.java:291)
        at 
org.apache.sentry.provider.db.service.persistent.SentryStore.alterSentryRoleGrantPrivilegeCore(SentryStore.java:641)
        at 
org.apache.sentry.provider.db.service.persistent.SentryStore.access$500(SentryStore.java:101)
        at 
org.apache.sentry.provider.db.service.persistent.SentryStore$11.execute(SentryStore.java:597)
        at 
org.apache.sentry.provider.db.service.persistent.TransactionManager.executeTransaction(TransactionManager.java:148)
        at 
org.apache.sentry.provider.db.service.persistent.TransactionManager.executeTransactionBlocksWithRetry(TransactionManager.java:214)
        ... 14 more
Caused by: java.sql.BatchUpdateException: Duplicate entry '1153' for key 
'PRIMARY'
        at 
com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:1815)
        at 
com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:1277)
        at 
com.jolbox.bonecp.StatementHandle.executeBatch(StatementHandle.java:469)
        at 
org.datanucleus.store.rdbms.ParamLoggingPreparedStatement.executeBatch(ParamLoggingPreparedStatement.java:372)
        at 
org.datanucleus.store.rdbms.SQLController.processConnectionStatement(SQLController.java:683)
        at 
org.datanucleus.store.rdbms.SQLController.getStatementForQuery(SQLController.java:324)
        at 
org.datanucleus.store.rdbms.query.RDBMSQueryUtils.getPreparedStatementForQuery(RDBMSQueryUtils.java:217)
        at 
org.datanucleus.store.rdbms.query.JDOQLQuery.performExecute(JDOQLQuery.java:633)
        at org.datanucleus.store.query.Query.executeQuery(Query.java:1786)
        at org.datanucleus.store.query.Query.executeWithArray(Query.java:1672)
        at org.datanucleus.api.jdo.JDOQuery.execute(JDOQuery.java:243)
        ... 20 more
Caused by: 
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: 
Duplicate entry '1153' for key 'PRIMARY'
        at sun.reflect.GeneratedConstructorAccessor37.newInstance(Unknown 
Source)
        at 
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
        at com.mysql.jdbc.Util.handleNewInstance(Util.java:377)
        at com.mysql.jdbc.Util.getInstance(Util.java:360)
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:971)
        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3887)
        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3823)
        at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2435)
        at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2582)
        at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2530)
        at 
com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1907)
        at 
com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2141)
        at 
com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:1773)
        ... 30 more

        at org.apache.sentry.service.thrift.Status.throwIfNotOk(Status.java:109)
        at 
org.apache.sentry.provider.db.service.thrift.SentryPolicyServiceClientDefaultImpl.grantPrivilege(SentryPolicyServiceClientDefaultImpl.java:388)
        at 
org.apache.sentry.provider.db.service.thrift.SentryPolicyServiceClientDefaultImpl.grantDatabasePrivilege(SentryPolicyServiceClientDefaultImpl.java:285)
        ... 28 more
{code}



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

Reply via email to