You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ranger.apache.org by sp...@apache.org on 2021/08/23 22:29:41 UTC

[ranger] branch master updated: RANGER-3374: Creating new DB transaction for add/update of user group mapping from Ranger Usersync

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

spolavarapu 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 f91d702  RANGER-3374: Creating new DB transaction for add/update of user group mapping from Ranger Usersync
f91d702 is described below

commit f91d70266332b0c4a7c5bfb55985c5b93c859cd9
Author: Sailaja Polavarapu <sp...@cloudera.com>
AuthorDate: Mon Aug 23 15:24:38 2021 -0700

    RANGER-3374: Creating new DB transaction for add/update of user group mapping from Ranger Usersync
---
 .../main/java/org/apache/ranger/biz/XUserMgr.java  | 13 +++-
 .../apache/ranger/service/XGroupUserService.java   | 74 ++++++++++++++--------
 2 files changed, 58 insertions(+), 29 deletions(-)

diff --git a/security-admin/src/main/java/org/apache/ranger/biz/XUserMgr.java b/security-admin/src/main/java/org/apache/ranger/biz/XUserMgr.java
index 7b29f3d..546345a 100755
--- a/security-admin/src/main/java/org/apache/ranger/biz/XUserMgr.java
+++ b/security-admin/src/main/java/org/apache/ranger/biz/XUserMgr.java
@@ -2689,6 +2689,7 @@ public class XUserMgr extends XUserMgrBase {
 			}
 			checkAccess(vXUser.getName());
 			TransactionTemplate txTemplate = new TransactionTemplate(txManager);
+			txTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
 			try {
 				txTemplate.execute(new TransactionCallback<Object>() {
 					@Override
@@ -2726,7 +2727,7 @@ public class XUserMgr extends XUserMgrBase {
 		}
 
 		TransactionTemplate txTemplate = new TransactionTemplate(txManager);
-
+		txTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
 		try {
 			txTemplate.execute(new TransactionCallback<Void>() {
 				@Override
@@ -2862,6 +2863,9 @@ public class XUserMgr extends XUserMgrBase {
 		}
 		Set<String> groupUsers = groupUserInfo.getAddUsers();
 		if (CollectionUtils.isNotEmpty(groupUsers)) {
+			if (logger.isDebugEnabled()) {
+				logger.debug("No. of new users in group" + groupName + " = " + groupUsers.size());
+			}
 			xGroupUserService.createOrUpdateXGroupUsers(groupName, groupUsers, usersFromDB);
 		}
 
@@ -2881,12 +2885,17 @@ public class XUserMgr extends XUserMgrBase {
 		}
 	}
 
-	@Transactional(readOnly = false, propagation = Propagation.REQUIRED)
 	public int createOrDeleteXGroupUserList(List<GroupUserInfo> groupUserInfoList) {
 		int updatedGroups = 0;
 		if (CollectionUtils.isNotEmpty(groupUserInfoList)) {
+			if (logger.isDebugEnabled()) {
+				logger.debug("No. of groups to be updated = " + groupUserInfoList.size());
+			}
 			Map<String, Long> usersFromDB = daoManager.getXXUser().getAllUserIds();
 			if (MapUtils.isNotEmpty(usersFromDB)) {
+				if (logger.isDebugEnabled()) {
+					logger.debug("No. of users in DB = " + usersFromDB.size());
+				}
 				for (GroupUserInfo groupUserInfo : groupUserInfoList) {
 					createOrDeleteXGroupUsers(groupUserInfo, usersFromDB);
 				}
diff --git a/security-admin/src/main/java/org/apache/ranger/service/XGroupUserService.java b/security-admin/src/main/java/org/apache/ranger/service/XGroupUserService.java
index 6c0289c..2b863b0 100644
--- a/security-admin/src/main/java/org/apache/ranger/service/XGroupUserService.java
+++ b/security-admin/src/main/java/org/apache/ranger/service/XGroupUserService.java
@@ -40,8 +40,14 @@ import org.apache.ranger.entity.XXUser;
 import org.apache.ranger.util.RangerEnumUtil;
 import org.apache.ranger.view.VXGroupUser;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Scope;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.PlatformTransactionManager;
+import org.springframework.transaction.TransactionDefinition;
+import org.springframework.transaction.TransactionStatus;
+import org.springframework.transaction.support.TransactionCallback;
+import org.springframework.transaction.support.TransactionTemplate;
 
 @Service
 @Scope("singleton")
@@ -52,6 +58,10 @@ public class XGroupUserService extends
 
 	@Autowired
 	RangerEnumUtil xaEnumUtil;
+
+	@Autowired
+	@Qualifier(value = "transactionManager")
+	PlatformTransactionManager txManager;
 	
 	static HashMap<String, VTrxLogAttr> trxLogAttrs = new HashMap<String, VTrxLogAttr>();
 	static {
@@ -118,36 +128,46 @@ public class XGroupUserService extends
 			return;
 		}
 		Map<String, XXGroupUser> groupUsers = daoManager.getXXGroupUser().findUsersByGroupName(groupName);
-		XXPortalUser xXPortalUser = daoManager.getXXPortalUser().getById(createdByUserId);
 		for (String username : users) {
 			if (usersFromDB.containsKey(username)) {
 				// Add or update group user mapping only if the user exists in x_user table.
-				XXGroupUser xxGroupUser = groupUsers.get(username);
-				boolean groupUserMappingExists = true;
-				if (xxGroupUser == null) {
-					xxGroupUser = new XXGroupUser();
-					groupUserMappingExists = false;
-				}
+				TransactionTemplate txTemplate = new TransactionTemplate(txManager);
+				txTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
+				try {
+					txTemplate.execute(new TransactionCallback<Object>() {
+						@Override
+						public Object doInTransaction(TransactionStatus status) {
+							XXGroupUser xxGroupUser = groupUsers.get(username);
+							boolean groupUserMappingExists = true;
+							if (xxGroupUser == null) {
+								xxGroupUser = new XXGroupUser();
+								groupUserMappingExists = false;
+							}
+							xxGroupUser.setAddedByUserId(createdByUserId);
+							xxGroupUser.setUpdatedByUserId(createdByUserId);
 
-				if (xXPortalUser != null) {
-					xxGroupUser.setAddedByUserId(createdByUserId);
-					xxGroupUser.setUpdatedByUserId(createdByUserId);
-				}
-
-				if (groupUserMappingExists) {
-					xxGroupUser = getDao().update(xxGroupUser);
-				} else {
-					VXGroupUser vXGroupUser = new VXGroupUser();
-					vXGroupUser.setUserId(usersFromDB.get(username));
-					vXGroupUser.setName(groupName);
-					vXGroupUser.setParentGroupId(xxGroup.getId());
-					xxGroupUser = mapViewToEntityBean(vXGroupUser, xxGroupUser, 0);
-					xxGroupUser = getDao().create(xxGroupUser);
-				}
-				VXGroupUser vXGroupUser = postCreate(xxGroupUser);
-				if (logger.isDebugEnabled()) {
-					logger.debug(String.format("createOrUpdateXGroupUsers(): Create or update group user mapping with groupname =  " + vXGroupUser.getName()
-							+ " username = %s userId = %d", username, vXGroupUser.getUserId()));
+							if (groupUserMappingExists) {
+								xxGroupUser = getDao().update(xxGroupUser);
+							} else {
+								VXGroupUser vXGroupUser = new VXGroupUser();
+								vXGroupUser.setUserId(usersFromDB.get(username));
+								vXGroupUser.setName(groupName);
+								vXGroupUser.setParentGroupId(xxGroup.getId());
+								xxGroupUser = mapViewToEntityBean(vXGroupUser, xxGroupUser, 0);
+								xxGroupUser = getDao().create(xxGroupUser);
+							}
+							VXGroupUser vXGroupUser = postCreate(xxGroupUser);
+							if (logger.isDebugEnabled()) {
+								logger.debug(String.format("createOrUpdateXGroupUsers(): Create or update group user mapping with groupname =  " + vXGroupUser.getName()
+										+ " username = %s userId = %d", username, vXGroupUser.getUserId()));
+							}
+							return null;
+						}
+					});
+				} catch (Throwable ex) {
+					logger.error("XGroupUserService.createOrUpdateXGroupUsers: Failed to update DB for group users: ", ex);
+					throw restErrorUtil.createRESTException("Failed to create or update group users ",
+							MessageEnums.ERROR_CREATING_OBJECT);
 				}
 			}
 		}
@@ -158,7 +178,7 @@ public class XGroupUserService extends
 		if (resource == null) {
 			// Returns code 400 with DATA_NOT_FOUND as the error message
 			throw restErrorUtil.createRESTException(getResourceName()
-					+ " not found", MessageEnums.DATA_NOT_FOUND, id, null,
+							+ " not found", MessageEnums.DATA_NOT_FOUND, id, null,
 					"preRead: " + id + " not found.");
 		}