[ https://issues.apache.org/jira/browse/HIVE-27517?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17794435#comment-17794435 ]
Ayush Saxena commented on HIVE-27517: ------------------------------------- This is just look & feel kind of issue, rather than NPE throw IllegalArgumentException with the message. The execution in either ways doesn't succeed, it is just with this it will fail with a better looking exception. Not a release blocker, reducing the priority. cc. [~dkuzmenko] > SessionState is not correctly initialized when > hive.security.authorization.createtable.group.grants is set to automatically > grant privileges > -------------------------------------------------------------------------------------------------------------------------------------------- > > Key: HIVE-27517 > URL: https://issues.apache.org/jira/browse/HIVE-27517 > Project: Hive > Issue Type: Bug > Reporter: ConfX > Priority: Critical > Labels: pull-request-available > Attachments: reproduce.sh > > > h2. What happened: > When set {{hive.security.authorization.createtable.group.grants}} to some > value, the grant may not be able to successfully apply to specified groups > due to incorrect {{SessionState}} initialization and crashes the system. > h2. Buggy code: > When call {{getAuthenticator()}} method from {{SessionState}} class, it first > executes {{{}setupAuth(){}}}, which setup authentication and authorization > plugins for this session. > {noformat} > /** > * Setup authentication and authorization plugins for this session. > */ > private synchronized void setupAuth() { > ... > // create the create table grants with new config > createTableGrants = CreateTableAutomaticGrant.create(sessionConf); > ... > }{noformat} > In the table grants creation, the {{sessionConf}} sets group grant with > {{{}getGrantMap(){}}}. This method will validate privilege with > {{getPrivilege}} method and eventually {{getPrivilegeFromRegistry}} method > will be executed. > {noformat} > private static Privilege getPrivilegeFromRegistry(PrivilegeType ptype) { > return SessionState.get().isAuthorizationModeV2() ? RegistryV2.get(ptype) > : Registry.get(ptype); > }{noformat} > However, {{ SessionState.get()}} can be null because the state may not be > correctly initialized. > In {{{}SessionState.java{}}}, {{get()}} method returns > {{{}tss.get().state{}}}. If the current thread does not have SessionStates > initialized, then {{get()}} will try to create a new SessionStates by calling > {{initialValue()}} below. This calls the default constructor of the > {{SessionSatets}} class, which does not initialize the {{SessionState}} field > and {{HiveConf}} field. > {noformat} > /** > * get the current session. > */ > public static SessionState get() { > return tss.get().state; > }/** > * Singleton Session object per thread. > * > **/ > private static ThreadLocal<SessionStates> tss = new > ThreadLocal<SessionStates>() { > @Override > protected SessionStates initialValue() { > return new SessionStates(); > } > };private static class SessionStates { > private SessionState state; > private HiveConf conf; > private void attach(SessionState state) { > this.state = state; > attach(state.getConf()); > } > private void attach(HiveConf conf) { > this.conf = conf; ClassLoader classLoader = conf.getClassLoader(); > if (classLoader != null) { > Thread.currentThread().setContextClassLoader(classLoader); > } > } > }{noformat} > h2. How to reproduce: > (1) Set {{hive.security.authorization.createtable.group.grants}} to some > value, e.g. {{abc,def:create;xlab,tyx:all;}} > (2) Run test > {{org.apache.hadoop.hive.ql.parse.authorization.TestSessionUserName#testSessionGetGroupNames}} > h2. StackTrace: > {noformat} > java.lang.NullPointerException > > at > org.apache.hadoop.hive.ql.security.authorization.PrivilegeRegistry.getPrivilegeFromRegistry(PrivilegeRegistry.java:77) > at > org.apache.hadoop.hive.ql.security.authorization.PrivilegeRegistry.getPrivilege(PrivilegeRegistry.java:72) > at > org.apache.hadoop.hive.ql.session.CreateTableAutomaticGrant.validatePrivilege(CreateTableAutomaticGrant.java:108) > at > org.apache.hadoop.hive.ql.session.CreateTableAutomaticGrant.getGrantorInfoList(CreateTableAutomaticGrant.java:91) > at > org.apache.hadoop.hive.ql.session.CreateTableAutomaticGrant.getGrantMap(CreateTableAutomaticGrant.java:73) > at > org.apache.hadoop.hive.ql.session.CreateTableAutomaticGrant.create(CreateTableAutomaticGrant.java:47) > at > org.apache.hadoop.hive.ql.session.SessionState.setupAuth(SessionState.java:996) > at > org.apache.hadoop.hive.ql.session.SessionState.getAuthenticator(SessionState.java:1744) > {noformat} > -- This message was sent by Atlassian Jira (v8.20.10#820010)