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 2019/08/08 23:01:44 UTC
[ranger] branch master updated: RANGER-2530: Fixed memory leak
issue as well as modified code to re-use jersey client instance instead of
creating new one for every request
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 8323aaf RANGER-2530: Fixed memory leak issue as well as modified code to re-use jersey client instance instead of creating new one for every request
8323aaf is described below
commit 8323aaf62b76beb4dfcee1bbaaf1365cf9111b3e
Author: Sailaja Polavarapu <sp...@cloudera.com>
AuthorDate: Thu Aug 8 15:56:29 2019 -0700
RANGER-2530: Fixed memory leak issue as well as modified code to re-use jersey client instance instead of creating new one for every request
---
.../process/LdapPolicyMgrUserGroupBuilder.java | 18 +++++++-
.../ranger/unixusersync/model/XGroupInfo.java | 21 +++++++++-
.../ranger/unixusersync/model/XUserInfo.java | 21 ++++++++++
.../process/PolicyMgrUserGroupBuilder.java | 48 ++++++++++++++++++----
4 files changed, 97 insertions(+), 11 deletions(-)
diff --git a/ugsync/src/main/java/org/apache/ranger/ldapusersync/process/LdapPolicyMgrUserGroupBuilder.java b/ugsync/src/main/java/org/apache/ranger/ldapusersync/process/LdapPolicyMgrUserGroupBuilder.java
index d451d7a..224a600 100644
--- a/ugsync/src/main/java/org/apache/ranger/ldapusersync/process/LdapPolicyMgrUserGroupBuilder.java
+++ b/ugsync/src/main/java/org/apache/ranger/ldapusersync/process/LdapPolicyMgrUserGroupBuilder.java
@@ -130,6 +130,7 @@ private static final Logger LOG = Logger.getLogger(LdapPolicyMgrUserGroupBuilder
Map<String, String> userMap = new LinkedHashMap<String, String>();
Map<String, String> groupMap = new LinkedHashMap<String, String>();
private boolean isRangerCookieEnabled;
+ private volatile Client client;
static {
try {
@@ -1117,7 +1118,22 @@ private static final Logger LOG = Logger.getLogger(LdapPolicyMgrUserGroupBuilder
return response;
}
- private synchronized Client getClient() {
+ public Client getClient() {
+ // result saves on access time when client is built at the time of the call
+ Client result = client;
+ if(result == null) {
+ synchronized(this) {
+ result = client;
+ if(result == null) {
+ client = result = buildClient();
+ }
+ }
+ }
+
+ return result;
+ }
+
+ private Client buildClient() {
Client ret = null;
diff --git a/ugsync/src/main/java/org/apache/ranger/unixusersync/model/XGroupInfo.java b/ugsync/src/main/java/org/apache/ranger/unixusersync/model/XGroupInfo.java
index b9e7191..cbe0eb0 100644
--- a/ugsync/src/main/java/org/apache/ranger/unixusersync/model/XGroupInfo.java
+++ b/ugsync/src/main/java/org/apache/ranger/unixusersync/model/XGroupInfo.java
@@ -58,5 +58,24 @@ public class XGroupInfo {
this.groupSource = groupSource;
}
-
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ XGroupInfo groupInfo = (XGroupInfo) o;
+ if (name == null) {
+ if (groupInfo.name != null)
+ return false;
+ } else if (!name.equals(groupInfo.name))
+ return false;
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((name == null) ? 0 : name.hashCode());
+ return result;
+ }
}
diff --git a/ugsync/src/main/java/org/apache/ranger/unixusersync/model/XUserInfo.java b/ugsync/src/main/java/org/apache/ranger/unixusersync/model/XUserInfo.java
index 5b81437..e2f36b2 100644
--- a/ugsync/src/main/java/org/apache/ranger/unixusersync/model/XUserInfo.java
+++ b/ugsync/src/main/java/org/apache/ranger/unixusersync/model/XUserInfo.java
@@ -80,4 +80,25 @@ public class XUserInfo {
+ description + ", groupNameList=" + groupNameList
+ ", userRoleList=" + userRoleList + "]";
}
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ XUserInfo userInfo = (XUserInfo) o;
+ if (name == null) {
+ if (userInfo.name != null)
+ return false;
+ } else if (!name.equals(userInfo.name))
+ return false;
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((name == null) ? 0 : name.hashCode());
+ return result;
+ }
}
diff --git a/ugsync/src/main/java/org/apache/ranger/unixusersync/process/PolicyMgrUserGroupBuilder.java b/ugsync/src/main/java/org/apache/ranger/unixusersync/process/PolicyMgrUserGroupBuilder.java
index 24956e0..466c747 100644
--- a/ugsync/src/main/java/org/apache/ranger/unixusersync/process/PolicyMgrUserGroupBuilder.java
+++ b/ugsync/src/main/java/org/apache/ranger/unixusersync/process/PolicyMgrUserGroupBuilder.java
@@ -115,12 +115,12 @@ public class PolicyMgrUserGroupBuilder implements UserGroupSink {
private UserGroupSyncConfig config = UserGroupSyncConfig.getInstance();
private UserGroupInfo usergroupInfo = new UserGroupInfo();
- private List<XGroupInfo> xgroupList = new ArrayList<XGroupInfo>();
- private List<XUserInfo> xuserList = new ArrayList<XUserInfo>();
- private List<XUserGroupInfo> xusergroupList = new ArrayList<XUserGroupInfo>();
- private HashMap<String,XUserInfo> userId2XUserInfoMap = new HashMap<String,XUserInfo>();
- private HashMap<String,XUserInfo> userName2XUserInfoMap = new HashMap<String,XUserInfo>();
- private HashMap<String,XGroupInfo> groupName2XGroupInfoMap = new HashMap<String,XGroupInfo>();
+ private List<XGroupInfo> xgroupList;
+ private List<XUserInfo> xuserList;
+ private List<XUserGroupInfo> xusergroupList;
+ private HashMap<String,XUserInfo> userId2XUserInfoMap;
+ private HashMap<String,XUserInfo> userName2XUserInfoMap;
+ private HashMap<String,XGroupInfo> groupName2XGroupInfoMap;
private String keyStoreFile = null;
private String keyStoreFilepwd = null;
@@ -135,8 +135,8 @@ public class PolicyMgrUserGroupBuilder implements UserGroupSink {
String principal;
String keytab;
String nameRules;
- Map<String, String> userMap = new LinkedHashMap<String, String>();
- Map<String, String> groupMap = new LinkedHashMap<String, String>();
+ Map<String, String> userMap;
+ Map<String, String> groupMap;
private int noOfNewUsers;
private int noOfNewGroups;
private int noOfModifiedUsers;
@@ -147,6 +147,7 @@ public class PolicyMgrUserGroupBuilder implements UserGroupSink {
private HashSet<String> modifiedGroupList = new HashSet<String>();
private boolean isRangerCookieEnabled;
boolean isStartupFlag = false;
+ private volatile Client client;
static {
try {
@@ -164,6 +165,14 @@ public class PolicyMgrUserGroupBuilder implements UserGroupSink {
synchronized public void init() throws Throwable {
+ xgroupList = new ArrayList<XGroupInfo>();
+ xuserList = new ArrayList<XUserInfo>();
+ xusergroupList = new ArrayList<XUserGroupInfo>();
+ userId2XUserInfoMap = new HashMap<String,XUserInfo>();
+ userName2XUserInfoMap = new HashMap<String,XUserInfo>();
+ groupName2XGroupInfoMap = new HashMap<String,XGroupInfo>();
+ userMap = new LinkedHashMap<String, String>();
+ groupMap = new LinkedHashMap<String, String>();
recordsToPullPerCall = config.getMaxRecordsPerAPICall();
policyMgrBaseUrl = config.getPolicyManagerBaseURL();
isMockRun = config.isMockRunEnabled();
@@ -278,6 +287,10 @@ public class PolicyMgrUserGroupBuilder implements UserGroupSink {
if (userName != null) {
userName2XUserInfoMap.put(userName, aUserInfo);
}
+
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("PolicyMgrUserGroupBuilder:addUserToList() xuserList.size() = " + xuserList.size());
+ }
}
@@ -291,6 +304,9 @@ public class PolicyMgrUserGroupBuilder implements UserGroupSink {
groupName2XGroupInfoMap.put(aGroupInfo.getName(), aGroupInfo);
}
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("PolicyMgrUserGroupBuilder:addGroupToList() xgroupList.size() = " + xgroupList.size());
+ }
}
private void addUserGroupToList(XUserGroupInfo ugInfo) {
@@ -1366,8 +1382,22 @@ public class PolicyMgrUserGroupBuilder implements UserGroupSink {
return response;
}
+ public Client getClient() {
+ // result saves on access time when client is built at the time of the call
+ Client result = client;
+ if(result == null) {
+ synchronized(this) {
+ result = client;
+ if(result == null) {
+ client = result = buildClient();
+ }
+ }
+ }
+
+ return result;
+ }
- private synchronized Client getClient() {
+ private Client buildClient() {
Client ret = null;
if (policyMgrBaseUrl.startsWith("https://")) {