[xmltooling] 03/05: CPPXT-106 Apache Deadlock in load thread/lock thread
Etienne Dysli Metref
edm-guest at moszumanska.debian.org
Thu Nov 16 08:00:34 UTC 2017
This is an automated email from the git hooks/post-receive script.
edm-guest pushed a commit to branch maint-1.6
in repository xmltooling.
commit f6150b10d4c18bf155fa41e6abe665e073b9f238
Author: Robert Crossfield <robcrossfield at gmail.com>
Date: Tue Dec 20 11:04:06 2016 +1100
CPPXT-106 Apache Deadlock in load thread/lock thread
https://issues.shibboleth.net/jira/browse/CPPXT-106
Under certain cirucmstances an Apache thread can
cause us to do a Read then Write lock. Diagnosed as being because
of the lock dance in the ReloadableXMLFile::lock() call.
Move the dance and updatingof m_filestamp to the reload thread,
all the lock api needs to do is spot that things are out of date
and kick the worker thread. This might cause the worker to wake
up too often but this is unlikely.
---
xmltooling/util/ReloadableXMLFile.cpp | 33 +++++++++++++++++++--------------
1 file changed, 19 insertions(+), 14 deletions(-)
diff --git a/xmltooling/util/ReloadableXMLFile.cpp b/xmltooling/util/ReloadableXMLFile.cpp
index 7505616..4880577 100644
--- a/xmltooling/util/ReloadableXMLFile.cpp
+++ b/xmltooling/util/ReloadableXMLFile.cpp
@@ -287,7 +287,26 @@ void* ReloadableXMLFile::reload_fn(void* pv)
r->m_reload_wait->timedwait(mutex.get(), r->m_reloadInterval);
if (r->m_shutdown)
break;
+
+#ifdef WIN32
+ struct _stat stat_buf;
+ if (_stat(r->m_source.c_str(), &stat_buf) != 0)
+ continue;
+#else
+ struct stat stat_buf;
+ if (stat(r->m_source.c_str(), &stat_buf) != 0)
+ continue
+#endif
+ if (r->m_filestamp >= stat_buf.st_mtime)
+ continue;
+ // Elevate lock and recheck.
+ r->m_log.debug("timestamp of local resource changed, obtaining write lock");
+ r->m_lock->wrlock();
+ r->m_filestamp = stat_buf.st_mtime;
+ r->m_log.debug("timestamp of local resource changed, releasing write lock");
+ r->m_lock->unlock();
+
try {
r->m_log.info("reloading %s resource...", r->m_local ? "local" : "remote");
pair<bool,DOMElement*> ret = r->background_load();
@@ -340,20 +359,6 @@ Lockable* ReloadableXMLFile::lock()
if (m_filestamp >= stat_buf.st_mtime)
return this;
- // Elevate lock and recheck.
- m_log.debug("timestamp of local resource changed, elevating to a write lock");
- m_lock->unlock();
- m_lock->wrlock();
- if (m_filestamp >= stat_buf.st_mtime) {
- // Somebody else handled it, just downgrade.
- m_log.debug("update of local resource handled by another thread, downgrading lock");
- m_lock->unlock();
- m_lock->rdlock();
- return this;
- }
-
- // Update the timestamp regardless.
- m_filestamp = stat_buf.st_mtime;
if (m_reload_wait) {
m_log.info("change detected, signaling reload thread...");
m_reload_wait->signal();
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-shibboleth/xmltooling.git
More information about the Pkg-shibboleth-devel
mailing list