mirror of https://github.com/OpenIdentityPlatform/OpenDJ.git

Ludovic Poitou
01.59.2013 e0c5050174a92d35a4bd947515666e3b1bde252a
Fix for OPENDJ-1160 : Write operations to non-groups force groups to be reloaded.
The refreshToken was updated on each add/mod/delete regardless of the type of entry, causing intensive contention on group membership evaluation.
Changes include reduction of the critical section as well as moving the update of refreshToken only when groups are modified.
CR-2400, thanks to the nice reviewers.
1 files modified
42 ■■■■■ changed files
opendj-sdk/opends/src/server/org/opends/server/core/GroupManager.java 42 ●●●●● patch | view | raw | blame | history
opendj-sdk/opends/src/server/org/opends/server/core/GroupManager.java
@@ -124,7 +124,8 @@
  // A mapping between the DNs of all group entries and the corresponding
  // group instances.
  private DITCacheMap<Group> groupInstances;
  private DITCacheMap<Group>
      groupInstances;
  // Lock to protect internal data structures.
  private final ReentrantReadWriteLock lock;
@@ -767,16 +768,7 @@
        }
      }
    }
    lock.writeLock().lock();
    try
    {
      createAndRegisterGroup(entry);
      refreshToken++;
    }
    finally
    {
      lock.writeLock().unlock();
    }
    createAndRegisterGroup(entry);
  }
@@ -802,8 +794,10 @@
    lock.writeLock().lock();
    try
    {
      groupInstances.removeSubtree(entry.getDN(), null);
      refreshToken++;
      if (groupInstances.removeSubtree(entry.getDN(), null))
      {
        refreshToken++;
      }
    }
    finally
    {
@@ -834,6 +828,21 @@
      }
    }
    lock.readLock().lock();
    try
    {
      if (!groupInstances.containsKey(oldEntry.getDN()))
      {
        // If the modified entry is not in any group instance, it's probably
        // not a group, exit fast
        return;
      }
    }
    finally
    {
      lock.readLock().unlock();
    }
    lock.writeLock().lock();
    try
    {
@@ -845,7 +854,6 @@
          groupInstances.remove(oldEntry.getDN());
        }
        createAndRegisterGroup(newEntry);
        refreshToken++;
      }
    }
    finally
@@ -911,7 +919,10 @@
        group.setGroupDN(groupDN);
        groupInstances.put(groupDN, group);
      }
      refreshToken++;
      if (!groupSet.isEmpty())
      {
        refreshToken++;
      }
    }
    finally
    {
@@ -1078,6 +1089,7 @@
          try
          {
            groupInstances.put(entry.getDN(), groupInstance);
            refreshToken++;
          }
          finally
          {