[opensaml2] 09/11: SSPCPP-756 Helper method cacheEntity
Etienne Dysli Metref
edm-guest at moszumanska.debian.org
Thu Nov 16 08:08:24 UTC 2017
This is an automated email from the git hooks/post-receive script.
edm-guest pushed a commit to branch master
in repository opensaml2.
commit fa83182f529397b592780cec82ed11a7c434ccbd
Author: Rod Widdowson <rdw at steadingsoftware.com>
Date: Sun Nov 5 16:18:59 2017 +0000
SSPCPP-756 Helper method cacheEntity
https://issues.shibboleth.net/jira/browse/SSPCPP-756
This method will be needed by the "recover from on disk cache"
code in the SP.
It does both the index (in the base class) and the lookup caching.
It works out the cache expirey from the parameterization and the entity
itself.
---
.../metadata/AbstractDynamicMetadataProvider.h | 10 ++++
.../impl/AbstractDynamicMetadataProvider.cpp | 57 +++++++++++++---------
2 files changed, 45 insertions(+), 22 deletions(-)
diff --git a/saml/saml2/metadata/AbstractDynamicMetadataProvider.h b/saml/saml2/metadata/AbstractDynamicMetadataProvider.h
index b5fc758..6392f9f 100644
--- a/saml/saml2/metadata/AbstractDynamicMetadataProvider.h
+++ b/saml/saml2/metadata/AbstractDynamicMetadataProvider.h
@@ -28,6 +28,7 @@
#define __saml2_dynmetadataprov_h__
#include <saml/saml2/metadata/AbstractMetadataProvider.h>
+#include <xmltooling/Lockable.h>
namespace xmltooling {
class XMLTOOL_API CondWait;
@@ -73,6 +74,15 @@ namespace opensaml {
*/
virtual EntityDescriptor* resolve(const Criteria& criteria) const = 0;
+ /**
+ * Index an entity and cache the fact of it being indexed.
+ *
+ * @param entity what to cache
+ * @param locked have we locked ourself exclusive first?
+ * @return the cache ttl (for logging purposes)
+ */
+ virtual time_t cacheEntity(EntityDescriptor* entity, bool locked = false) const;
+
private:
std::string m_id;
std::auto_ptr<xmltooling::RWLock> m_lock;
diff --git a/saml/saml2/metadata/impl/AbstractDynamicMetadataProvider.cpp b/saml/saml2/metadata/impl/AbstractDynamicMetadataProvider.cpp
index 0277ac2..f2ad78d 100644
--- a/saml/saml2/metadata/impl/AbstractDynamicMetadataProvider.cpp
+++ b/saml/saml2/metadata/impl/AbstractDynamicMetadataProvider.cpp
@@ -315,22 +315,6 @@ pair<const EntityDescriptor*,const RoleDescriptor*> AbstractDynamicMetadataProvi
log.info("caching resolved metadata for (%s)", name.c_str());
- // Compute the smaller of the validUntil / cacheDuration constraints.
- time_t cacheExp = (entity2->getValidUntil() ? entity2->getValidUntilEpoch() : SAMLTIME_MAX) - now;
- if (entity2->getCacheDuration())
- cacheExp = min(cacheExp, entity2->getCacheDurationEpoch());
-
- // Adjust for the delay factor.
- cacheExp *= m_refreshDelayFactor;
-
- // Bound by max and min.
- if (cacheExp > m_maxCacheDuration)
- cacheExp = m_maxCacheDuration;
- else if (cacheExp < m_minCacheDuration)
- cacheExp = m_minCacheDuration;
-
- log.info("next refresh of metadata for (%s) no sooner than %u seconds", name.c_str(), cacheExp);
-
// Upgrade our lock so we can cache the new metadata.
m_lock->unlock();
m_lock->wrlock();
@@ -339,13 +323,10 @@ pair<const EntityDescriptor*,const RoleDescriptor*> AbstractDynamicMetadataProvi
// Notify observers.
emitChangeEvent(*entity2);
- // Record the proper refresh time.
- m_cacheMap[entity2->getEntityID()] = now + cacheExp;
+ time_t cacheExp = cacheEntity(entity2.get(), true);
+
+ log.info("next refresh of metadata for (%s) no sooner than %u seconds", name.c_str(), cacheExp);
- // Make sure we clear out any existing copies, including stale metadata or if somebody snuck in.
- cacheExp = SAMLTIME_MAX;
- unindex(entity2->getEntityID(), true); // actually frees the old instance with this ID
- indexEntity(entity2.get(), cacheExp);
entity2.release();
m_lastUpdate = now;
@@ -384,3 +365,35 @@ pair<const EntityDescriptor*,const RoleDescriptor*> AbstractDynamicMetadataProvi
return getEntityDescriptor(criteria);
}
+time_t AbstractDynamicMetadataProvider::cacheEntity(EntityDescriptor* entity, bool writeLocked) const
+{
+ time_t now = time(nullptr);
+ if (!writeLocked) {
+ m_lock->wrlock();
+ }
+ Locker locker(writeLocked ? nullptr : const_cast<AbstractDynamicMetadataProvider*>(this));
+
+ // Compute the smaller of the validUntil / cacheDuration constraints.
+ time_t cacheExp = (entity->getValidUntil() ? entity->getValidUntilEpoch() : SAMLTIME_MAX) - now;
+ if (entity->getCacheDuration())
+ cacheExp = min(cacheExp, entity->getCacheDurationEpoch());
+
+ // Adjust for the delay factor.
+ cacheExp *= m_refreshDelayFactor;
+
+ // Bound by max and min.
+ if (cacheExp > m_maxCacheDuration)
+ cacheExp = m_maxCacheDuration;
+ else if (cacheExp < m_minCacheDuration)
+ cacheExp = m_minCacheDuration;
+
+ // Record the proper refresh time.
+ m_cacheMap[entity->getEntityID()] = now + cacheExp;
+
+ // Make sure we clear out any existing copies, including stale metadata or if somebody snuck in.
+ unindex(entity->getEntityID(), true); // actually frees the old instance with this ID
+ time_t exp(SAMLTIME_MAX);
+ indexEntity(entity, exp);
+
+ return cacheExp;
+}
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-shibboleth/opensaml2.git
More information about the Pkg-shibboleth-devel
mailing list