Transition from libmemcache to libmemcached - an actively maintained memcached client...
authordbs <dbs@9efc2488-bf62-4759-914b-345cdb29e865>
Thu, 10 Dec 2009 05:09:53 +0000 (05:09 +0000)
committerdbs <dbs@9efc2488-bf62-4759-914b-345cdb29e865>
Thu, 10 Dec 2009 05:09:53 +0000 (05:09 +0000)
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
include/opensrf/osrf_cache.h
src/extras/Makefile.install
src/libopensrf/Makefile.am
src/libopensrf/osrf_cache.c

index 4e1fd16..00bcddc 100644 (file)
@@ -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.
index 6b54f50..591b3a8 100644 (file)
@@ -17,7 +17,7 @@ GNU General Public License for more details.
 #define OSRF_CACHE_H
 
 #include <opensrf/osrf_json.h>
-#include <memcache.h>
+#include <libmemcached/memcached.h>
 #include <opensrf/log.h>
 
 #ifdef __cplusplus
index 7dbd931..3b166fd 100644 (file)
@@ -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:    
index 6c8c723..1cc92bf 100644 (file)
@@ -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)
 
index e88ae00..c19354a 100644 (file)
@@ -15,19 +15,30 @@ GNU General Public License for more details.
 
 #include <opensrf/osrf_cache.h>
 
-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);
+       }
 }