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

nikhil 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 d8486f2  RANGER-2508 : Good coding practices for concurrent policy 
label creation
d8486f2 is described below

commit d8486f2888e31262d326fe0b61750542bbddbfac
Author: Nikhil P <[email protected]>
AuthorDate: Tue Jul 30 19:24:29 2019 +0530

    RANGER-2508 : Good coding practices for concurrent policy label creation
---
 .../java/org/apache/ranger/biz/ServiceDBStore.java |  60 ++++++------
 .../ranger/service/RangerPolicyLabelsService.java  | 104 ++++++++++++++-------
 2 files changed, 105 insertions(+), 59 deletions(-)

diff --git 
a/security-admin/src/main/java/org/apache/ranger/biz/ServiceDBStore.java 
b/security-admin/src/main/java/org/apache/ranger/biz/ServiceDBStore.java
index 77c91ab..8420233 100644
--- a/security-admin/src/main/java/org/apache/ranger/biz/ServiceDBStore.java
+++ b/security-admin/src/main/java/org/apache/ranger/biz/ServiceDBStore.java
@@ -32,6 +32,7 @@ import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
 import java.util.StringTokenizer;
+import java.util.TreeSet;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
@@ -240,7 +241,7 @@ public class ServiceDBStore extends AbstractServiceStore {
        RangerPolicyService policyService;
        
        @Autowired
-        RangerPolicyLabelsService policyLabelsService;
+        RangerPolicyLabelsService<XXPolicyLabel, ?> policyLabelsService;
 
         @Autowired
        XUserService xUserService;
@@ -1888,7 +1889,7 @@ public class ServiceDBStore extends AbstractServiceStore {
                }
 
                List<String> policyLabels = policy.getPolicyLabels();
-
+               Set<String> uniquePolicyLabels = new TreeSet<>(policyLabels);
                policy.setVersion(Long.valueOf(1));
                updatePolicySignature(policy);
 
@@ -1907,8 +1908,7 @@ public class ServiceDBStore extends AbstractServiceStore {
 
                XXPolicy xCreatedPolicy = 
daoMgr.getXXPolicy().getById(policy.getId());
                policyRefUpdater.createNewPolMappingForRefTable(policy, 
xCreatedPolicy, xServiceDef);
-               createNewLabelsForPolicy(xCreatedPolicy, policyLabels);
-
+               createOrMapLabels(xCreatedPolicy, uniquePolicyLabels);
                 RangerPolicy createdPolicy = 
policyService.getPopulatedViewObject(xCreatedPolicy);
 
                handlePolicyUpdate(service, 
RangerPolicyDelta.CHANGE_TYPE_POLICY_CREATE, createdPolicy);
@@ -1921,6 +1921,34 @@ public class ServiceDBStore extends AbstractServiceStore 
{
                return createdPolicy;
        }
 
+       public void createOrMapLabels(XXPolicy xPolicy, Set<String> 
uniquePolicyLabels) {
+               if (LOG.isDebugEnabled()) {
+                       LOG.debug("==> ServiceDBStore.createOrMapLabels()");
+               }
+
+               for (String policyLabel : uniquePolicyLabels) {
+                       //check and create new label If does not exist
+                       XXPolicyLabel xxPolicyLabel = 
daoMgr.getXXPolicyLabels().findByName(policyLabel);
+                       if(xxPolicyLabel == null) {
+                               synchronized(this) {
+                                       xxPolicyLabel  = 
policyLabelsService.createNewOrGetLabel(policyLabel, xPolicy);
+                               }
+                       }
+                       //label mapping with policy
+                       if (xxPolicyLabel.getId() != null) {
+                               XXPolicyLabelMap xxPolicyLabelMap = new 
XXPolicyLabelMap();
+                               xxPolicyLabelMap.setPolicyId(xPolicy.getId());
+                               
xxPolicyLabelMap.setPolicyLabelId(xxPolicyLabel.getId()); xxPolicyLabelMap =
+                               
rangerAuditFields.populateAuditFieldsForCreate(xxPolicyLabelMap);
+                               xxPolicyLabelMap = 
daoMgr.getXXPolicyLabelMap().create(xxPolicyLabelMap);
+                       }
+               }
+
+               if (LOG.isDebugEnabled()) {
+                       LOG.debug("<== ServiceDBStore.createOrMapLabels()");
+               }
+       }
+
        private boolean validatePolicyItems(List<? extends RangerPolicyItem> 
policyItems) {
 
                if (CollectionUtils.isNotEmpty(policyItems)) {
@@ -1993,6 +2021,7 @@ public class ServiceDBStore extends AbstractServiceStore {
                        }
                }
                List<String> policyLabels = policy.getPolicyLabels();
+               Set<String> uniquePolicyLabels = new TreeSet<>(policyLabels);
                policy.setCreateTime(xxExisting.getCreateTime());
                policy.setGuid(xxExisting.getGuid());
                policy.setVersion(xxExisting.getVersion());
@@ -2008,8 +2037,7 @@ public class ServiceDBStore extends AbstractServiceStore {
                deleteExistingPolicyLabel(policy, true);
 
                policyRefUpdater.createNewPolMappingForRefTable(policy, 
newUpdPolicy, xServiceDef);
-               createNewLabelsForPolicy(newUpdPolicy, policyLabels);
-
+               createOrMapLabels(newUpdPolicy, uniquePolicyLabels);
                RangerPolicy updPolicy = 
policyService.getPopulatedViewObject(newUpdPolicy);
                handlePolicyUpdate(service, 
RangerPolicyDelta.CHANGE_TYPE_POLICY_UPDATE, updPolicy);
                dataHistService.createObjectDataHistory(updPolicy, 
RangerDataHistService.ACTION_UPDATE, true);
@@ -3347,26 +3375,6 @@ public class ServiceDBStore extends AbstractServiceStore 
{
                }
        }
 
-       private void createNewLabelsForPolicy(XXPolicy xPolicy, List<String> 
policyLabels) throws Exception {
-               for (String policyLabel : policyLabels) {
-                       XXPolicyLabel xXPolicyLabel = 
daoMgr.getXXPolicyLabels().findByName(policyLabel);
-                       if (xXPolicyLabel == null) {
-                               xXPolicyLabel = new XXPolicyLabel();
-                               if (StringUtils.isNotEmpty(policyLabel)) {
-                                       
xXPolicyLabel.setPolicyLabel(policyLabel);
-                                       xXPolicyLabel = 
rangerAuditFields.populateAuditFieldsForCreate(xXPolicyLabel);
-                                       xXPolicyLabel = 
daoMgr.getXXPolicyLabels().create(xXPolicyLabel);
-                               }
-                       }
-                       if (xXPolicyLabel.getId() != null) {
-                               XXPolicyLabelMap xxPolicyLabelMap = new 
XXPolicyLabelMap();
-                               xxPolicyLabelMap.setPolicyId(xPolicy.getId());
-                               
xxPolicyLabelMap.setPolicyLabelId(xXPolicyLabel.getId());
-                               xxPolicyLabelMap = 
rangerAuditFields.populateAuditFieldsForCreate(xxPolicyLabelMap);
-                               xxPolicyLabelMap = 
daoMgr.getXXPolicyLabelMap().create(xxPolicyLabelMap);
-                       }
-               }
-       }
 
        private Boolean deleteExistingPolicyLabel(RangerPolicy policy, boolean 
flush) {
                if (policy == null) {
diff --git 
a/security-admin/src/main/java/org/apache/ranger/service/RangerPolicyLabelsService.java
 
b/security-admin/src/main/java/org/apache/ranger/service/RangerPolicyLabelsService.java
index 788d671..1a1b56e 100644
--- 
a/security-admin/src/main/java/org/apache/ranger/service/RangerPolicyLabelsService.java
+++ 
b/security-admin/src/main/java/org/apache/ranger/service/RangerPolicyLabelsService.java
@@ -17,50 +17,88 @@
 
 package org.apache.ranger.service;
 
+import org.apache.commons.lang.StringUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.ranger.biz.ServiceDBStore;
 import org.apache.ranger.common.SearchField;
 import org.apache.ranger.common.SortField;
 import org.apache.ranger.common.SearchField.DATA_TYPE;
 import org.apache.ranger.common.SearchField.SEARCH_TYPE;
 import org.apache.ranger.common.SortField.SORT_ORDER;
+import org.apache.ranger.entity.XXPolicy;
 import org.apache.ranger.entity.XXPolicyLabel;
 import org.apache.ranger.plugin.model.RangerPolicy;
 import org.apache.ranger.plugin.util.SearchFilter;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Scope;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
 
 @Service
 @Scope("singleton")
-public class RangerPolicyLabelsService<T extends XXPolicyLabel, V extends 
RangerPolicy> extends
-                RangerBaseModelService<T, V> {
-
-        public RangerPolicyLabelsService() {
-                super();
-                searchFields.add(new SearchField(SearchFilter.POLICY_LABEL, 
"obj.policyLabel", DATA_TYPE.STRING,
-                                        SEARCH_TYPE.PARTIAL));
-                sortFields.add(new SortField(SearchFilter.POLICY_LABEL_ID, 
"obj.id", true, SORT_ORDER.ASC));
-        }
-
-        @Override
-        protected T mapViewToEntityBean(V viewBean, T t, int 
OPERATION_CONTEXT) {
-                // TODO Auto-generated method stub
-                return null;
-        }
-
-        @Override
-        protected V mapEntityToViewBean(V viewBean, T t) {
-                // TODO Auto-generated method stub
-                return null;
-        }
-
-        @Override
-        protected void validateForCreate(V vObj) {
-                // TODO Auto-generated method stub
-
-        }
-
-        @Override
-        protected void validateForUpdate(V vObj, T entityObj) {
-                // TODO Auto-generated method stub
-
-        }
+public class RangerPolicyLabelsService<T extends XXPolicyLabel, V extends 
RangerPolicy>
+               extends RangerBaseModelService<T, V> {
+
+       private static final Log LOG = LogFactory.getLog(ServiceDBStore.class);
+
+       @Autowired
+       RangerAuditFields<?> rangerAuditFields;
+
+       public RangerPolicyLabelsService() {
+               super();
+               searchFields.add(
+                               new SearchField(SearchFilter.POLICY_LABEL, 
"obj.policyLabel", DATA_TYPE.STRING, SEARCH_TYPE.PARTIAL));
+               sortFields.add(new SortField(SearchFilter.POLICY_LABEL_ID, 
"obj.id", true, SORT_ORDER.ASC));
+       }
+
+       @Override
+       protected T mapViewToEntityBean(V viewBean, T t, int OPERATION_CONTEXT) 
{
+               // TODO Auto-generated method stub
+               return null;
+       }
+
+       @Override
+       protected V mapEntityToViewBean(V viewBean, T t) {
+               // TODO Auto-generated method stub
+               return null;
+       }
+
+       @Override
+       protected void validateForCreate(V vObj) {
+               // TODO Auto-generated method stub
+
+       }
+
+       @Override
+       protected void validateForUpdate(V vObj, T entityObj) {
+               // TODO Auto-generated method stub
+
+       }
+
+       @Transactional(propagation = Propagation.REQUIRES_NEW)
+       public XXPolicyLabel createNewOrGetLabel(String policyLabel, XXPolicy 
xPolicy) {
+
+               if (LOG.isDebugEnabled()) {
+                       LOG.debug("==> 
RangerPolicyLabelService.createNewOrGetLabel()");
+               }
+
+               XXPolicyLabel xxPolicyLabel = 
daoMgr.getXXPolicyLabels().findByName(policyLabel);
+               if (xxPolicyLabel == null) {
+                       xxPolicyLabel = new XXPolicyLabel();
+                       if (StringUtils.isNotEmpty(policyLabel)) {
+                               xxPolicyLabel.setPolicyLabel(policyLabel);
+                               xxPolicyLabel = 
rangerAuditFields.populateAuditFieldsForCreate(xxPolicyLabel);
+                               xxPolicyLabel = 
daoMgr.getXXPolicyLabels().create(xxPolicyLabel);
+                       }
+               }
+
+               if (LOG.isDebugEnabled()) {
+                       LOG.debug("<== 
RangerPolicyLabelService.createNewOrGetLabel(), xxPolicyLabel = " + 
xxPolicyLabel);
+               }
+
+               return xxPolicyLabel;
+       }
+
 }

Reply via email to