X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=src%2Fzoom-memcached.c;h=332f5ab33e8a8ca8bfc4a77468ec0e11b98d30fe;hp=def2ac97228fac75f6460145427f41452e1ec3f0;hb=35c32d033bf5d7201cb72a68d88e118e1851dc40;hpb=19cf946139df0a0606e590859fb6e98a09369f5b diff --git a/src/zoom-memcached.c b/src/zoom-memcached.c index def2ac9..332f5ab 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,12 +92,12 @@ static memcached_st *yaz_memcached_wrap(const char *conf) } nmem_destroy(nmem); return mc; -#endif } #endif #if HAVE_HIREDIS -static redisContext *create_redis(const char *conf) +static redisContext *create_redis(const char *conf, + int *expire_search, int *expire_record) { char **darray; int i, num; @@ -121,6 +118,11 @@ static redisContext *create_redis(const char *conf) 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; @@ -137,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); @@ -149,7 +151,8 @@ int ZOOM_memcached_configure(ZOOM_connection c) if (val && *val) { #if HAVE_HIREDIS - c->redis_c = create_redis(val); + 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, @@ -165,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, @@ -271,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; @@ -317,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) { @@ -355,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; @@ -386,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)); @@ -437,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; @@ -447,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) { @@ -460,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; @@ -479,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, @@ -488,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, @@ -561,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();