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 <[email protected]>
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://";)) {

Reply via email to