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

Guanghao Zhang resolved HBASE-22503.
------------------------------------
    Resolution: Fixed

Pushed to branch-2+. Thanks [~Apache9] for reviewing.

> Failed to upgrade to 2.2+ as the global permission which storaged in zk is 
> not right 
> -------------------------------------------------------------------------------------
>
>                 Key: HBASE-22503
>                 URL: https://issues.apache.org/jira/browse/HBASE-22503
>             Project: HBase
>          Issue Type: Bug
>    Affects Versions: 2.2.0
>            Reporter: Guanghao Zhang
>            Assignee: Guanghao Zhang
>            Priority: Blocker
>             Fix For: 3.0.0, 2.2.0, 2.3.0
>
>
> Before 2.2, the global permission which storaged in zk is not right. It was 
> storaged as a table permission. After HBASE-21255, 2.2+ will read it as a 
> global permission and will throw a cast error.
>  
> {code:java}
> Caused by: java.lang.ClassCastException: 
> org.apache.hadoop.hbase.security.access.TablePermission cannot be cast to 
> org.apache.hadoop.hbase.security.access.GlobalPermission
> at 
> org.apache.hadoop.hbase.security.access.AuthManager.updateGlobalCache(AuthManager.java:171)
> at 
> org.apache.hadoop.hbase.security.access.AuthManager.refreshTableCacheFromWritable(AuthManager.java:129)
> at 
> org.apache.hadoop.hbase.security.access.ZKPermissionWatcher.refreshAuthManager(ZKPermissionWatcher.java:252)
> at 
> org.apache.hadoop.hbase.security.access.ZKPermissionWatcher.refreshNodes(ZKPermissionWatcher.java:235)
> {code}
>  
> Before 2.2, the acl update logic is complicated. Client sent the grant/revoke 
> rpc call to AccessControl coprocessor directly. And only the RS which has acl 
> region will put a acl record to hbase:acl table. And the AccessControl 
> override postPut/postDelete method, too. It will update zk when 
> postPut/postDelete found this is a put/delete for acl region...And there is a 
> TODO "{color:#FF0000}global entry should be handled differently"{color}. The 
> global entry was handled as a table permission, too.
>  
> {code:java}
> private static Pair<String, TablePermission> parsePermissionRecord(
>     byte[] entryName, Cell kv) {
>   // return X given a set of permissions encoded in the permissionRecord kv.
>   byte[] family = CellUtil.cloneFamily(kv);
>   if (!Bytes.equals(family, ACL_LIST_FAMILY)) {
>     return null;
>   }
>   byte[] key = CellUtil.cloneQualifier(kv);
>   byte[] value = CellUtil.cloneValue(kv);
>   if (LOG.isDebugEnabled()) {
>     LOG.debug("Read acl: kv ["+
>         Bytes.toStringBinary(key)+": "+
>         Bytes.toStringBinary(value)+"]");
>   }
>   // check for a column family appended to the key
>   // TODO: avoid the string conversion to make this more efficient
>   String username = Bytes.toString(key);
>   //Handle namespace entry
>   if(isNamespaceEntry(entryName)) {
>     return new Pair<>(username, new 
> TablePermission(Bytes.toString(fromNamespaceEntry(entryName)), value));
>   }
>   //Handle table and global entry
>   //TODO global entry should be handled differently
>   int idx = username.indexOf(ACL_KEY_DELIMITER);
>   byte[] permFamily = null;
>   byte[] permQualifier = null;
>   if (idx > 0 && idx < username.length()-1) {
>     String remainder = username.substring(idx+1);
>     username = username.substring(0, idx);
>     idx = remainder.indexOf(ACL_KEY_DELIMITER);
>     if (idx > 0 && idx < remainder.length()-1) {
>       permFamily = Bytes.toBytes(remainder.substring(0, idx));
>       permQualifier = Bytes.toBytes(remainder.substring(idx+1));
>     } else {
>       permFamily = Bytes.toBytes(remainder);
>     }
>   }
>   return new Pair<>(username, new 
> TablePermission(TableName.valueOf(entryName), permFamily, permQualifier, 
> value));
> }
> {code}
>  
>  



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to