[java-opensaml] branch maint-3.4 updated: OSJ-305: AbstractDynamicMetadataResolver clear() doesn't reset ...
Brent Putman
putmanb at georgetown.edu
Fri Mar 20 15:06:41 EDT 2020
This is an automated email from the git hooks/post-receive script.
putmanb pushed a commit to branch maint-3.4
in repository java-opensaml.
View the commit online:
http://git.shibboleth.net/view/?p=java-opensaml.git;a=commit;h=663c5c8c8ce2f09b35abba5befa6e78b85db93f0
The following commit(s) were added to refs/heads/maint-3.4 by this push:
new 663c5c8 OSJ-305: AbstractDynamicMetadataResolver clear() doesn't reset ...
663c5c8 is described below
commit 663c5c8c8ce2f09b35abba5befa6e78b85db93f0
Author: Brent Putman <putmanb at georgetown.edu>
AuthorDate: Fri Mar 20 14:32:51 2020 -0400
OSJ-305: AbstractDynamicMetadataResolver clear() doesn't reset ...
AbstractDynamicMetadataResolver clear() doesn't reset negative lookup
cache.
Fix by processing the union of indexed descriptors' and mgmt data
entityIDs.
Address similar issue in cleanup sweeper task that ignores entityIDs
that don't have indexed descriptors.
Also re-factor clear() to just iterate and call clear(entityID).
---
.../impl/AbstractDynamicMetadataResolver.java | 36 +++++++------
.../impl/AbstractDynamicMetadataResolverTest.java | 63 ++++++++++++++++++++++
2 files changed, 84 insertions(+), 15 deletions(-)
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/metadata/resolver/impl/AbstractDynamicMetadataResolver.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/metadata/resolver/impl/AbstractDynamicMetadataResolver.java
index cfc5094..25edf8a 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/metadata/resolver/impl/AbstractDynamicMetadataResolver.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/metadata/resolver/impl/AbstractDynamicMetadataResolver.java
@@ -615,20 +615,12 @@ public abstract class AbstractDynamicMetadataResolver extends AbstractMetadataRe
/** {@inheritDoc} */
public void clear() throws ResolverException {
final DynamicEntityBackingStore backingStore = getBackingStore();
- final Map<String, List<EntityDescriptor>> indexedDescriptors = backingStore.getIndexedDescriptors();
+ final Set<String> entityIDs = new HashSet<>();
+ entityIDs.addAll(backingStore.getIndexedDescriptors().keySet());
+ entityIDs.addAll(backingStore.getManagementDataEntityIDs());
- for (final String entityID : indexedDescriptors.keySet()) {
- final EntityManagementData mgmtData = backingStore.getManagementData(entityID);
- final Lock writeLock = mgmtData.getReadWriteLock().writeLock();
- try {
- writeLock.lock();
-
- removeByEntityID(entityID, backingStore);
- backingStore.removeManagementData(entityID);
-
- } finally {
- writeLock.unlock();
- }
+ for (final String entityID : entityIDs) {
+ clear(entityID);
}
}
@@ -1602,6 +1594,18 @@ public abstract class AbstractDynamicMetadataResolver extends AbstractMetadataRe
}
/**
+ * Get the set of entityIDs which currently have management data.
+ *
+ * @return set of entityIDs, may be empty
+ */
+ @Nonnull @NonnullElements @Unmodifiable @NotLive
+ public Set<String> getManagementDataEntityIDs() {
+ synchronized (this) {
+ return Set.copyOf(mgmtDataMap.keySet());
+ }
+ }
+
+ /**
* Get the management data for the specified entityID.
*
* @param entityID the input entityID
@@ -1832,9 +1836,11 @@ public abstract class AbstractDynamicMetadataResolver extends AbstractMetadataRe
final DateTime earliestValidLastAccessed = now.minus(getMaxIdleEntityData());
final DynamicEntityBackingStore backingStore = getBackingStore();
- final Map<String, List<EntityDescriptor>> indexedDescriptors = backingStore.getIndexedDescriptors();
+ final Set<String> entityIDs = new HashSet<>();
+ entityIDs.addAll(backingStore.getIndexedDescriptors().keySet());
+ entityIDs.addAll(backingStore.getManagementDataEntityIDs());
- for (final String entityID : indexedDescriptors.keySet()) {
+ for (final String entityID : entityIDs) {
final EntityManagementData mgmtData = backingStore.getManagementData(entityID);
final Lock writeLock = mgmtData.getReadWriteLock().writeLock();
try {
diff --git a/opensaml-saml-impl/src/test/java/org/opensaml/saml/metadata/resolver/impl/AbstractDynamicMetadataResolverTest.java b/opensaml-saml-impl/src/test/java/org/opensaml/saml/metadata/resolver/impl/AbstractDynamicMetadataResolverTest.java
index f310ad8..0fd78a4 100644
--- a/opensaml-saml-impl/src/test/java/org/opensaml/saml/metadata/resolver/impl/AbstractDynamicMetadataResolverTest.java
+++ b/opensaml-saml-impl/src/test/java/org/opensaml/saml/metadata/resolver/impl/AbstractDynamicMetadataResolverTest.java
@@ -22,6 +22,7 @@ import java.io.IOException;
import java.security.KeyPair;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
+import java.time.Duration;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
@@ -264,6 +265,68 @@ public class AbstractDynamicMetadataResolverTest extends XMLObjectBaseTestCase {
}
@Test
+ public void testNegativeLookupCache() throws ComponentInitializationException, ResolverException, InterruptedException {
+ resolver.setNegativeLookupCacheDuration(Duration.ofSeconds(2));
+
+ resolver.initialize();
+
+ DynamicEntityBackingStore backingStore = resolver.getBackingStore();
+
+ Assert.assertFalse(backingStore.getIndexedDescriptors().containsKey(id1));
+
+ Assert.assertNull(resolver.resolveSingle(new CriteriaSet(new EntityIdCriterion(id1))));
+ Assert.assertFalse(backingStore.getIndexedDescriptors().containsKey(id1));
+
+ sourceMap.put(id1, ed1);
+
+ Assert.assertNull(resolver.resolveSingle(new CriteriaSet(new EntityIdCriterion(id1))));
+ Assert.assertFalse(backingStore.getIndexedDescriptors().containsKey(id1));
+
+ Thread.sleep(2500);
+
+ Assert.assertSame(resolver.resolveSingle(new CriteriaSet(new EntityIdCriterion(id1))), ed1);
+ Assert.assertTrue(backingStore.getIndexedDescriptors().containsKey(id1));
+ }
+
+ @Test
+ public void testGlobalClearWithNegativeLookupCache() throws ComponentInitializationException, ResolverException, InterruptedException {
+ resolver.initialize();
+
+ DynamicEntityBackingStore backingStore = resolver.getBackingStore();
+
+ Assert.assertFalse(backingStore.getIndexedDescriptors().containsKey(id1));
+
+ Assert.assertNull(resolver.resolveSingle(new CriteriaSet(new EntityIdCriterion(id1))));
+ Assert.assertFalse(backingStore.getIndexedDescriptors().containsKey(id1));
+
+ sourceMap.put(id1, ed1);
+
+ resolver.clear();
+
+ Assert.assertSame(resolver.resolveSingle(new CriteriaSet(new EntityIdCriterion(id1))), ed1);
+ Assert.assertTrue(backingStore.getIndexedDescriptors().containsKey(id1));
+ }
+
+ @Test
+ public void testEntityIDClearWithNegativeLookupCache() throws ComponentInitializationException, ResolverException, InterruptedException {
+ resolver.initialize();
+
+ DynamicEntityBackingStore backingStore = resolver.getBackingStore();
+
+ Assert.assertFalse(backingStore.getIndexedDescriptors().containsKey(id1));
+
+ Assert.assertNull(resolver.resolveSingle(new CriteriaSet(new EntityIdCriterion(id1))));
+ Assert.assertFalse(backingStore.getIndexedDescriptors().containsKey(id1));
+
+ sourceMap.put(id1, ed1);
+
+ resolver.clear(id1);
+
+ Assert.assertSame(resolver.resolveSingle(new CriteriaSet(new EntityIdCriterion(id1))), ed1);
+ Assert.assertTrue(backingStore.getIndexedDescriptors().containsKey(id1));
+ }
+
+ @Test
public void testDOMDropFromFetch() throws ComponentInitializationException, ResolverException {
sourceMap.put(id1, ed1);
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
More information about the commits
mailing list