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

abhay 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 392629c  RANGER-3284: Simplify processing of tasks scheduled to 
execute after current transaction is completed
392629c is described below

commit 392629c8fbbdb592b212726c5d8305444b6d47ce
Author: Abhay Kulkarni <[email protected]>
AuthorDate: Thu May 13 18:11:23 2021 -0700

    RANGER-3284: Simplify processing of tasks scheduled to execute after 
current transaction is completed
---
 .../org/apache/ranger/biz/PolicyRefUpdater.java    |  99 ++++++------------
 .../java/org/apache/ranger/biz/RoleRefUpdater.java | 116 ++++++++-------------
 .../java/org/apache/ranger/rest/ServiceREST.java   |  55 ++++------
 3 files changed, 99 insertions(+), 171 deletions(-)

diff --git 
a/security-admin/src/main/java/org/apache/ranger/biz/PolicyRefUpdater.java 
b/security-admin/src/main/java/org/apache/ranger/biz/PolicyRefUpdater.java
index 115e556..4452676 100644
--- a/security-admin/src/main/java/org/apache/ranger/biz/PolicyRefUpdater.java
+++ b/security-admin/src/main/java/org/apache/ranger/biz/PolicyRefUpdater.java
@@ -63,6 +63,7 @@ import org.apache.ranger.service.XGroupService;
 import org.apache.ranger.service.XUserService;
 import org.apache.ranger.view.VXGroup;
 import org.apache.ranger.view.VXResponse;
+import org.apache.ranger.view.VXUser;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
@@ -305,19 +306,13 @@ public class PolicyRefUpdater {
        private void createUserForPolicy(String user, XXPolicy xPolicy) {
                LOG.warn("User specified in policy does not exist in ranger 
admin, creating new user, User = " + user);
                final PolicyUserCreateContext policyUserCreateContext = new 
PolicyUserCreateContext(user, xPolicy);
-               Runnable CreateAndAssociateUser = new Runnable () {
+               Runnable createAndAssociateUser = new Runnable () {
                        @Override
                        public void run() {
-                               Runnable realTask = new Runnable () {
-                                       @Override
-                                       public void run() {
-                                               
doCreateAndAssociatePolicyUser(policyUserCreateContext);
-                                       }
-                               };
-                               
transactionService.scheduleToExecuteInOwnTransaction(realTask, 0L);
+                               
doCreateAndAssociatePolicyUser(policyUserCreateContext);
                        }
                };
-               
rangerTransactionSynchronizationAdapter.executeOnTransactionCommit(CreateAndAssociateUser);
+               
rangerTransactionSynchronizationAdapter.executeOnTransactionCommit(createAndAssociateUser);
        }
 
        private void createGroupForPolicy(String group, XXPolicy xPolicy) {
@@ -330,13 +325,7 @@ public class PolicyRefUpdater {
                Runnable createAndAssociatePolicyGroup = new Runnable() {
                        @Override
                        public void run() {
-                               Runnable realTask = new Runnable() {
-                                       @Override
-                                       public void run() {
-                                               
doCreateAndAssociatePolicyGroup(policyGroupCreateContext);
-                                       }
-                               };
-                               
transactionService.scheduleToExecuteInOwnTransaction(realTask, 0L);
+                               
doCreateAndAssociatePolicyGroup(policyGroupCreateContext);
                        }
                };
                
rangerTransactionSynchronizationAdapter.executeOnTransactionCommit(createAndAssociatePolicyGroup);
@@ -462,40 +451,30 @@ public class PolicyRefUpdater {
                if (xGroup != null) {
                        groupPolicyAssociation(context.xPolicy, xGroup.getId(), 
context.group.getName());
                } else {
-                       try {
-                               // Create group
-                               VXGroup vXGroup = 
xGroupService.createXGroupWithOutLogin(context.group);
-                               if (null != vXGroup) {
+                       // Create group
+                       VXGroup vXGroup = 
xGroupService.createXGroupWithOutLogin(context.group);
+                       if (vXGroup != null) {
+                               try {
                                        List<XXTrxLog> trxLogList = 
xGroupService.getTransactionLog(vXGroup, "create");
-                                       for(XXTrxLog xTrxLog : trxLogList) {
+                                       for (XXTrxLog xTrxLog : trxLogList) {
                                                
xTrxLog.setAddedByUserId(context.xPolicy.getAddedByUserId());
                                                
xTrxLog.setUpdatedByUserId(context.xPolicy.getAddedByUserId());
                                        }
                                        rangerBizUtil.createTrxLog(trxLogList);
+                               } catch (Throwable t) {
+                                       // Ignore
+                               }
+                               doAssociatePolicyGroup(context);
+                       } else {
+                               if (LOG.isDebugEnabled()) {
+                                       LOG.debug("Group:[" + context.group + 
"] creation failed!");
+                                       throw new RuntimeException("Group:[" + 
context.group + "] creation failed!");
                                }
-                       } catch (Exception exception) {
-                               LOG.error("Failed to create Group or to 
associate group and policy, PolicyGroupContext:[" + context + "]",
-                                               exception);
-                       } finally {
-                               // This transaction may still fail at commit 
time because another transaction
-                               // has already created the group
-                               // So, associate the group to policy in a 
different transaction
-                               Runnable associatePolicyGroup = new Runnable() {
-                                       @Override
-                                       public void run() {
-                                               Runnable realTask = new 
Runnable() {
-                                                       @Override
-                                                       public void run() {
-                                                               
doAssociatePolicyGroup(context);
-                                                       }
-                                               };
-                                               
transactionService.scheduleToExecuteInOwnTransaction(realTask, 0L);
-                                       }
-                               };
-                               
rangerTransactionSynchronizationAdapter.executeOnTransactionCompletion(associatePolicyGroup);
-
                        }
                }
+               if (LOG.isDebugEnabled()) {
+                       LOG.debug("<=== 
PolicyRefUpdater.doCreateAndAssociatePolicyGroup()");
+               }
        }
 
        private static final class PolicyUserCreateContext {
@@ -555,31 +534,19 @@ public class PolicyRefUpdater {
                if (xUser != null) {
                        userPolicyAssociation(context.xPolicy, xUser.getId(), 
context.userName);
                } else {
-                       try {
-                               // Create External user
-                               
xUserMgr.createServiceConfigUser(context.userName);
-                       } catch (Exception exception) {
-                               LOG.error("Failed to create User or to 
associate user and policy, PolicyUserContext:[" + context + "]",
-                                               exception);
-                       } finally {
-                               // This transaction may still fail at commit 
time because another transaction
-                               // has already created the user
-                               // So, associate the user to policy in a 
different transaction
-                               Runnable associatePolicyUser = new Runnable() {
-                                       @Override
-                                       public void run() {
-                                               Runnable realTask = new 
Runnable() {
-                                                       @Override
-                                                       public void run() {
-                                                               
doAssociatePolicyUser(context);
-                                                       }
-                                               };
-                                               
transactionService.scheduleToExecuteInOwnTransaction(realTask, 0L);
-                                       }
-                               };
-                               
rangerTransactionSynchronizationAdapter.executeOnTransactionCompletion(associatePolicyUser);
+                       // Create External user
+                       VXUser vXUser = 
xUserMgr.createServiceConfigUser(context.userName);
+                       if (vXUser != null) {
+                               doAssociatePolicyUser(context);
+                       } else {
+                               if (LOG.isDebugEnabled()) {
+                                       LOG.debug("serviceConfigUser:[" + 
context.userName + "] creation failed");
+                                       throw new 
RuntimeException("serviceConfigUser:[" + context.userName + "] creation 
failed");
+                               }
                        }
                }
-
+               if (LOG.isDebugEnabled()) {
+                       LOG.debug("<=== 
PolicyRefUpdater.doCreateAndAssociatePolicyUser()");
+               }
        }
 }
diff --git 
a/security-admin/src/main/java/org/apache/ranger/biz/RoleRefUpdater.java 
b/security-admin/src/main/java/org/apache/ranger/biz/RoleRefUpdater.java
index 10a7625..4c50d81 100644
--- a/security-admin/src/main/java/org/apache/ranger/biz/RoleRefUpdater.java
+++ b/security-admin/src/main/java/org/apache/ranger/biz/RoleRefUpdater.java
@@ -48,6 +48,7 @@ import org.apache.ranger.service.RangerTransactionService;
 import org.apache.ranger.service.XGroupService;
 import org.apache.ranger.service.XUserService;
 import org.apache.ranger.view.VXGroup;
+import org.apache.ranger.view.VXUser;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
@@ -118,21 +119,15 @@ public class RoleRefUpdater {
                                        if (createNonExistUserGroup && 
xaBizUtil.checkAdminAccess()) {
                                                LOG.warn("User specified in 
role does not exist in ranger admin, creating new user, User = "
                                                                + roleUser);
-                                               // Schedule another transaction 
and let this transaction complete (and commit) successfully!
+
                                                final RoleUserCreateContext 
roleUserCreateContext = new RoleUserCreateContext(roleUser, roleId);
-                                               Runnable CreateAndAssociateUser 
= new Runnable () {
+                                               Runnable createAndAssociateUser 
= new Runnable() {
                                                        @Override
                                                        public void run() {
-                                                               Runnable 
realTask = new Runnable () {
-                                                                       
@Override
-                                                                       public 
void run() {
-                                                                               
doCreateAndAssociateRoleUser(roleUserCreateContext);
-                                                                       }
-                                                               };
-                                                               
transactionService.scheduleToExecuteInOwnTransaction(realTask, 0L);
+                                                               
doCreateAndAssociateRoleUser(roleUserCreateContext);
                                                        }
-                        };
-                                               
rangerTransactionSynchronizationAdapter.executeOnTransactionCommit(CreateAndAssociateUser);
+                                               };
+                                               
rangerTransactionSynchronizationAdapter.executeOnTransactionCommit(createAndAssociateUser);
 
                                        } else {
                                                throw 
restErrorUtil.createRESTException("user with name: " + roleUser + " does not 
exist ",
@@ -165,21 +160,15 @@ public class RoleRefUpdater {
                                                vxGroupNew.setName(roleGroup);
                                                
vxGroupNew.setDescription(roleGroup);
                                                
vxGroupNew.setGroupSource(RangerCommonEnums.GROUP_EXTERNAL);
-                                               // Schedule another transaction 
and let this transaction complete (and commit) successfully!
+
                                                final RoleGroupCreateContext 
roleGroupCreateContext = new RoleGroupCreateContext(vxGroupNew, roleId);
 
                                                Runnable 
createAndAssociateRoleGroup = new Runnable() {
-                            @Override
-                            public void run() {
-                                Runnable realTask = new Runnable() {
-                                    @Override
-                                    public void run() {
-                                        
doCreateAndAssociateRoleGroup(roleGroupCreateContext);
-                                    }
-                                };
-                                
transactionService.scheduleToExecuteInOwnTransaction(realTask, 0L);
-                            }
-                        };
+                                                       @Override
+                                                       public void run() {
+                                                               
doCreateAndAssociateRoleGroup(roleGroupCreateContext);
+                                                       }
+                                               };
                                                
rangerTransactionSynchronizationAdapter.executeOnTransactionCommit(createAndAssociateRoleGroup);
 
                                        } else {
@@ -284,35 +273,26 @@ public class RoleRefUpdater {
                if (xGroup != null) {
                        groupRoleAssociation(context.roleId, xGroup.getId(), 
context.group.getName());
                } else {
-                       try {
-                               // Create group
-                               VXGroup vXGroup = 
xGroupService.createXGroupWithOutLogin(context.group);
-                               if (null != vXGroup) {
+                       // Create group
+                       VXGroup vXGroup = 
xGroupService.createXGroupWithOutLogin(context.group);
+                       if (null != vXGroup) {
+                               try {
                                        List<XXTrxLog> trxLogList = 
xGroupService.getTransactionLog(vXGroup, "create");
                                        xaBizUtil.createTrxLog(trxLogList);
+                               } catch (Throwable t) {
+                                       // Ignore
+                               }
+                               doAssociateRoleGroup(context);
+                       } else {
+                               if (LOG.isDebugEnabled()) {
+                                       LOG.debug("Group:[" + context.group + 
"] creation failed!");
+                                       throw new RuntimeException("Group:[" + 
context.group + "] creation failed!");
                                }
-                       } catch (Exception exception) {
-                               LOG.error("Failed to create Group or to 
associate group and role, RoleGroupContext:[" + context + "]",
-                                               exception);
-                       } finally {
-                               // This transaction may still fail at commit 
time because another transaction
-                               // has already created the group
-                               // So, associate the group to role in a 
different transaction
-                               Runnable associateRoleGroup = new Runnable() {
-                    @Override
-                                       public void run() {
-                                               Runnable realTask = new 
Runnable() {
-                                                       @Override
-                                                       public void run() {
-                                                               
doAssociateRoleGroup(context);
-                                                       }
-                                               };
-                                               
transactionService.scheduleToExecuteInOwnTransaction(realTask, 0L);
-                                       }
-                };
-                               
rangerTransactionSynchronizationAdapter.executeOnTransactionCompletion(associateRoleGroup);
                        }
                }
+               if (LOG.isDebugEnabled()) {
+                       LOG.debug("<=== doCreateAndAssociateRoleGroup()");
+               }
        }
 
        void doAssociateRoleGroup(final RoleGroupCreateContext context) {
@@ -330,6 +310,9 @@ public class RoleRefUpdater {
                                LOG.error("Failed to associate group and role, 
RoleGroupContext:[" + context + "]", exception);
                        }
                }
+               if(LOG.isDebugEnabled()) {
+                       LOG.debug("<=== doAssociateRoleGroup()");
+               }
        }
 
        private static final class RoleUserCreateContext {
@@ -371,32 +354,20 @@ public class RoleRefUpdater {
                if (xUser != null) {
                        userRoleAssociation(context.roleId, xUser.getId(), 
context.userName);
                } else {
-                       try {
-                               // Create External user
-                               
xUserMgr.createServiceConfigUser(context.userName);
-                       } catch (Exception exception) {
-                               LOG.error("Failed to create User or to 
associate user and role, RoleUserContext:[" + context + "]",
-                                               exception);
-                       } finally {
-                               // This transaction may still fail at commit 
time because another transaction
-                               // has already created the user
-                               // So, associate the user to role in a 
different transaction
-                               Runnable associateRoleUser = new Runnable() {
-                                       @Override
-                                       public void run() {
-                                               Runnable realTask = new 
Runnable() {
-                                                       @Override
-                                                       public void run() {
-                                                               
doAssociateRoleUser(context);
-                                                       }
-                                               };
-                                               
transactionService.scheduleToExecuteInOwnTransaction(realTask, 0L);
-                                       }
-                };
-                               
rangerTransactionSynchronizationAdapter.executeOnTransactionCompletion(associateRoleUser);
+                       // Create External user
+                       VXUser vXUser = 
xUserMgr.createServiceConfigUser(context.userName);
+                       if (vXUser != null) {
+                               doAssociateRoleUser(context);
+                       } else {
+                               if (LOG.isDebugEnabled()) {
+                                       LOG.debug("ServiceConfigUser:[" + 
context.userName + "] creation failed!");
+                               }
+                               throw new 
RuntimeException("ServiceConfigUser:[" + context.userName + "] creation 
failed!");
                        }
                }
-
+               if (LOG.isDebugEnabled()) {
+                       LOG.debug("<=== doCreateAndAssociateRoleUser()");
+               }
        }
 
        void doAssociateRoleUser(final RoleUserCreateContext context) {
@@ -414,6 +385,9 @@ public class RoleRefUpdater {
                                LOG.error("Failed to associate user and role, 
RoleUserContext:[" + context + "]", exception);
                        }
                }
+               if(LOG.isDebugEnabled()) {
+                       LOG.debug("<=== doAssociateRoleUser()");
+               }
        }
 
 }
diff --git 
a/security-admin/src/main/java/org/apache/ranger/rest/ServiceREST.java 
b/security-admin/src/main/java/org/apache/ranger/rest/ServiceREST.java
index dd58e05..2369f41 100644
--- a/security-admin/src/main/java/org/apache/ranger/rest/ServiceREST.java
+++ b/security-admin/src/main/java/org/apache/ranger/rest/ServiceREST.java
@@ -760,7 +760,7 @@ public class ServiceREST {
                                if (LOG.isDebugEnabled()) {
                                        LOG.debug("Tag service may need to be 
created and linked with this service:[" + service.getName() + "]");
                                }
-                               scheduleCreateOrGetTagService(service);
+                               createOrGetTagService(service);
                        }
 
                        ret = svcStore.createService(service);
@@ -3934,9 +3934,9 @@ public class ServiceREST {
                }
        }
 
-       private void scheduleCreateOrGetTagService(RangerService 
resourceService) {
+       private void createOrGetTagService(RangerService resourceService) {
                if (LOG.isDebugEnabled()) {
-                       LOG.debug("==> 
scheduleCreateOrGetTagService(resourceService=" + resourceService.getName() + 
")");
+                       LOG.debug("==> createOrGetTagService(resourceService=" 
+ resourceService.getName() + ")");
                }
                final boolean isAutoCreateTagService = 
config.getBoolean("ranger.tagservice.auto.create", true);
 
@@ -3968,13 +3968,7 @@ public class ServiceREST {
                                        Runnable createAndLinkTagServiceTask = 
new Runnable() {
                                                @Override
                                                public void run() {
-                                                       Runnable realTask = new 
Runnable() {
-                                                               @Override
-                                                               public void 
run() {
-                                                                       
doCreateAndLinkTagService(context);
-                                                               }
-                                                       };
-                                                       
transactionService.scheduleToExecuteInOwnTransaction(realTask, 0L);
+                                                       
doCreateAndLinkTagService(context);
                                                }
                                        };
 
@@ -3986,7 +3980,7 @@ public class ServiceREST {
                        }
                }
                if (LOG.isDebugEnabled()) {
-                       LOG.debug("<== 
scheduleCreateOrGetTagService(resourceService=" + resourceService.getName() + 
")");
+                       LOG.debug("<== createOrGetTagService(resourceService=" 
+ resourceService.getName() + ")");
                }
        }
 
@@ -4031,39 +4025,32 @@ public class ServiceREST {
                }
 
                if (resourceService != null) {
+                       try {
+                               String tagServiceName = context.tagServiceName;
 
-                       RangerService tagService = new RangerService();
+                               RangerService tagService = 
svcStore.getServiceByName(tagServiceName);
 
-                       tagService.setName(context.tagServiceName);
-                       tagService.setDisplayName(context.tagServiceName);//set 
DEFAULT display name
-                       
tagService.setType(EmbeddedServiceDefsUtil.EMBEDDED_SERVICEDEF_TAG_NAME);
+                               if (tagService == null) {
+                                       tagService = new RangerService();
 
-                       LOG.info("creating tag-service [" + 
context.tagServiceName + "]");
+                                       
tagService.setName(context.tagServiceName);
+                                       
tagService.setDisplayName(context.tagServiceName);//set DEFAULT display name
+                                       
tagService.setType(EmbeddedServiceDefsUtil.EMBEDDED_SERVICEDEF_TAG_NAME);
 
-                       RangerService service;
+                                       LOG.info("creating tag-service [" + 
context.tagServiceName + "]");
 
-                       try {
-                               service = svcStore.createService(tagService);
-                               LOG.info("Created tag-service:[" + 
service.getName() + "]");
+                                       svcStore.createService(tagService);
+                               }
                        } catch (Exception e) {
-                               LOG.info("Failed to create tag-service " + 
context.tagServiceName, e);
+                               throw new RuntimeException(e);
                        }
 
                        if (context.isAutoLinkTagService) {
-                               Runnable linkTagServiceTask = new Runnable() {
-                                       @Override
-                                       public void run() {
-                                               Runnable realTask = new 
Runnable() {
-                                                       @Override
-                                                       public void run() {
-                                                               
doLinkTagService(context);
-                                                       }
-                                               };
-                                               
transactionService.scheduleToExecuteInOwnTransaction(realTask, 0L);
-                                       }
-                               };
-                               
rangerTransactionSynchronizationAdapter.executeOnTransactionCompletion(linkTagServiceTask);
+                               doLinkTagService(context);
                        }
+
+               } else {
+                       LOG.info("Resource service :[" + 
context.resourceServiceName + "] not found! Returning without linking tag 
service!!");
                }
 
                if (LOG.isDebugEnabled()) {

Reply via email to