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://")) {