This is an automated email from the ASF dual-hosted git repository.

madhan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ranger.git


The following commit(s) were added to refs/heads/master by this push:
     new 8222674db RANGER-4741: Hive plugin optimization to avoid excessive 
metastore API calls
8222674db is described below

commit 8222674db6906d390365bc35b9462da8ff70bb57
Author: Madhan Neethiraj <[email protected]>
AuthorDate: Thu Mar 7 01:19:38 2024 -0800

    RANGER-4741: Hive plugin optimization to avoid excessive metastore API calls
---
 .../hive/authorizer/RangerHiveAuthorizer.java      | 92 +++++++++++++++-------
 1 file changed, 65 insertions(+), 27 deletions(-)

diff --git 
a/hive-agent/src/main/java/org/apache/ranger/authorization/hive/authorizer/RangerHiveAuthorizer.java
 
b/hive-agent/src/main/java/org/apache/ranger/authorization/hive/authorizer/RangerHiveAuthorizer.java
index 9b25e2b8a..0492108e3 100644
--- 
a/hive-agent/src/main/java/org/apache/ranger/authorization/hive/authorizer/RangerHiveAuthorizer.java
+++ 
b/hive-agent/src/main/java/org/apache/ranger/authorization/hive/authorizer/RangerHiveAuthorizer.java
@@ -719,7 +719,7 @@ public class RangerHiveAuthorizer extends 
RangerHiveAuthorizerBase {
 
                try {
                        List<HivePrivilegeObject> outputs = new 
ArrayList<>(Arrays.asList(hivePrivObject));
-                       RangerHiveResource resource = 
getHiveResource(HiveOperationType.GRANT_PRIVILEGE, hivePrivObject, null, 
outputs);
+                       RangerHiveResource resource = 
getHiveResource(HiveOperationType.GRANT_PRIVILEGE, hivePrivObject, null, 
outputs, null);
                        GrantRevokeRequest request  = 
createGrantRevokeData(resource, hivePrincipals, hivePrivileges, 
grantorPrincipal, grantOption);
 
                        LOG.info("grantPrivileges(): " + request);
@@ -760,7 +760,7 @@ public class RangerHiveAuthorizer extends 
RangerHiveAuthorizerBase {
 
                try {
                        List<HivePrivilegeObject> outputs = new 
ArrayList<>(Arrays.asList(hivePrivObject));
-                       RangerHiveResource resource = 
getHiveResource(HiveOperationType.REVOKE_PRIVILEGE, hivePrivObject, null, 
outputs);
+                       RangerHiveResource resource = 
getHiveResource(HiveOperationType.REVOKE_PRIVILEGE, hivePrivObject, null, 
outputs, null);
                        GrantRevokeRequest request  = 
createGrantRevokeData(resource, hivePrincipals, hivePrivileges, 
grantorPrincipal, grantOption);
 
                        LOG.info("revokePrivileges(): " + request);
@@ -806,6 +806,7 @@ public class RangerHiveAuthorizer extends 
RangerHiveAuthorizerBase {
                        String                  user           = 
ugi.getShortUserName();
                        Set<String>             groups         = 
Sets.newHashSet(ugi.getGroupNames());
                        Set<String>             roles          = 
getCurrentRolesForUser(user, groups);
+                       Map<String, String>     objOwners      = new 
HashMap<>();
 
                        if(LOG.isDebugEnabled()) {
                                LOG.debug(toString(hiveOpType, inputHObjs, 
outputHObjs, context, sessionContext));
@@ -825,7 +826,7 @@ public class RangerHiveAuthorizer extends 
RangerHiveAuthorizerBase {
 
                        if(!CollectionUtils.isEmpty(inputHObjs)) {
                                for(HivePrivilegeObject hiveObj : inputHObjs) {
-                                       RangerHiveResource resource = 
getHiveResource(hiveOpType, hiveObj, inputHObjs, outputHObjs);
+                                       RangerHiveResource resource = 
getHiveResource(hiveOpType, hiveObj, inputHObjs, outputHObjs, objOwners);
 
                                        if (resource == null) { // possible if 
input object/object is of a kind that we don't currently authorize
                                                continue;
@@ -923,7 +924,7 @@ public class RangerHiveAuthorizer extends 
RangerHiveAuthorizerBase {
 
                        if(!CollectionUtils.isEmpty(outputHObjs)) {
                                for(HivePrivilegeObject hiveObj : outputHObjs) {
-                                       RangerHiveResource resource = 
getHiveResource(hiveOpType, hiveObj, inputHObjs, outputHObjs);
+                                       RangerHiveResource resource = 
getHiveResource(hiveOpType, hiveObj, inputHObjs, outputHObjs, objOwners);
 
                                        if (resource == null) { // possible if 
input object/object is of a kind that we don't currently authorize
                                                continue;
@@ -1158,6 +1159,8 @@ public class RangerHiveAuthorizer extends 
RangerHiveAuthorizerBase {
                        String user = ugi.getShortUserName();
                        Set<String> groups = 
Sets.newHashSet(ugi.getGroupNames());
                        Set<String> roles  = getCurrentRolesForUser(user, 
groups);
+                       Map<String, String> objOwners = new HashMap<>();
+
                        if (LOG.isDebugEnabled()) {
                                LOG.debug(String.format("filterListCmdObjects: 
user[%s], groups[%s], roles[%s] ", user, groups, roles));
                        }
@@ -1180,7 +1183,7 @@ public class RangerHiveAuthorizer extends 
RangerHiveAuthorizerBase {
                                        LOG.debug(String.format(format, 
actionType, objectType, objectName, dbName, columns, partitionKeys, 
commandString, ipAddress));
                                }
                                
-                               RangerHiveResource resource = 
createHiveResourceForFiltering(privilegeObject);
+                               RangerHiveResource resource = 
createHiveResourceForFiltering(privilegeObject, objOwners);
                                if (resource == null) {
                                        LOG.error("filterListCmdObjects: 
RangerHiveResource returned by createHiveResource is null");
                                } else {
@@ -1230,7 +1233,8 @@ public class RangerHiveAuthorizer extends 
RangerHiveAuthorizerBase {
                }
 
                if(CollectionUtils.isNotEmpty(hiveObjs)) {
-                       IMetaStoreClient metaStoreClient = getMetaStoreClient();
+                       IMetaStoreClient    metaStoreClient = 
getMetaStoreClient();
+                       Map<String, String> objOwners       = new HashMap<>();
 
                        for (HivePrivilegeObject hiveObj : hiveObjs) {
                                HivePrivilegeObjectType hiveObjType = 
hiveObj.getType();
@@ -1249,7 +1253,7 @@ public class RangerHiveAuthorizer extends 
RangerHiveAuthorizerBase {
                                        String database = hiveObj.getDbname();
                                        String table    = 
hiveObj.getObjectName();
 
-                                       String rowFilterExpr = 
getRowFilterExpression(queryContext, hiveObj, metaStoreClient);
+                                       String rowFilterExpr = 
getRowFilterExpression(queryContext, hiveObj, metaStoreClient, objOwners);
 
                                        if 
(StringUtils.isNotBlank(rowFilterExpr)) {
                                                if(LOG.isDebugEnabled()) {
@@ -1264,7 +1268,7 @@ public class RangerHiveAuthorizer extends 
RangerHiveAuthorizerBase {
                                                List<String> columnTransformers 
= new ArrayList<String>();
 
                                                for (String column : 
hiveObj.getColumns()) {
-                                                       boolean 
isColumnTransformed = 
addCellValueTransformerAndCheckIfTransformed(queryContext, hiveObj, column, 
columnTransformers, metaStoreClient);
+                                                       boolean 
isColumnTransformed = 
addCellValueTransformerAndCheckIfTransformed(queryContext, hiveObj, column, 
columnTransformers, metaStoreClient, objOwners);
 
                                                        
if(LOG.isDebugEnabled()) {
                                                                
LOG.debug("addCellValueTransformerAndCheckIfTransformed(database=" + database + 
", table=" + table + ", column=" + column + "): " + isColumnTransformed);
@@ -1333,7 +1337,7 @@ public class RangerHiveAuthorizer extends 
RangerHiveAuthorizerBase {
                return result != null && result.isRowFilterEnabled() && 
StringUtils.isNotEmpty(result.getFilterExpr());
        }
 
-       private String getRowFilterExpression(HiveAuthzContext context, 
HivePrivilegeObject tableOrView, IMetaStoreClient metaStoreClient) throws 
SemanticException {
+       private String getRowFilterExpression(HiveAuthzContext context, 
HivePrivilegeObject tableOrView, IMetaStoreClient metaStoreClient, Map<String, 
String> objOwners) throws SemanticException {
                UserGroupInformation ugi = getCurrentUserGroupInfo();
 
                if(ugi == null) {
@@ -1359,7 +1363,7 @@ public class RangerHiveAuthorizer extends 
RangerHiveAuthorizerBase {
                        HiveObjectType          objectType     = 
HiveObjectType.TABLE;
                        RangerHiveResource      resource       = new 
RangerHiveResource(objectType, databaseName, tableOrViewName);
 
-                       setOwnerUser(resource, tableOrView, metaStoreClient);
+                       setOwnerUser(resource, tableOrView, metaStoreClient, 
objOwners);
 
                        RangerHiveAccessRequest request = new 
RangerHiveAccessRequest(resource, user, groups, roles, objectType.name(), 
HiveAccessType.SELECT, context, sessionContext);
                        RangerAccessResult      result  = 
hivePlugin.evalRowFilterPolicies(request, auditHandler);
@@ -1378,7 +1382,7 @@ public class RangerHiveAuthorizer extends 
RangerHiveAuthorizerBase {
                return ret;
        }
 
-       private boolean 
addCellValueTransformerAndCheckIfTransformed(HiveAuthzContext context, 
HivePrivilegeObject tableOrView, String columnName, List<String> 
columnTransformers, IMetaStoreClient metaStoreClient) throws SemanticException {
+       private boolean 
addCellValueTransformerAndCheckIfTransformed(HiveAuthzContext context, 
HivePrivilegeObject tableOrView, String columnName, List<String> 
columnTransformers, IMetaStoreClient metaStoreClient, Map<String, String> 
objOwners) throws SemanticException {
                UserGroupInformation ugi = getCurrentUserGroupInfo();
 
                if(ugi == null) {
@@ -1406,7 +1410,7 @@ public class RangerHiveAuthorizer extends 
RangerHiveAuthorizerBase {
                        HiveObjectType          objectType     = 
HiveObjectType.COLUMN;
                        RangerHiveResource      resource       = new 
RangerHiveResource(objectType, databaseName, tableOrViewName, columnName);
 
-                       setOwnerUser(resource, tableOrView, metaStoreClient);
+                       setOwnerUser(resource, tableOrView, metaStoreClient, 
objOwners);
 
                        RangerHiveAccessRequest request = new 
RangerHiveAccessRequest(resource, user, groups, roles, objectType.name(), 
HiveAccessType.SELECT, context, sessionContext);
                        RangerAccessResult      result  = 
hivePlugin.evalDataMaskPolicies(request, auditHandler);
@@ -1457,7 +1461,7 @@ public class RangerHiveAuthorizer extends 
RangerHiveAuthorizerBase {
                return ret;
        }
 
-       private RangerHiveResource 
createHiveResourceForFiltering(HivePrivilegeObject privilegeObject) {
+       private RangerHiveResource 
createHiveResourceForFiltering(HivePrivilegeObject privilegeObject, Map<String, 
String> objOwners) {
                RangerHiveResource resource = null;
 
                HivePrivilegeObjectType objectType = privilegeObject.getType();
@@ -1465,7 +1469,7 @@ public class RangerHiveAuthorizer extends 
RangerHiveAuthorizerBase {
                switch(objectType) {
                        case DATABASE:
                        case TABLE_OR_VIEW:
-                               resource = createHiveResource(privilegeObject);
+                               resource = createHiveResource(privilegeObject, 
objOwners);
                                break;
                        default:
                                
LOG.warn("RangerHiveAuthorizer.createHiveResourceForFiltering: unexpected 
objectType:" + objectType);
@@ -1475,6 +1479,10 @@ public class RangerHiveAuthorizer extends 
RangerHiveAuthorizerBase {
        }
 
        RangerHiveResource createHiveResource(HivePrivilegeObject 
privilegeObject) {
+               return createHiveResource(privilegeObject, null);
+       }
+
+       RangerHiveResource createHiveResource(HivePrivilegeObject 
privilegeObject, Map<String, String> objOwners) {
                RangerHiveResource resource = null;
                HivePrivilegeObjectType objectType = privilegeObject.getType();
                String objectName = privilegeObject.getObjectName();
@@ -1501,7 +1509,7 @@ public class RangerHiveAuthorizer extends 
RangerHiveAuthorizerBase {
                }
 
                if (resource != null) {
-                       setOwnerUser(resource, privilegeObject, 
getMetaStoreClient());
+                       setOwnerUser(resource, privilegeObject, 
getMetaStoreClient(), objOwners);
 
                        resource.setServiceDef(hivePlugin == null ? null : 
hivePlugin.getServiceDef());
                }
@@ -1513,7 +1521,8 @@ public class RangerHiveAuthorizer extends 
RangerHiveAuthorizerBase {
        private RangerHiveResource getHiveResource(HiveOperationType   
hiveOpType,
                                                                                
           HivePrivilegeObject hiveObj,
                                                                                
           List<HivePrivilegeObject> inputs,
-                                                                               
           List<HivePrivilegeObject> outputs) {
+                                                                               
           List<HivePrivilegeObject> outputs,
+                                                                               
           Map<String, String> objOwners) {
                RangerHiveResource ret = null;
 
                HiveObjectType objectType = getObjectType(hiveObj, hiveOpType);
@@ -1522,7 +1531,7 @@ public class RangerHiveAuthorizer extends 
RangerHiveAuthorizerBase {
                        case DATABASE:
                                ret = new RangerHiveResource(objectType, 
hiveObj.getDbname());
                                if (!isCreateOperation(hiveOpType)) {
-                                       setOwnerUser(ret, hiveObj, 
getMetaStoreClient());
+                                       setOwnerUser(ret, hiveObj, 
getMetaStoreClient(), objOwners);
                                }
                        break;
        
@@ -1536,12 +1545,12 @@ public class RangerHiveAuthorizer extends 
RangerHiveAuthorizerBase {
                                                        ", Size of outputs = [" 
+ (CollectionUtils.isNotEmpty(outputs) ? outputs.size() : 0) + "]");
                                }
 
-                               setOwnerUser(ret, hiveObj, 
getMetaStoreClient());
+                               setOwnerUser(ret, hiveObj, 
getMetaStoreClient(), objOwners);
 
                                if (isCreateOperation(hiveOpType)) {
                                        HivePrivilegeObject dbObject = 
getDatabaseObject(hiveObj.getDbname(), inputs, outputs);
                                        if (dbObject != null) {
-                                               setOwnerUser(ret, dbObject, 
getMetaStoreClient());
+                                               setOwnerUser(ret, dbObject, 
getMetaStoreClient(), objOwners);
                                        }
                                }
 
@@ -1554,7 +1563,7 @@ public class RangerHiveAuthorizer extends 
RangerHiveAuthorizerBase {
        
                        case COLUMN:
                                ret = new RangerHiveResource(objectType, 
hiveObj.getDbname(), hiveObj.getObjectName(), 
StringUtils.join(hiveObj.getColumns(), COLUMN_SEP));
-                               setOwnerUser(ret, hiveObj, 
getMetaStoreClient());
+                               setOwnerUser(ret, hiveObj, 
getMetaStoreClient(), objOwners);
                        break;
 
             case URI:
@@ -3127,16 +3136,28 @@ public class RangerHiveAuthorizer extends 
RangerHiveAuthorizerBase {
                return request;
        }
 
-       static void setOwnerUser(RangerHiveResource resource, 
HivePrivilegeObject hiveObj, IMetaStoreClient metaStoreClient) {
+       static void setOwnerUser(RangerHiveResource resource, 
HivePrivilegeObject hiveObj, IMetaStoreClient metaStoreClient, Map<String, 
String> objOwners) {
                if (hiveObj != null) {
+                       String objName = null;
+                       String owner   = null;
+
                        // resource.setOwnerUser(hiveObj.getOwnerName());
                        switch (hiveObj.getType()) {
                                case DATABASE:
                                        try {
-                                               Database database = 
metaStoreClient != null ? metaStoreClient.getDatabase(hiveObj.getDbname()) : 
null;
+                                               objName = hiveObj.getDbname();
+                                               owner   = objOwners != null ? 
objOwners.get(objName) : null;
 
-                                               if (database != null) {
-                                                       
resource.setOwnerUser(database.getOwnerName());
+                                               if (StringUtils.isBlank(owner)) 
{
+                                                       Database database = 
metaStoreClient != null ? metaStoreClient.getDatabase(hiveObj.getDbname()) : 
null;
+
+                                                       if (database != null) {
+                                                               owner = 
database.getOwnerName();
+                                                       }
+                                               } else {
+                                                       if 
(LOG.isDebugEnabled()) {
+                                                               
LOG.debug("Owner for database " + objName + " is already known");
+                                                       }
                                                }
                                        } catch (Exception excp) {
                                                LOG.error("failed to get 
database object from Hive metastore. dbName=" + hiveObj.getDbname(), excp);
@@ -3146,16 +3167,33 @@ public class RangerHiveAuthorizer extends 
RangerHiveAuthorizerBase {
                                case TABLE_OR_VIEW:
                                case COLUMN:
                                        try {
-                                               Table table = metaStoreClient 
!= null ? metaStoreClient.getTable(hiveObj.getDbname(), 
hiveObj.getObjectName()) : null;
+                                               objName = hiveObj.getDbname() + 
"." + hiveObj.getObjectName();
+                                               owner   = objOwners != null ? 
objOwners.get(objName) : null;
 
-                                               if (table != null) {
-                                                       
resource.setOwnerUser(table.getOwner());
+                                               if (StringUtils.isBlank(owner)) 
{
+                                                       Table table = 
metaStoreClient != null ? metaStoreClient.getTable(hiveObj.getDbname(), 
hiveObj.getObjectName()) : null;
+
+                                                       if (table != null) {
+                                                               owner = 
table.getOwner();
+                                                       }
+                                               } else {
+                                                       if 
(LOG.isDebugEnabled()) {
+                                                               
LOG.debug("Owner for table " + objName + " is already known");
+                                                       }
                                                }
                                        } catch (Exception excp) {
                                                LOG.error("failed to get table 
object from Hive metastore. dbName=" + hiveObj.getDbname() + ", tblName=" + 
hiveObj.getObjectName(), excp);
                                        }
                                        break;
                        }
+
+                       if (objOwners != null && objName != null) {
+                               objOwners.put(objName, owner);
+                       }
+
+                       if (StringUtils.isNotBlank(objName) && 
StringUtils.isNotBlank(owner)) {
+                               resource.setOwnerUser(owner);
+                       }
                }
 
                if (LOG.isDebugEnabled()) {

Reply via email to