X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=src%2Fzoom-memcached.c;h=4ee605b03c5086a142bcbf7c2404b8cf20663913;hp=828dca6bd07c9072003a80488106be6b659f27a0;hb=60f0955d87a511503ce48de0e99f697e112ff3d0;hpb=118a28603418dfc84a5c91463a1d02219e7e9941 diff --git a/src/zoom-memcached.c b/src/zoom-memcached.c index 828dca6..4ee605b 100644 --- a/src/zoom-memcached.c +++ b/src/zoom-memcached.c @@ -20,26 +20,21 @@ #include #include -#if HAVE_LIBMEMCACHED_MEMCACHED_H -#if HAVE_MEMCACHED_RETURN_T -#else -typedef memcached_return memcached_return_t; -#endif -#endif - void ZOOM_memcached_init(ZOOM_connection c) { -#if HAVE_LIBMEMCACHED_MEMCACHED_H +#if HAVE_LIBMEMCACHED c->mc_st = 0; #endif #if HAVE_HIREDIS c->redis_c = 0; #endif + c->expire_search = 600; + c->expire_record = 1200; } void ZOOM_memcached_destroy(ZOOM_connection c) { -#if HAVE_LIBMEMCACHED_MEMCACHED_H +#if HAVE_LIBMEMCACHED if (c->mc_st) memcached_free(c->mc_st); #endif @@ -49,13 +44,10 @@ void ZOOM_memcached_destroy(ZOOM_connection c) #endif } -#if HAVE_LIBMEMCACHED_MEMCACHED_H -/* memcached wrapper.. Because memcached function do not exist in older libs */ -static memcached_st *yaz_memcached_wrap(const char *conf) +#if HAVE_LIBMEMCACHED +static memcached_st *create_memcached(const char *conf, + int *expire_search, int *expire_record) { -#if HAVE_MEMCACHED_FUNC - return memcached(conf, strlen(conf)); -#else char **darray; int i, num; memcached_st *mc = memcached_create(0); @@ -86,6 +78,11 @@ static memcached_st *yaz_memcached_wrap(const char *conf) mc = 0; } } + else if (!yaz_strncasecmp(darray[i], "--EXPIRE=", 9)) + { + *expire_search = atoi(darray[i] + 9); + *expire_record = 600 + *expire_search; + } else { /* bad directive */ @@ -95,7 +92,40 @@ static memcached_st *yaz_memcached_wrap(const char *conf) } nmem_destroy(nmem); return mc; +} #endif + +#if HAVE_HIREDIS +static redisContext *create_redis(const char *conf, + int *expire_search, int *expire_record) +{ + char **darray; + int i, num; + NMEM nmem = nmem_create(); + redisContext *context = 0; + + nmem_strsplit_blank(nmem, conf, &darray, &num); + for (i = 0; i < num; i++) + { + if (!yaz_strncasecmp(darray[i], "--SERVER=", 9)) + { + struct timeval timeout = { 1, 500000 }; /* 1.5 seconds */ + char *host = darray[i] + 9; + char *port = strchr(host, ':'); + if (port) + *port++ = '\0'; + context = redisConnectWithTimeout(host, + port ? atoi(port) : 6379, + timeout); + } + else if (!yaz_strncasecmp(darray[i], "--EXPIRE=", 9)) + { + *expire_search = atoi(darray[i] + 9); + *expire_record = 600 + *expire_search; + } + } + nmem_destroy(nmem); + return context; } #endif @@ -109,7 +139,7 @@ int ZOOM_memcached_configure(ZOOM_connection c) c->redis_c = 0; } #endif -#if HAVE_LIBMEMCACHED_MEMCACHED_H +#if HAVE_LIBMEMCACHED if (c->mc_st) { memcached_free(c->mc_st); @@ -121,9 +151,8 @@ int ZOOM_memcached_configure(ZOOM_connection c) if (val && *val) { #if HAVE_HIREDIS - struct timeval timeout = { 1, 500000 }; /* 1.5 seconds */ - - c->redis_c = redisConnectWithTimeout(val, 6379, timeout); + c->redis_c = create_redis(val, + &c->expire_search, &c->expire_record); if (c->redis_c == 0 || c->redis_c->err) { ZOOM_set_error(c, ZOOM_ERROR_MEMCACHED, @@ -139,8 +168,8 @@ int ZOOM_memcached_configure(ZOOM_connection c) val = ZOOM_options_get(c->options, "memcached"); if (val && *val) { -#if HAVE_LIBMEMCACHED_MEMCACHED_H - c->mc_st = yaz_memcached_wrap(val); +#if HAVE_LIBMEMCACHED + c->mc_st = create_memcached(val, &c->expire_search, &c->expire_record); if (!c->mc_st) { ZOOM_set_error(c, ZOOM_ERROR_MEMCACHED, @@ -156,7 +185,7 @@ int ZOOM_memcached_configure(ZOOM_connection c) return 0; } -#if HAVE_GCRYPT_H +#if HAVE_GCRYPT_H || HAVE_NETTLE static void wrbuf_vary_puts(WRBUF w, const char *v) { if (v) @@ -175,7 +204,7 @@ static void wrbuf_vary_puts(WRBUF w, const char *v) void ZOOM_memcached_resultset(ZOOM_resultset r, ZOOM_query q) { -#if HAVE_GCRYPT_H +#if HAVE_GCRYPT_H || HAVE_NETTLE ZOOM_connection c = r->connection; r->mc_key = wrbuf_alloc(); @@ -245,10 +274,11 @@ void ZOOM_memcached_search(ZOOM_connection c, ZOOM_resultset resultset) ZOOM_connection_put_event(c, event); resultset->live_set = 1; } - freeReplyObject(reply); + if (reply) + freeReplyObject(reply); } #endif -#if HAVE_LIBMEMCACHED_MEMCACHED_H +#if HAVE_LIBMEMCACHED if (c->mc_st && resultset->live_set == 0) { size_t v_len; @@ -291,6 +321,28 @@ void ZOOM_memcached_search(ZOOM_connection c, ZOOM_resultset resultset) #endif } +#if HAVE_HIREDIS +static void expire_redis(redisContext *redis_c, + const char *buf, size_t len, int exp) +{ + redisReply *reply; + const char *argv[3]; + size_t argvlen[3]; + char key_val[20]; + + sprintf(key_val, "%d", exp); + + argv[0] = "EXPIRE"; + argvlen[0] = 6; + argv[1] = buf; + argvlen[1] = len; + argv[2] = key_val; + argvlen[2] = strlen(key_val); + reply = redisCommandArgv(redis_c, 3, argv, argvlen); + freeReplyObject(reply); +} +#endif + void ZOOM_memcached_hitcount(ZOOM_connection c, ZOOM_resultset resultset, Z_OtherInformation *oi, const char *precision) { @@ -329,15 +381,18 @@ void ZOOM_memcached_hitcount(ZOOM_connection c, ZOOM_resultset resultset, reply = redisCommandArgv(c->redis_c, 3, argv, argvlen); freeReplyObject(reply); } + expire_redis(c->redis_c, + wrbuf_buf(resultset->mc_key), + wrbuf_len(resultset->mc_key), + c->expire_search); odr_destroy(odr); } #endif -#if HAVE_LIBMEMCACHED_MEMCACHED_H +#if HAVE_LIBMEMCACHED if (c->mc_st && resultset->live_set == 0) { uint32_t flags = 0; memcached_return_t rc; - time_t expiration = 36000; char *str; ODR odr = odr_createmem(ODR_ENCODE); char *oi_buf = 0; @@ -360,7 +415,8 @@ void ZOOM_memcached_hitcount(ZOOM_connection c, ZOOM_resultset resultset, rc = memcached_set(c->mc_st, wrbuf_buf(resultset->mc_key), wrbuf_len(resultset->mc_key), - key, strlen(str) + 1 + oi_len, expiration, flags); + key, strlen(str) + 1 + oi_len, + c->expire_search, flags); yaz_log(YLOG_LOG, "Store hit count key=%s value=%s oi_len=%d rc=%u %s", wrbuf_cstr(resultset->mc_key), str, oi_len, (unsigned) rc, memcached_strerror(c->mc_st, rc)); @@ -411,6 +467,9 @@ void ZOOM_memcached_add(ZOOM_resultset r, Z_NamePlusRecord *npr, wrbuf_cstr(k), wrbuf_cstr(rec_sha1)); freeReplyObject(reply); + expire_redis(r->connection->redis_c, argv[1], argvlen[1], + r->connection->expire_search); + argv[1] = wrbuf_buf(rec_sha1); argvlen[1] = wrbuf_len(rec_sha1); argv[2] = rec_buf; @@ -421,12 +480,15 @@ void ZOOM_memcached_add(ZOOM_resultset r, Z_NamePlusRecord *npr, wrbuf_cstr(rec_sha1), rec_len); freeReplyObject(reply); + expire_redis(r->connection->redis_c, argv[1], argvlen[1], + r->connection->expire_record); + odr_destroy(odr); wrbuf_destroy(k); wrbuf_destroy(rec_sha1); } #endif -#if HAVE_LIBMEMCACHED_MEMCACHED_H +#if HAVE_LIBMEMCACHED if (r->connection->mc_st && !diag && npr->which == Z_NamePlusRecord_databaseRecord) { @@ -434,7 +496,6 @@ void ZOOM_memcached_add(ZOOM_resultset r, Z_NamePlusRecord *npr, WRBUF rec_sha1 = wrbuf_alloc(); uint32_t flags = 0; memcached_return_t rc; - time_t expiration = 36000; ODR odr = odr_createmem(ODR_ENCODE); char *rec_buf; int rec_len; @@ -453,7 +514,7 @@ void ZOOM_memcached_add(ZOOM_resultset r, Z_NamePlusRecord *npr, rc = memcached_set(r->connection->mc_st, wrbuf_buf(k), wrbuf_len(k), wrbuf_buf(rec_sha1), wrbuf_len(rec_sha1), - expiration, flags); + r->connection->expire_search, flags); yaz_log(YLOG_LOG, "Store record key=%s val=%s rc=%u %s", wrbuf_cstr(k), wrbuf_cstr(rec_sha1), (unsigned) rc, @@ -462,7 +523,7 @@ void ZOOM_memcached_add(ZOOM_resultset r, Z_NamePlusRecord *npr, rc = memcached_add(r->connection->mc_st, wrbuf_buf(rec_sha1), wrbuf_len(rec_sha1), rec_buf, rec_len, - expiration, flags); + r->connection->expire_record, flags); yaz_log(YLOG_LOG, "Add record key=%s rec_len=%d rc=%u %s", wrbuf_cstr(rec_sha1), rec_len, (unsigned) rc, @@ -535,7 +596,7 @@ Z_NamePlusRecord *ZOOM_memcached_lookup(ZOOM_resultset r, int pos, freeReplyObject(reply1); } #endif -#if HAVE_LIBMEMCACHED_MEMCACHED_H +#if HAVE_LIBMEMCACHED if (r->connection && r->connection->mc_st) { WRBUF k = wrbuf_alloc();