https://issues.shibboleth.net/jira/browse/SSPCPP-235
authorScott Cantor <cantor.2@osu.edu>
Wed, 28 Oct 2009 18:06:37 +0000 (18:06 +0000)
committerScott Cantor <cantor.2@osu.edu>
Wed, 28 Oct 2009 18:06:37 +0000 (18:06 +0000)
memcache-store/memcache-store.cpp

index 758f4ff..6724232 100644 (file)
@@ -58,6 +58,11 @@ namespace xmltooling {
   static const XMLCh Hosts[] = UNICODE_LITERAL_5(H,o,s,t,s);\r
   static const XMLCh prefix[] = UNICODE_LITERAL_6(p,r,e,f,i,x);\r
   static const XMLCh buildMap[] = UNICODE_LITERAL_8(b,u,i,l,d,M,a,p);\r
+  static const XMLCh sendTimeout[] = UNICODE_LITERAL_11(s,e,n,d,T,i,m,e,o,u,t);\r
+  static const XMLCh recvTimeout[] = UNICODE_LITERAL_11(r,e,c,v,T,i,m,e,o,u,t);\r
+  static const XMLCh pollTimeout[] = UNICODE_LITERAL_11(p,o,l,l,T,i,m,e,o,u,t);\r
+  static const XMLCh failLimit[] = UNICODE_LITERAL_9(f,a,i,l,L,i,m,i,t);\r
+  static const XMLCh retryTimeout[] = UNICODE_LITERAL_12(r,e,t,r,y,T,i,m,e,o,u,t);\r
   \r
   class mc_record {\r
   public:\r
@@ -110,7 +115,6 @@ namespace xmltooling {
     const DOMElement* m_root; // can only use this during initialization\r
     Category& log;\r
     memcached_st *memc;\r
-    string m_memcacheHosts;\r
     string m_prefix;\r
     Mutex* m_lock;\r
   };\r
@@ -299,12 +303,13 @@ bool MemcacheBase::deleteMemcache(const char *key,
     success = false;\r
   } else if (rv == MEMCACHED_ERRNO) {\r
     // System error\r
-    log.error(string("Memcache::deleteMemcache() SYSTEM ERROR: ") + string(strerror(memc->cached_errno)));\r
-    success = false;\r
+    string error = string("Memcache::deleteMemcache() SYSTEM ERROR: ") + string(strerror(memc->cached_errno));\r
+    log.error(error);\r
+    throw IOException(error);\r
   } else {\r
-    log.error(string("Memcache::deleteMemcache() Problems: ") + memcached_strerror(memc, rv));\r
-    // shouldn't be here\r
-    success = false;\r
+    string error = string("Memcache::deleteMemcache() Problems: ") + memcached_strerror(memc, rv);\r
+    log.error(error);\r
+    throw IOException(error);\r
   }\r
 \r
   return success;\r
@@ -339,11 +344,13 @@ bool MemcacheBase::getMemcache(const char *key,
     success = false;\r
   } else if (rv == MEMCACHED_ERRNO) {\r
     // System error\r
-    log.error(string("Memcache::getMemcache() SYSTEM ERROR: ") + string(strerror(memc->cached_errno)));\r
-    success = false;\r
+    string error = string("Memcache::getMemcache() SYSTEM ERROR: ") + string(strerror(memc->cached_errno));\r
+    log.error(error);\r
+    throw IOException(error);\r
   } else {\r
-    log.error(string("Memcache::getMemcache() Problems: ") + memcached_strerror(memc, rv));\r
-    success = false;\r
+    string error = string("Memcache::getMemcache() Problems: ") + memcached_strerror(memc, rv);\r
+    log.error(error);\r
+    throw IOException(error);\r
   }\r
 \r
   return success;\r
@@ -376,12 +383,13 @@ bool MemcacheBase::addMemcache(const char *key,
     success = false;\r
   } else if (rv == MEMCACHED_ERRNO) {\r
     // System error\r
-    log.error(string("Memcache::addMemcache() SYSTEM ERROR: ") + string(strerror(memc->cached_errno)));\r
-    success = false;\r
+    string error = string("Memcache::addMemcache() SYSTEM ERROR: ") + string(strerror(memc->cached_errno));\r
+    log.error(error);\r
+    throw IOException(error);\r
   } else {\r
-    // shouldn't be here\r
-    log.error(string("Memcache::addMemcache() Problems: ") + memcached_strerror(memc, rv));\r
-    success = false;\r
+    string error = string("Memcache::addMemcache() Problems: ") + memcached_strerror(memc, rv);\r
+    log.error(error);\r
+    throw IOException(error);\r
   }\r
 \r
   return success;\r
@@ -411,12 +419,13 @@ bool MemcacheBase::setMemcache(const char *key,
     success = true;\r
   } else if (rv == MEMCACHED_ERRNO) {\r
     // System error\r
-    log.error(string("Memcache::setMemcache() SYSTEM ERROR: ") + string(strerror(memc->cached_errno)));\r
-    success = false;\r
+    string error = string("Memcache::setMemcache() SYSTEM ERROR: ") + string(strerror(memc->cached_errno));\r
+    log.error(error);\r
+    throw IOException(error);\r
   } else {\r
-    // shouldn't be here\r
-    log.error(string("Memcache::setMemcache() Problems: ") + memcached_strerror(memc, rv));\r
-    success = false;\r
+    string error = string("Memcache::setMemcache() Problems: ") + memcached_strerror(memc, rv);\r
+    log.error(error);\r
+    throw IOException(error);\r
   }\r
 \r
   return success;\r
@@ -449,18 +458,19 @@ bool MemcacheBase::replaceMemcache(const char *key,
     success = false;\r
   } else if (rv == MEMCACHED_ERRNO) {\r
     // System error\r
-    log.error(string("Memcache::replaceMemcache() SYSTEM ERROR: ") + string(strerror(memc->cached_errno)));\r
-    success = false;\r
+    string error = string("Memcache::replaceMemcache() SYSTEM ERROR: ") + string(strerror(memc->cached_errno));\r
+    log.error(error);\r
+    throw IOException(error);\r
   } else {\r
-    // shouldn't be here\r
-    log.error(string("Memcache::replaceMemcache() Problems: ") + memcached_strerror(memc, rv));\r
-    success = false;\r
+    string error = string("Memcache::replaceMemcache() Problems: ") + memcached_strerror(memc, rv);\r
+    log.error(error);\r
+    throw IOException(error);\r
   }\r
 \r
   return success;\r
 }\r
 \r
-MemcacheBase::MemcacheBase(const DOMElement* e) : m_root(e), log(Category::getInstance("XMLTooling.MemcacheBase")), m_memcacheHosts(""), m_prefix("") {\r
+MemcacheBase::MemcacheBase(const DOMElement* e) : m_root(e), log(Category::getInstance("XMLTooling.MemcacheBase")), m_prefix("") {\r
 \r
   auto_ptr_char p(e ? e->getAttributeNS(NULL,prefix) : NULL);\r
   if (p.get() && *p.get()) {\r
@@ -468,15 +478,6 @@ MemcacheBase::MemcacheBase(const DOMElement* e) : m_root(e), log(Category::getIn
     m_prefix = p.get();\r
   }\r
 \r
-  // Grab hosts from the configuration.\r
-  e = e ? XMLHelper::getFirstChildElement(e,Hosts) : NULL;\r
-  if (!e || !e->hasChildNodes()) {\r
-    throw XMLToolingException("Memcache StorageService requires Hosts element in configuration.");\r
-  }\r
-  auto_ptr_char h(e->getFirstChild()->getNodeValue());\r
-  log.debug("INIT: GOT Hosts: %s", h.get());\r
-  m_memcacheHosts = h.get();\r
-\r
   m_lock = Mutex::create();\r
   log.debug("Lock created");\r
 \r
@@ -491,21 +492,55 @@ MemcacheBase::MemcacheBase(const DOMElement* e) : m_root(e), log(Category::getIn
   memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_HASH, hash);\r
   log.debug("CRC hash set");\r
 \r
-  int32_t timeout = 1000000;\r
-  memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_SND_TIMEOUT, timeout);\r
-  memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_RCV_TIMEOUT, timeout);\r
+  int32_t send_timeout = 1000000;\r
+  const XMLCh* tag = e ? e->getAttributeNS(NULL, sendTimeout) : NULL;\r
+  if (tag && *tag) {\r
+    send_timeout = XMLString::parseInt(tag);\r
+  }\r
+  log.debug("MEMCACHED_BEHAVIOR_SND_TIMEOUT will be set to %d", send_timeout);\r
+  memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_SND_TIMEOUT, send_timeout);\r
+\r
+  int32_t recv_timeout = 1000000;\r
+  tag = e ? e->getAttributeNS(NULL, sendTimeout) : NULL;\r
+  if (tag && *tag) {\r
+    recv_timeout = XMLString::parseInt(tag);\r
+  }\r
+  log.debug("MEMCACHED_BEHAVIOR_RCV_TIMEOUT will be set to %d", recv_timeout);\r
+  memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_RCV_TIMEOUT, recv_timeout);\r
 \r
   int32_t poll_timeout = 1000;\r
+  tag = e ? e->getAttributeNS(NULL, pollTimeout) : NULL;\r
+  if (tag && *tag) {\r
+    poll_timeout = XMLString::parseInt(tag);\r
+  }\r
+  log.debug("MEMCACHED_BEHAVIOR_POLL_TIMEOUT will be set to %d", poll_timeout);\r
   memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_POLL_TIMEOUT, poll_timeout);\r
 \r
   int32_t fail_limit = 5;\r
+  tag = e ? e->getAttributeNS(NULL, failLimit) : NULL;\r
+  if (tag && *tag) {\r
+    fail_limit = XMLString::parseInt(tag);\r
+  }\r
+  log.debug("MEMCACHED_BEHAVIOR_SERVER_FAILURE_LIMIT will be set to %d", fail_limit);\r
   memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_SERVER_FAILURE_LIMIT, fail_limit);\r
 \r
   int32_t retry_timeout = 30;\r
+  tag = e ? e->getAttributeNS(NULL, retryTimeout) : NULL;\r
+  if (tag && *tag) {\r
+    retry_timeout = XMLString::parseInt(tag);\r
+  }\r
+  log.debug("MEMCACHED_BEHAVIOR_RETRY_TIMEOUT will be set to %d", retry_timeout);\r
   memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_RETRY_TIMEOUT, retry_timeout);\r
 \r
+  // Grab hosts from the configuration.\r
+  e = e ? XMLHelper::getFirstChildElement(e,Hosts) : NULL;\r
+  if (!e || !e->hasChildNodes()) {\r
+    throw XMLToolingException("Memcache StorageService requires Hosts element in configuration.");\r
+  }\r
+  auto_ptr_char h(e->getFirstChild()->getNodeValue());\r
+  log.debug("INIT: GOT Hosts: %s", h.get());\r
   memcached_server_st *servers;\r
-  servers = memcached_servers_parse((char *)m_memcacheHosts.c_str());\r
+  servers = memcached_servers_parse(const_cast<char*>(h.get()));\r
   log.debug("Got %u hosts.",  memcached_server_list_count(servers));\r
   if (memcached_server_push(memc, servers) != MEMCACHED_SUCCESS) {\r
     throw IOException("MemcacheBase::Memcache(): memcached_server_push() failed");    \r