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;
+ }
+
}