[java-opensaml] branch master updated: OSJ-305: AbstractDynamicMetadataResolver clear() doesn't reset ...

Brent Putman putmanb at georgetown.edu
Fri Mar 20 14:47:27 EDT 2020


This is an automated email from the git hooks/post-receive script.

putmanb pushed a commit to branch master
in repository java-opensaml.

View the commit online:
http://git.shibboleth.net/view/?p=java-opensaml.git;a=commit;h=c9762dfeeb08c73608ff9aa3427d60f3a039dc74

The following commit(s) were added to refs/heads/master by this push:
       new  c9762df   OSJ-305: AbstractDynamicMetadataResolver clear() doesn't reset ...
c9762df is described below

commit c9762dfeeb08c73608ff9aa3427d60f3a039dc74
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 735c8fc..e5a1811 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
@@ -629,20 +629,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);
         }
     }
 
@@ -1584,6 +1576,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
@@ -1811,9 +1815,11 @@ public abstract class AbstractDynamicMetadataResolver extends AbstractMetadataRe
             final Instant 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 225bb0c..a1b075c 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.List;
@@ -261,6 +262,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