This is an automated email from the ASF dual-hosted git repository. baedke pushed a commit to branch trunk in repository https://gitbox.apache.org/repos/asf/jackrabbit-oak.git
The following commit(s) were added to refs/heads/trunk by this push: new 50112fc0c7 OAK-10451: UserPrincipalProvider may cause many conflicts when under load 50112fc0c7 is described below commit 50112fc0c7087cfdc68285d115baa0de4f602e29 Author: Manfred Baedke <manfred.bae...@gmail.com> AuthorDate: Mon Jul 1 16:24:29 2024 +0200 OAK-10451: UserPrincipalProvider may cause many conflicts when under load Fixed test class that failed with Java 17. --- .../user/CachedPrincipalMembershipReaderTest.java | 44 +++++++++------------- 1 file changed, 18 insertions(+), 26 deletions(-) diff --git a/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/CachedPrincipalMembershipReaderTest.java b/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/CachedPrincipalMembershipReaderTest.java index 4b8e65eea0..c5c190c463 100644 --- a/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/CachedPrincipalMembershipReaderTest.java +++ b/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/CachedPrincipalMembershipReaderTest.java @@ -26,6 +26,7 @@ import org.apache.jackrabbit.oak.api.PropertyState; import org.apache.jackrabbit.oak.api.Root; import org.apache.jackrabbit.oak.api.Tree; import org.apache.jackrabbit.oak.api.Type; +import org.apache.jackrabbit.oak.commons.junit.LogCustomizer; import org.apache.jackrabbit.oak.spi.security.ConfigurationParameters; import org.apache.jackrabbit.oak.spi.security.authentication.SystemSubject; import org.apache.jackrabbit.oak.spi.security.user.UserConfiguration; @@ -34,11 +35,10 @@ import org.jetbrains.annotations.NotNull; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; -import org.slf4j.Logger; +import org.slf4j.event.Level; import javax.security.auth.Subject; import java.lang.reflect.Field; -import java.lang.reflect.Modifier; import java.security.Principal; import java.security.PrivilegedExceptionAction; import java.util.ArrayList; @@ -53,13 +53,11 @@ import java.util.Set; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyNoInteractions; import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; @@ -77,7 +75,7 @@ public class CachedPrincipalMembershipReaderTest extends PrincipalMembershipRead private final long cacheMaxStale; - private final Logger mockedLogger = mock(Logger.class); + private final LogCustomizer logCustomizer = LogCustomizer.forLogger(CachedPrincipalMembershipReader.class).enable(Level.DEBUG).create(); private ContentSession systemSession; private String userPath; @@ -94,7 +92,7 @@ public class CachedPrincipalMembershipReaderTest extends PrincipalMembershipRead public void before() throws Exception { super.before(); userPath = getTestUser().getPath(); - setFinalStaticField(CachedPrincipalMembershipReader.class, "LOG", mockedLogger); + logCustomizer.starting(); } @Override @@ -104,7 +102,7 @@ public class CachedPrincipalMembershipReaderTest extends PrincipalMembershipRead systemSession.close(); } } finally { - clearInvocations(mockedLogger); + logCustomizer.finished(); super.after(); } } @@ -136,17 +134,6 @@ public class CachedPrincipalMembershipReaderTest extends PrincipalMembershipRead return systemSession.getLatestRoot(); } - private static void setFinalStaticField(@NotNull Class<?> clazz, @NotNull String fieldName, @NotNull Object value) throws Exception { - Field field = clazz.getDeclaredField(fieldName); - field.setAccessible(true); - - Field modifiers = Field.class.getDeclaredField("modifiers"); - modifiers.setAccessible(true); - modifiers.setInt(field, field.getModifiers() & ~Modifier.FINAL); - - field.set(null, value); - } - @Test public void testWritingCacheFailsWithException() throws Exception { CachedPrincipalMembershipReader cachedGroupMembershipReader = createPrincipalMembershipReader(root); @@ -157,9 +144,9 @@ public class CachedPrincipalMembershipReaderTest extends PrincipalMembershipRead Set<Principal> expected = Collections.singleton(getUserManager(root).getAuthorizable(groupId).getPrincipal()); assertEquals(expected, groupPrincipals); - verify(mockedLogger, times(1)).debug("Attempting to create new membership cache at {}", userPath); - verify(mockedLogger, times(1)).debug("Failed to cache membership: {}", "OakConstraint0034: Attempt to create or change the system maintained cache."); - verifyNoMoreInteractions(mockedLogger); + assertEquals(2, logCustomizer.getLogs().size()); + assertEquals("Attempting to create new membership cache at " + userPath, logCustomizer.getLogs().get(0)); + assertEquals("Failed to cache membership: OakConstraint0034: Attempt to create or change the system maintained cache.", logCustomizer.getLogs().get(1)); } /** @@ -177,7 +164,7 @@ public class CachedPrincipalMembershipReaderTest extends PrincipalMembershipRead Set<Principal> expected = Collections.singleton(getUserManager(root).getAuthorizable(groupId).getPrincipal()); assertEquals(expected, groupPrincipals); - verifyNoInteractions(mockedLogger); + assertEquals(0, logCustomizer.getLogs().size()); verify(cachedGroupMembershipReader).readMembership(groupTree, groupPrincipals); verifyNoMoreInteractions(cachedGroupMembershipReader); } @@ -195,12 +182,14 @@ public class CachedPrincipalMembershipReaderTest extends PrincipalMembershipRead cachedGroupMembershipReader.readMembership(systemRoot.getTree(userPath), groupPrincipal); //Assert that the first time the cache was created - verify(mockedLogger, times(1)).debug("Attempting to create new membership cache at {}", userPath); + assertEquals(2, logCustomizer.getLogs().size()); + assertEquals("Attempting to create new membership cache at " + userPath, logCustomizer.getLogs().get(0)); assertEquals(1, groupPrincipal.size()); cachedGroupMembershipReader.readMembership(systemRoot.getTree(userPath), groupPrincipal); + assertEquals(3, logCustomizer.getLogs().size()); //Assert that the cache was used - verify(mockedLogger, times(1)).debug("Reading membership from cache for '{}'", userPath); + assertEquals("Reading membership from cache for '" + userPath + "'", logCustomizer.getLogs().get(2)); assertEquals(1, groupPrincipal.size()); } @@ -233,10 +222,13 @@ public class CachedPrincipalMembershipReaderTest extends PrincipalMembershipRead verify(mockedRoot, times(1)).commit(CacheValidatorProvider.asCommitAttributes()); if (cacheMaxStale == UserPrincipalProvider.NO_STALE_CACHE) { - verify(mockedLogger, times(NUM_THREADS - 1)).debug("Another thread is updating the cache and this thread is not allowed to serve a stale cache; reading from persistence without caching."); + assertEquals(NUM_THREADS, logCustomizer.getLogs().size()); + logCustomizer.getLogs().subList(0, NUM_THREADS - 1).forEach(s -> assertEquals("Another thread is updating the cache and this thread is not allowed to serve a stale cache; reading from persistence without caching.", s)); } else { - verify(mockedLogger, times(NUM_THREADS - 1)).debug("Another thread is updating the cache, returning a stale cache for '{}'.", mockedUser.getPath()); + assertEquals(NUM_THREADS, logCustomizer.getLogs().size()); + logCustomizer.getLogs().subList(0, NUM_THREADS - 1).forEach(s -> assertEquals("Another thread is updating the cache, returning a stale cache for '" + mockedUser.getPath() + "'.", s)); } + assertTrue(logCustomizer.getLogs().get(NUM_THREADS - 1).startsWith("Cached membership at " + mockedUser.getPath())); } private void initMocks() throws CommitFailedException {