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
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
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
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
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
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
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
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
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