You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@syncope.apache.org by il...@apache.org on 2023/12/10 14:05:58 UTC

(syncope) branch master updated: [SYNCOPE-1716] fixed membership hashmap multi-threaded problem with concurrent pull (#571)

This is an automated email from the ASF dual-hosted git repository.

ilgrosso pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/syncope.git


The following commit(s) were added to refs/heads/master by this push:
     new 920f51d5ec [SYNCOPE-1716] fixed membership hashmap multi-threaded problem with concurrent pull (#571)
920f51d5ec is described below

commit 920f51d5ecfa5b358f9fca91218d5ab5d5e00bfc
Author: flyue <17...@cumt.edu.cn>
AuthorDate: Sun Dec 10 22:05:54 2023 +0800

    [SYNCOPE-1716] fixed membership hashmap multi-threaded problem with concurrent pull (#571)
---
 .../java/pushpull/LDAPMembershipPullActions.java   | 23 ++++++++++------------
 .../pushpull/LDAPMembershipPullActionsTest.java    |  6 ++----
 2 files changed, 12 insertions(+), 17 deletions(-)

diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/LDAPMembershipPullActions.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/LDAPMembershipPullActions.java
index 4db705e3f4..509ab4c9f6 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/LDAPMembershipPullActions.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/LDAPMembershipPullActions.java
@@ -19,12 +19,13 @@
 package org.apache.syncope.core.provisioning.java.pushpull;
 
 import java.util.ArrayList;
-import java.util.HashMap;
+import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
 import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
 import org.apache.syncope.common.lib.request.AnyUR;
 import org.apache.syncope.common.lib.request.MembershipUR;
 import org.apache.syncope.common.lib.request.UserUR;
@@ -78,9 +79,9 @@ public class LDAPMembershipPullActions implements PullActions {
     @Autowired
     protected UserProvisioningManager userProvisioningManager;
 
-    protected final Map<String, Set<String>> membershipsBefore = new HashMap<>();
+    protected final Map<String, Set<String>> membershipsBefore = new ConcurrentHashMap<>();
 
-    protected final Map<String, Set<String>> membershipsAfter = new HashMap<>();
+    protected final Map<String, Set<String>> membershipsAfter = new ConcurrentHashMap<>();
 
     /**
      * Allows easy subclassing for the ConnId AD connector bundle.
@@ -153,11 +154,9 @@ public class LDAPMembershipPullActions implements PullActions {
         }
 
         groupDAO.findUMemberships(groupDAO.find(entity.getKey())).forEach(uMembership -> {
-            Set<String> memb = membershipsBefore.get(uMembership.getLeftEnd().getKey());
-            if (memb == null) {
-                memb = new HashSet<>();
-                membershipsBefore.put(uMembership.getLeftEnd().getKey(), memb);
-            }
+            Set<String> memb = membershipsBefore.computeIfAbsent(
+                uMembership.getLeftEnd().getKey(),
+                k -> Collections.synchronizedSet(new HashSet<>()));
             memb.add(entity.getKey());
         });
     }
@@ -192,11 +191,9 @@ public class LDAPMembershipPullActions implements PullActions {
                     profile.getTask().getResource(),
                     profile.getConnector());
             if (match.isPresent()) {
-                Set<String> memb = membershipsAfter.get(match.get().getAny().getKey());
-                if (memb == null) {
-                    memb = new HashSet<>();
-                    membershipsAfter.put(match.get().getAny().getKey(), memb);
-                }
+                Set<String> memb = membershipsAfter.computeIfAbsent(
+                    match.get().getAny().getKey(),
+                    k -> Collections.synchronizedSet(new HashSet<>()));
                 memb.add(entity.getKey());
             } else {
                 LOG.warn("Could not find matching user for {}", membValue);
diff --git a/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/pushpull/LDAPMembershipPullActionsTest.java b/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/pushpull/LDAPMembershipPullActionsTest.java
index 26339123e9..f89210118a 100644
--- a/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/pushpull/LDAPMembershipPullActionsTest.java
+++ b/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/pushpull/LDAPMembershipPullActionsTest.java
@@ -25,7 +25,6 @@ import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.Mockito.lenient;
 import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
 import java.util.HashMap;
@@ -98,7 +97,6 @@ public class LDAPMembershipPullActionsTest extends AbstractTest {
     @Mock
     private ProvisioningReport result;
 
-    @Mock
     private Map<String, Set<String>> membershipsAfter;
 
     @Mock
@@ -139,6 +137,7 @@ public class LDAPMembershipPullActionsTest extends AbstractTest {
 
         anyReq = new UserUR();
         membershipsBefore = new HashMap<>();
+        membershipsAfter = new HashMap<>();
         ReflectionTestUtils.setField(ldapMembershipPullActions, "membershipsBefore", membershipsBefore);
         ReflectionTestUtils.setField(ldapMembershipPullActions, "membershipsAfter", membershipsAfter);
 
@@ -208,8 +207,7 @@ public class LDAPMembershipPullActionsTest extends AbstractTest {
 
         ldapMembershipPullActions.after(profile, syncDelta, entity, result);
 
-        verify(membershipsAfter).get(anyString());
-        verify(membershipsAfter).put(anyString(), any());
+        assertEquals(1, membershipsAfter.get(user.getKey()).size());
         assertEquals(expected, attribute.getValue());
     }
 }