[ 
https://issues.apache.org/jira/browse/SENTRY-2010?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Na Li resolved SENTRY-2010.
---------------------------
       Resolution: Duplicate
    Fix Version/s: 2.0.0

> Oracle does not allow creating more than one index on the same column
> ---------------------------------------------------------------------
>
>                 Key: SENTRY-2010
>                 URL: https://issues.apache.org/jira/browse/SENTRY-2010
>             Project: Sentry
>          Issue Type: Bug
>          Components: Sentry
>    Affects Versions: 2.0.0
>            Reporter: Na Li
>            Assignee: Na Li
>             Fix For: 2.0.0
>
>
> When running sentry on Oracle DB with dataNucleus 4, we see a lot of 
> exceptions that the column list already indexed when adding unique index.
> I suspect the oracle sql command failure is caused by the fact that
> 1) Oracle does not allow indexing the same column twice. "Cause: You tried to 
> create an index on a set of columns in a table, but you've already indexed 
> this set of columns." based on 
> https://www.techonthenet.com/oracle/errors/ora01408.php. However, MySql 
> allows this
> 2) Sentry defined the unique index for column "USER_NAME" in table 
> "SENTRY_USER" at sentry-oracle-2.0.0.sql, so a unique index will be created 
> when this sql runs
> 3) Sentry specifies the field "roleName" as unique in table "MSentryRole" 
> (which corresponds to DB column "USER_NAME" in DB table "SENTRY_USER" in 
> dataNucleus configuration package.jdo. Therefore datanucleus tries to add 
> another unique index to column "USER_NAME" in table "SENTRY_USER" when 
> dataNucleus runs. Oracle throws exception since a unique index is already 
> created by sql script.
> The reason it does not show in previous sentry version is because sentry was 
> using datanucleus 3 before. Now, in sentry 2.0, sentry moves up to 
> dataNucleus 4, and dataNucleus 4 verifies the data and creates indexes, and 
> therefore triggers the issue above.
> The fix is to remove the unique index in datanucleus.
> call stack below--------------
> sentry has serious issue with database when creating unique index
> Error : 1408, Position : 53, Sql = CREATE UNIQUE INDEX SENTRY_USER_NAME ON 
> SENTRY_USER (USER_NAME), OriginalSql = CREATE UNIQUE INDEX SENTRY_USER_NAME 
> ON SENTRY_USER (USER_NAME), Error Msg = ORA-01408: such column list already 
> indexed
> http://shardy-qainfra-3730-c6-hs2-sentry-1.vpc.cloudera.com:7180/cmf/process/all/logs/context?path=%2Fvar%2Flog%2Fsentry%2Fhadoop-cmf-SENTRY-1-SENTRY_SERVER-shardy-qainfra-3730-c6-hs2-sentry-1.vpc.cloudera.com.log.out&roleId=13&host=shardy-qainfra-3730-c6-hs2-sentry-1.vpc.cloudera.com&port=9000&timestamp=1508342110946
> 8:52:07.632 AM        ERROR   Datastore       
> An exception was thrown while adding/validating class(es) : ORA-01408: such 
> column list already indexed
> java.sql.SQLException: ORA-01408: such column list already indexed
> at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:494)
> at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:446)
> at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:1054)
> at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:623)
> at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:252)
> at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:612)
> at oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:213)
> at oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:37)
> at oracle.jdbc.driver.T4CStatement.executeForRows(T4CStatement.java:896)
> at 
> oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1119)
> at 
> oracle.jdbc.driver.OracleStatement.executeInternal(OracleStatement.java:1737)
> at oracle.jdbc.driver.OracleStatement.execute(OracleStatement.java:1692)
> at 
> oracle.jdbc.driver.OracleStatementWrapper.execute(OracleStatementWrapper.java:300)
> at com.jolbox.bonecp.StatementHandle.execute(StatementHandle.java:300)
> at 
> org.datanucleus.store.rdbms.table.AbstractTable.executeDdlStatement(AbstractTable.java:879)
> at 
> org.datanucleus.store.rdbms.table.TableImpl.createIndices(TableImpl.java:640)
> at 
> org.datanucleus.store.rdbms.table.TableImpl.validateIndices(TableImpl.java:587)
> at 
> org.datanucleus.store.rdbms.table.TableImpl.validateConstraints(TableImpl.java:395)
> at 
> org.datanucleus.store.rdbms.table.ClassTable.validateConstraints(ClassTable.java:3514)
> at 
> org.datanucleus.store.rdbms.RDBMSStoreManager$ClassAdder.performTablesValidation(RDBMSStoreManager.java:3449)
> at 
> org.datanucleus.store.rdbms.RDBMSStoreManager$ClassAdder.run(RDBMSStoreManager.java:2877)
> at 
> org.datanucleus.store.rdbms.AbstractSchemaTransaction.execute(AbstractSchemaTransaction.java:119)
> at 
> org.datanucleus.store.rdbms.RDBMSStoreManager.manageClasses(RDBMSStoreManager.java:1608)
> at 
> org.datanucleus.store.rdbms.RDBMSStoreManager.getDatastoreClass(RDBMSStoreManager.java:671)
> at 
> org.datanucleus.store.rdbms.query.RDBMSQueryUtils.getStatementForCandidates(RDBMSQueryUtils.java:425)
> at 
> org.datanucleus.store.rdbms.query.JDOQLQuery.compileQueryFull(JDOQLQuery.java:864)
> at 
> org.datanucleus.store.rdbms.query.JDOQLQuery.compileInternal(JDOQLQuery.java:346)
> at org.datanucleus.store.query.Query.executeQuery(Query.java:1805)
> at org.datanucleus.store.query.Query.executeWithArray(Query.java:1733)
> at org.datanucleus.store.query.Query.execute(Query.java:1715)
> at org.datanucleus.api.jdo.JDOQuery.executeInternal(JDOQuery.java:371)
> at org.datanucleus.api.jdo.JDOQuery.execute(JDOQuery.java:213)
> at 
> org.apache.sentry.provider.db.service.persistent.SentryStore.getAllRoles(SentryStore.java:319)
> at 
> org.apache.sentry.provider.db.service.persistent.SentryStore.access$1600(SentryStore.java:121)
> at 
> org.apache.sentry.provider.db.service.persistent.SentryStore$33.execute(SentryStore.java:1761)
> at 
> org.apache.sentry.provider.db.service.persistent.SentryStore$33.execute(SentryStore.java:1755)



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

Reply via email to