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 <[email protected]>
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.");
}