[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