From f3dc160641570d8df3a665b4f3e9ffbe770ecc50 Mon Sep 17 00:00:00 2001 From: dbs Date: Thu, 10 Dec 2009 05:09:53 +0000 Subject: [PATCH] Transition from libmemcache to libmemcached - an actively maintained memcached client library. As of this commit, you (I'm looking at you, buildbot) will require the pkg-config and libmemcached development packages to build and run OpenSRF. git-svn-id: svn://svn.open-ils.org/OpenSRF/trunk@1869 9efc2488-bf62-4759-914b-345cdb29e865 --- configure.ac | 7 ++--- include/opensrf/osrf_cache.h | 2 +- src/extras/Makefile.install | 19 +++++-------- src/libopensrf/Makefile.am | 5 ++-- src/libopensrf/osrf_cache.c | 64 +++++++++++++++++++++++++++++++++++--------- 5 files changed, 66 insertions(+), 31 deletions(-) diff --git a/configure.ac b/configure.ac index 4e1fd16..00bcddc 100644 --- a/configure.ac +++ b/configure.ac @@ -255,12 +255,13 @@ if test "x$OSRF_INSTALL_CORE" = "xtrue"; then #----------------------------- AC_CHECK_LIB([dl], [dlerror], [],AC_MSG_ERROR(***OpenSRF requires libdl)) - AC_SEARCH_LIBS([mc_req_free], [memcache], [], AC_MSG_ERROR(***OpenSRF requires memcache headers)) AC_CHECK_LIB([ncurses], [initscr], [], AC_MSG_ERROR(***OpenSRF requires ncurses headers)) AC_CHECK_LIB([readline], [readline], [], AC_MSG_ERROR(***OpenSRF requires readline headers)) AC_CHECK_LIB([xml2], [xmlAddID], [], AC_MSG_ERROR(***OpenSRF requires libxml2 headers)) - - + # Check for libmemcached and set flags accordingly + PKG_CHECK_MODULES(memcached, libmemcached >= 0.8.0) + AC_SUBST(memcached_CFLAGS) + AC_SUBST(memcached_LIBS) #----------------------------- # Checks for header files. diff --git a/include/opensrf/osrf_cache.h b/include/opensrf/osrf_cache.h index 6b54f50..591b3a8 100644 --- a/include/opensrf/osrf_cache.h +++ b/include/opensrf/osrf_cache.h @@ -17,7 +17,7 @@ GNU General Public License for more details. #define OSRF_CACHE_H #include -#include +#include #include #ifdef __cplusplus diff --git a/src/extras/Makefile.install b/src/extras/Makefile.install index 7dbd931..3b166fd 100644 --- a/src/extras/Makefile.install +++ b/src/extras/Makefile.install @@ -51,10 +51,6 @@ EJABBERD_PKG=ejabberd-2.0.2_2-linux-x86-installer.bin EJABBERD_PKG_x64=ejabberd-2.0.2_2-linux-x86_64-installer.bin EJABBERD_HOST=http://www.process-one.net/downloads/ejabberd -# libmemcache is not packaged on CentOS/RHEL -LIBMEMCACHE=libmemcache-1.4.0.rc2 -LIBMEMCACHE_HOST=http://people.freebsd.org/~seanc/libmemcache/ - # XML::LibXSLT fails due to old libxslt XSLT=libxslt-1.1.22 XSLT_HOST=ftp://ftp.gnome.org/pub/GNOME/sources/libxslt/1.1 @@ -85,7 +81,7 @@ DEBS = \ libgcrypt11-dev \ libgdbm-dev \ liblog-log4perl-perl\ - libmemcache-dev\ + libmemcached-dev\ libmodule-build-perl\ libnet-jabber-perl\ libperl-dev\ @@ -105,6 +101,7 @@ DEBS = \ libxslt1-dev\ memcached\ ntpdate\ + pkg-config\ psmisc\ python-dev\ python-libxml2\ @@ -165,7 +162,7 @@ GENTOOS = \ vim\ ntp\ memcached\ - libmemcache\ + libmemcached\ net-misc/telnet-bsd\ app-portage/gentoolkit\ gsasl\ @@ -235,7 +232,7 @@ all: @echo "please specify an OS" && exit 0 -centos: install_centos_rpms install_ejabberd install_libmemcache install_libxml2 install_libxslt install_centos_perl create_ld_local +centos: install_centos_rpms install_ejabberd install_libmemcached install_libxml2 install_libxslt install_centos_perl create_ld_local debian-etch: generic_debian etch debian-lenny: generic_debian lenny @@ -277,11 +274,9 @@ install_ejabberd: chmod u+x $(EJABBERD_PKG) ./$(EJABBERD_PKG) --mode unattended --prefix /opt/ejabberd --adminpw opensrf -# Install libmemcache from the official project source -install_libmemcache: - if [ ! -d $(LIBMEMCACHE) ]; then wget $(LIBMEMCACHE_HOST)/$(LIBMEMCACHE).tar.bz2; fi; - tar xjf $(LIBMEMCACHE).tar.bz2 - cd $(LIBMEMCACHE) && ./configure && make && make install +# Install libmemcached from the official project source +install_libmemcached: + @echo "TODO: work out how to build or grab libmemcached packages for CentOS/RHEL" # Install a newer version of libxslt install_libxslt: diff --git a/src/libopensrf/Makefile.am b/src/libopensrf/Makefile.am index 6c8c723..1cc92bf 100644 --- a/src/libopensrf/Makefile.am +++ b/src/libopensrf/Makefile.am @@ -14,7 +14,7 @@ AM_CFLAGS = $(DEF_CFLAGS) -DASSUME_STATELESS -DOSRF_STRICT_PARAMS -rdynamic -fno-strict-aliasing -DOSRF_JSON_ENABLE_XML_UTILS AM_LDFLAGS = $(DEF_LDFLAGS) -R $(libdir) -LDADD = -lxml2 -ldl -lmemcache -lopensrf +LDADD = -lxml2 -ldl -lopensrf DISTCLEANFILES = Makefile.in Makefile @@ -109,8 +109,9 @@ lib_LTLIBRARIES = libopensrf.la libosrf_json_la_SOURCES = $(JSON_TARGS) $(JSON_DEP) $(JSON_TARGS_HEADS) $(JSON_DEP_HEADS) libosrf_json_la_CFLAGS = $(AM_CFLAGS) -libopensrf_la_CFLAGS = $(AM_CFLAGS) +libopensrf_la_CFLAGS = $(AM_CFLAGS) $(memcached_CFLAGS) libopensrf_la_DEPENDENCIES = libosrf_json.la +libopensrf_la_LIBADD = $(memcached_LIBS) libopensrf_la_SOURCES = $(TARGS) $(TARGS_HEADS) $(JSON_TARGS) $(JSON_TARGS_HEADS) diff --git a/src/libopensrf/osrf_cache.c b/src/libopensrf/osrf_cache.c index e88ae00..c19354a 100644 --- a/src/libopensrf/osrf_cache.c +++ b/src/libopensrf/osrf_cache.c @@ -15,19 +15,30 @@ GNU General Public License for more details. #include -static struct memcache* _osrfCache = NULL; +static struct memcached_st* _osrfCache = NULL; static time_t _osrfCacheMaxSeconds = -1; int osrfCacheInit( const char* serverStrings[], int size, time_t maxCacheSeconds ) { + memcached_server_st *server_pool; + memcached_return rc; + if( !(serverStrings && size > 0) ) return -1; - osrfCacheCleanup(); /* in case we've already been init-ed */ + osrfCacheCleanup(); /* in case we've already been init-ed */ int i; - _osrfCache = mc_new(); + _osrfCache = memcached_create(NULL); _osrfCacheMaxSeconds = maxCacheSeconds; - for( i = 0; i < size && serverStrings[i]; i++ ) - mc_server_add4( _osrfCache, serverStrings[i] ); + for( i = 0; i < size && serverStrings[i]; i++ ) { + /* TODO: modify caller to pass a list of servers all at once */ + server_pool = memcached_servers_parse(serverStrings[i]); + rc = memcached_server_push(_osrfCache, server_pool); + if (rc != MEMCACHED_SUCCESS) { + osrfLogError(OSRF_LOG_MARK, + "Failed to add memcached server: %s - %s", + serverStrings[i], memcached_strerror(_osrfCache, rc)); + } + } return 0; } @@ -36,24 +47,37 @@ int osrfCachePutObject( char* key, const jsonObject* obj, time_t seconds ) { if( !(key && obj) ) return -1; char* s = jsonObjectToJSON( obj ); osrfLogInternal( OSRF_LOG_MARK, "osrfCachePut(): Putting object (key=%s): %s", key, s); - osrfCachePutString(key, s, seconds); + osrfCachePutString(key, s, seconds); free(s); return 0; } int osrfCachePutString( char* key, const char* value, time_t seconds ) { + memcached_return rc; if( !(key && value) ) return -1; - seconds = (seconds <= 0 || seconds > _osrfCacheMaxSeconds) ? _osrfCacheMaxSeconds : seconds; + seconds = (seconds <= 0 || seconds > _osrfCacheMaxSeconds) ? _osrfCacheMaxSeconds : seconds; osrfLogInternal( OSRF_LOG_MARK, "osrfCachePutString(): Putting string (key=%s): %s", key, value); - mc_set(_osrfCache, key, strlen(key), value, strlen(value), seconds, 0); + /* add or overwrite existing key:value pair */ + rc = memcached_set(_osrfCache, key, strlen(key), value, strlen(value), seconds, 0); + if (rc != MEMCACHED_SUCCESS) { + osrfLogError(OSRF_LOG_MARK, "Failed to cache key:value [%s]:[%s] - %s", + key, value, memcached_strerror(_osrfCache, rc)); + } return 0; } jsonObject* osrfCacheGetObject( const char* key, ... ) { + size_t val_len; + uint32_t flags; + memcached_return rc; jsonObject* obj = NULL; if( key ) { VA_LIST_TO_STRING(key); - const char* data = (const char*) mc_aget( _osrfCache, VA_BUF, strlen(VA_BUF) ); + const char* data = (const char*) memcached_get(_osrfCache, VA_BUF, strlen(VA_BUF), &val_len, &flags, &rc); + if (rc != MEMCACHED_SUCCESS) { + osrfLogDebug(OSRF_LOG_MARK, "Failed to get key [%s] - %s", + VA_BUF, memcached_strerror(_osrfCache, rc)); + } if( data ) { osrfLogInternal( OSRF_LOG_MARK, "osrfCacheGetObject(): Returning object (key=%s): %s", VA_BUF, data); obj = jsonParse( data ); @@ -65,9 +89,16 @@ jsonObject* osrfCacheGetObject( const char* key, ... ) { } char* osrfCacheGetString( const char* key, ... ) { + size_t val_len; + uint32_t flags; + memcached_return rc; if( key ) { VA_LIST_TO_STRING(key); - char* data = (char*) mc_aget(_osrfCache, VA_BUF, strlen(VA_BUF) ); + char* data = (char*) memcached_get(_osrfCache, VA_BUF, strlen(VA_BUF), &val_len, &flags, &rc); + if (rc != MEMCACHED_SUCCESS) { + osrfLogDebug(OSRF_LOG_MARK, "Failed to get key [%s] - %s", + VA_BUF, memcached_strerror(_osrfCache, rc)); + } osrfLogInternal( OSRF_LOG_MARK, "osrfCacheGetString(): Returning object (key=%s): %s", VA_BUF, data); if(!data) osrfLogDebug(OSRF_LOG_MARK, "No cache data exists with key %s", VA_BUF); return data; @@ -77,9 +108,15 @@ char* osrfCacheGetString( const char* key, ... ) { int osrfCacheRemove( const char* key, ... ) { + memcached_return rc; if( key ) { VA_LIST_TO_STRING(key); - return mc_delete(_osrfCache, VA_BUF, strlen(VA_BUF), 0 ); + rc = memcached_delete(_osrfCache, VA_BUF, strlen(VA_BUF), 0 ); + if (rc != MEMCACHED_SUCCESS && rc != MEMCACHED_BUFFERED) { + osrfLogDebug(OSRF_LOG_MARK, "Failed to delete key [%s] - %s", + VA_BUF, memcached_strerror(_osrfCache, rc)); + } + return 0; } return -1; } @@ -98,8 +135,9 @@ int osrfCacheSetExpire( time_t seconds, const char* key, ... ) { } void osrfCacheCleanup() { - if(_osrfCache) - mc_free(_osrfCache); + if(_osrfCache) { + memcached_free(_osrfCache); + } } -- 2.11.0