Skip to content

Commit 017c740

Browse files
ramackrimneethiraj
authored andcommitted
RANGER-3900: performance improvement in roles deletion
Signed-off-by: Madhan Neethiraj <[email protected]>
1 parent 9bd7609 commit 017c740

13 files changed

+150
-31
lines changed

security-admin/src/main/java/org/apache/ranger/biz/RoleRefUpdater.java

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -165,17 +165,15 @@ public Boolean cleanupRefTables(RangerRole rangerRole) {
165165
XXRoleRefGroupDao xRoleGroupDao = daoMgr.getXXRoleRefGroup();
166166
XXRoleRefRoleDao xRoleRoleDao = daoMgr.getXXRoleRefRole();
167167

168-
for (XXRoleRefUser xxRoleRefUser : xRoleUserDao.findByRoleId(roleId)) {
169-
xRoleUserDao.remove(xxRoleRefUser);
170-
}
168+
List<Long> xxRoleRefUserIds = xRoleUserDao.findIdsByRoleId(roleId);
169+
xRoleUserDao.deleteRoleRefUserByIds(xxRoleRefUserIds);
171170

172-
for (XXRoleRefGroup xxRoleRefGroup : xRoleGroupDao.findByRoleId(roleId)) {
173-
xRoleGroupDao.remove(xxRoleRefGroup);
174-
}
171+
List<Long> xxRoleRefGroupByIds = xRoleGroupDao.findIdsByRoleId(roleId);
172+
xRoleGroupDao.deleteRoleRefGroupByIds(xxRoleRefGroupByIds);
173+
174+
List<Long> xxRoleRefRoleIds = xRoleRoleDao.findIdsByRoleId(roleId);
175+
xRoleRoleDao.deleteRoleRefRoleByIds(xxRoleRefRoleIds);
175176

176-
for (XXRoleRefRole xxRoleRefRole : xRoleRoleDao.findByRoleId(roleId)) {
177-
xRoleRoleDao.remove(xxRoleRefRole);
178-
}
179177
return true;
180178
}
181179

security-admin/src/main/java/org/apache/ranger/common/db/BaseDao.java

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import javax.persistence.Table;
3535
import javax.persistence.TypedQuery;
3636

37+
import org.apache.ranger.authorization.hadoop.config.RangerAdminConfig;
3738
import org.apache.ranger.biz.RangerBizUtil;
3839
import org.apache.ranger.common.AppConstants;
3940
import org.apache.ranger.db.RangerDaoManager;
@@ -43,6 +44,24 @@
4344

4445
public abstract class BaseDao<T> {
4546
private static final Logger logger = LoggerFactory.getLogger(BaseDao.class);
47+
private static final String PROP_BATCH_DELETE_BATCH_SIZE = "ranger.admin.dao.batch.delete.batch.size";
48+
private static final int DEFAULT_BATCH_DELETE_BATCH_SIZE = 1000;
49+
private static int BATCH_DELETE_BATCH_SIZE;
50+
51+
static {
52+
try {
53+
BATCH_DELETE_BATCH_SIZE = RangerAdminConfig.getInstance().getInt(PROP_BATCH_DELETE_BATCH_SIZE, DEFAULT_BATCH_DELETE_BATCH_SIZE);
54+
55+
if (BATCH_DELETE_BATCH_SIZE > DEFAULT_BATCH_DELETE_BATCH_SIZE) {
56+
logger.warn("Configuration {}={}, which is larger than default value {}", PROP_BATCH_DELETE_BATCH_SIZE, BATCH_DELETE_BATCH_SIZE, DEFAULT_BATCH_DELETE_BATCH_SIZE);
57+
}
58+
} catch(Exception e) {
59+
// When we get the Number format exception due to the invalid value entered into the config file.
60+
BATCH_DELETE_BATCH_SIZE = DEFAULT_BATCH_DELETE_BATCH_SIZE;
61+
}
62+
63+
logger.info(PROP_BATCH_DELETE_BATCH_SIZE + "=" + BATCH_DELETE_BATCH_SIZE);
64+
}
4665

4766
protected RangerDaoManager daoManager;
4867

@@ -111,6 +130,32 @@ public List<T> batchCreate(List<T> obj) {
111130
return ret;
112131
}
113132

133+
public void batchDeleteByIds(String namedQuery, List<Long> ids, String paramName) {
134+
if (BATCH_DELETE_BATCH_SIZE <= 0) {
135+
getEntityManager()
136+
.createNamedQuery(namedQuery, tClass)
137+
.setParameter(paramName, ids).executeUpdate();
138+
} else {
139+
for (int fromIndex = 0; fromIndex < ids.size(); fromIndex += BATCH_DELETE_BATCH_SIZE) {
140+
int toIndex = fromIndex + BATCH_DELETE_BATCH_SIZE;
141+
142+
if (toIndex > ids.size()) {
143+
toIndex = ids.size();
144+
}
145+
146+
if (logger.isDebugEnabled()) {
147+
logger.debug("batchDeleteByIds({}, idCount={}): deleting fromIndex={}, toIndex={}", namedQuery, ids.size(), fromIndex, toIndex);
148+
}
149+
150+
List<Long> subList = ids.subList(fromIndex, toIndex);
151+
152+
getEntityManager()
153+
.createNamedQuery(namedQuery, tClass)
154+
.setParameter(paramName, subList).executeUpdate();
155+
}
156+
}
157+
}
158+
114159
public T update(T obj) {
115160
em.merge(obj);
116161
if (!RangerBizUtil.isBulkMode()) {

security-admin/src/main/java/org/apache/ranger/db/XXPolicyRefAccessTypeDao.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -114,8 +114,6 @@ public void deleteByPolicyId(Long policyId) {
114114
return;
115115
}
116116

117-
getEntityManager()
118-
.createNamedQuery("XXPolicyRefAccessType.deleteByIds", tClass)
119-
.setParameter("ids", ids).executeUpdate();
117+
batchDeleteByIds("XXPolicyRefAccessType.deleteByIds", ids, "ids");
120118
}
121119
}

security-admin/src/main/java/org/apache/ranger/db/XXPolicyRefConditionDao.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -125,8 +125,6 @@ public void deleteByPolicyId(Long policyId) {
125125
return;
126126
}
127127

128-
getEntityManager()
129-
.createNamedQuery("XXPolicyRefCondition.deleteByIds", tClass)
130-
.setParameter("ids", ids).executeUpdate();
128+
batchDeleteByIds("XXPolicyRefCondition.deleteByIds", ids, "ids");
131129
}
132130
}

security-admin/src/main/java/org/apache/ranger/db/XXPolicyRefDataMaskTypeDao.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -101,8 +101,6 @@ public void deleteByPolicyId(Long policyId) {
101101
return;
102102
}
103103

104-
getEntityManager()
105-
.createNamedQuery("XXPolicyRefDataMaskType.deleteByIds", tClass)
106-
.setParameter("ids", ids).executeUpdate();
104+
batchDeleteByIds("XXPolicyRefDataMaskType.deleteByIds", ids, "ids");
107105
}
108106
}

security-admin/src/main/java/org/apache/ranger/db/XXPolicyRefGroupDao.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -113,8 +113,6 @@ public void deleteByPolicyId(Long policyId) {
113113
return;
114114
}
115115

116-
getEntityManager()
117-
.createNamedQuery("XXPolicyRefGroup.deleteByIds", tClass)
118-
.setParameter("ids", ids).executeUpdate();
116+
batchDeleteByIds("XXPolicyRefGroup.deleteByIds", ids, "ids");
119117
}
120118
}

security-admin/src/main/java/org/apache/ranger/db/XXPolicyRefResourceDao.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -79,10 +79,7 @@ public void deleteByPolicyId(Long policyId) {
7979
return;
8080
}
8181

82-
getEntityManager()
83-
.createNamedQuery("XXPolicyRefResource.deleteByIds", tClass)
84-
.setParameter("ids", ids).executeUpdate();
85-
82+
batchDeleteByIds("XXPolicyRefResource.deleteByIds", ids, "ids");
8683
}
8784

8885
@SuppressWarnings("unchecked")

security-admin/src/main/java/org/apache/ranger/db/XXPolicyRefRoleDao.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -125,9 +125,7 @@ public void deleteByPolicyId(Long policyId) {
125125
return;
126126
}
127127

128-
getEntityManager()
129-
.createNamedQuery("XXPolicyRefRole.deleteByIds", tClass)
130-
.setParameter("ids", ids).executeUpdate();
128+
batchDeleteByIds("XXPolicyRefRole.deleteByIds", ids, "ids");
131129
}
132130
}
133131

security-admin/src/main/java/org/apache/ranger/db/XXPolicyRefUserDao.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -125,8 +125,6 @@ public void deleteByPolicyId(Long policyId) {
125125
return;
126126
}
127127

128-
getEntityManager()
129-
.createNamedQuery("XXPolicyRefUser.deleteByIds", tClass)
130-
.setParameter("ids", ids).executeUpdate();
128+
batchDeleteByIds("XXPolicyRefUser.deleteByIds", ids, "ids");
131129
}
132130
}

security-admin/src/main/java/org/apache/ranger/db/XXRoleRefGroupDao.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424

2525
import javax.persistence.NoResultException;
2626

27+
import org.apache.commons.collections.CollectionUtils;
2728
import org.apache.ranger.common.db.BaseDao;
2829
import org.apache.ranger.entity.XXRoleRefGroup;
2930
import org.springframework.stereotype.Service;
@@ -61,6 +62,22 @@ public List<XXRoleRefGroup> findByGroupId(Long groupId) {
6162
}
6263
}
6364

65+
public List<Long> findIdsByRoleId(Long roleId) {
66+
List<Long> ret = Collections.EMPTY_LIST;
67+
68+
if (roleId != null) {
69+
try {
70+
ret = getEntityManager()
71+
.createNamedQuery("XXRoleRefGroup.findIdsByRoleId", Long.class)
72+
.setParameter("roleId", roleId).getResultList();
73+
} catch (NoResultException e) {
74+
ret = Collections.EMPTY_LIST;
75+
}
76+
}
77+
78+
return ret;
79+
}
80+
6481
public List<XXRoleRefGroup> findByGroupName(String groupName) {
6582
if (groupName == null) {
6683
return Collections.EMPTY_LIST;
@@ -72,4 +89,11 @@ public List<XXRoleRefGroup> findByGroupName(String groupName) {
7289
return Collections.EMPTY_LIST;
7390
}
7491
}
92+
93+
public void deleteRoleRefGroupByIds(List<Long> ids) {
94+
if (CollectionUtils.isNotEmpty(ids)) {
95+
batchDeleteByIds("XXRoleRefGroup.deleteRoleRefGroupByIds", ids, "ids");
96+
}
97+
}
98+
7599
}

0 commit comments

Comments
 (0)