This is an automated email from the ASF dual-hosted git repository.
remm pushed a commit to branch 10.0.x
in repository https://gitbox.apache.org/repos/asf/tomcat.git
The following commit(s) were added to refs/heads/10.0.x by this push:
new 2fe9eb5 Avoid synchronization on roles verification
2fe9eb5 is described below
commit 2fe9eb5ce61b3153ca13d32d9b000db8322d8ffd
Author: remm <[email protected]>
AuthorDate: Fri Jun 4 10:08:20 2021 +0200
Avoid synchronization on roles verification
For the memory UserDatabase. The amount of synchronization blocks needed
to browse through groups and check roles looked excessive.
---
java/org/apache/catalina/users/MemoryGroup.java | 25 +++-------
java/org/apache/catalina/users/MemoryUser.java | 62 ++++++-------------------
webapps/docs/changelog.xml | 4 ++
3 files changed, 24 insertions(+), 67 deletions(-)
diff --git a/java/org/apache/catalina/users/MemoryGroup.java
b/java/org/apache/catalina/users/MemoryGroup.java
index 93dce18..d348693 100644
--- a/java/org/apache/catalina/users/MemoryGroup.java
+++ b/java/org/apache/catalina/users/MemoryGroup.java
@@ -20,6 +20,7 @@ package org.apache.catalina.users;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
import org.apache.catalina.Role;
import org.apache.catalina.User;
@@ -71,7 +72,7 @@ public class MemoryGroup extends AbstractGroup {
/**
* The set of {@link Role}s associated with this group.
*/
- protected final ArrayList<Role> roles = new ArrayList<>();
+ protected final CopyOnWriteArrayList<Role> roles = new
CopyOnWriteArrayList<>();
// ------------------------------------------------------------- Properties
@@ -82,9 +83,7 @@ public class MemoryGroup extends AbstractGroup {
*/
@Override
public Iterator<Role> getRoles() {
- synchronized (roles) {
- return roles.iterator();
- }
+ return roles.iterator();
}
@@ -124,11 +123,7 @@ public class MemoryGroup extends AbstractGroup {
*/
@Override
public void addRole(Role role) {
- synchronized (roles) {
- if (!roles.contains(role)) {
- roles.add(role);
- }
- }
+ roles.addIfAbsent(role);
}
@@ -139,9 +134,7 @@ public class MemoryGroup extends AbstractGroup {
*/
@Override
public boolean isInRole(Role role) {
- synchronized (roles) {
- return roles.contains(role);
- }
+ return roles.contains(role);
}
@@ -152,9 +145,7 @@ public class MemoryGroup extends AbstractGroup {
*/
@Override
public void removeRole(Role role) {
- synchronized (roles) {
- roles.remove(role);
- }
+ roles.remove(role);
}
@@ -163,9 +154,7 @@ public class MemoryGroup extends AbstractGroup {
*/
@Override
public void removeRoles() {
- synchronized (roles) {
- roles.clear();
- }
+ roles.clear();
}
diff --git a/java/org/apache/catalina/users/MemoryUser.java
b/java/org/apache/catalina/users/MemoryUser.java
index 84eb77d..3609764 100644
--- a/java/org/apache/catalina/users/MemoryUser.java
+++ b/java/org/apache/catalina/users/MemoryUser.java
@@ -17,8 +17,8 @@
package org.apache.catalina.users;
-import java.util.ArrayList;
import java.util.Iterator;
+import java.util.concurrent.CopyOnWriteArrayList;
import org.apache.catalina.Group;
import org.apache.catalina.Role;
@@ -72,13 +72,13 @@ public class MemoryUser extends AbstractUser {
/**
* The set of {@link Group}s that this user is a member of.
*/
- protected final ArrayList<Group> groups = new ArrayList<>();
+ protected final CopyOnWriteArrayList<Group> groups = new
CopyOnWriteArrayList<>();
/**
* The set of {@link Role}s associated with this user.
*/
- protected final ArrayList<Role> roles = new ArrayList<>();
+ protected final CopyOnWriteArrayList<Role> roles = new
CopyOnWriteArrayList<>();
// ------------------------------------------------------------- Properties
@@ -89,9 +89,7 @@ public class MemoryUser extends AbstractUser {
*/
@Override
public Iterator<Group> getGroups() {
- synchronized (groups) {
- return groups.iterator();
- }
+ return groups.iterator();
}
@@ -100,9 +98,7 @@ public class MemoryUser extends AbstractUser {
*/
@Override
public Iterator<Role> getRoles() {
- synchronized (roles) {
- return roles.iterator();
- }
+ return roles.iterator();
}
@@ -125,13 +121,7 @@ public class MemoryUser extends AbstractUser {
*/
@Override
public void addGroup(Group group) {
-
- synchronized (groups) {
- if (!groups.contains(group)) {
- groups.add(group);
- }
- }
-
+ groups.addIfAbsent(group);
}
@@ -142,13 +132,7 @@ public class MemoryUser extends AbstractUser {
*/
@Override
public void addRole(Role role) {
-
- synchronized (roles) {
- if (!roles.contains(role)) {
- roles.add(role);
- }
- }
-
+ roles.addIfAbsent(role);
}
@@ -159,9 +143,7 @@ public class MemoryUser extends AbstractUser {
*/
@Override
public boolean isInGroup(Group group) {
- synchronized (groups) {
- return groups.contains(group);
- }
+ return groups.contains(group);
}
@@ -174,9 +156,7 @@ public class MemoryUser extends AbstractUser {
*/
@Override
public boolean isInRole(Role role) {
- synchronized (roles) {
- return roles.contains(role);
- }
+ return roles.contains(role);
}
@@ -187,11 +167,7 @@ public class MemoryUser extends AbstractUser {
*/
@Override
public void removeGroup(Group group) {
-
- synchronized (groups) {
- groups.remove(group);
- }
-
+ groups.remove(group);
}
@@ -200,11 +176,7 @@ public class MemoryUser extends AbstractUser {
*/
@Override
public void removeGroups() {
-
- synchronized (groups) {
- groups.clear();
- }
-
+ groups.clear();
}
@@ -215,11 +187,7 @@ public class MemoryUser extends AbstractUser {
*/
@Override
public void removeRole(Role role) {
-
- synchronized (roles) {
- roles.remove(role);
- }
-
+ roles.remove(role);
}
@@ -228,11 +196,7 @@ public class MemoryUser extends AbstractUser {
*/
@Override
public void removeRoles() {
-
- synchronized (roles) {
- roles.clear();
- }
-
+ roles.clear();
}
diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml
index 07f3e5b..8069594 100644
--- a/webapps/docs/changelog.xml
+++ b/webapps/docs/changelog.xml
@@ -149,6 +149,10 @@
length needs to be represented as a long since it is larger than the
maximum value that can be represented by an int. (markt)
</fix>
+ <fix>
+ Avoid synchronization on roles verification for the memory
+ <code>UserDatabase</code>. (remm)
+ </fix>
</changelog>
</subsection>
<subsection name="Coyote">
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]