X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=src%2Fzoom-memcached.c;h=4ee605b03c5086a142bcbf7c2404b8cf20663913;hp=36546e3aa3923509e35b3cc1f1c9299ddd790ad6;hb=60f0955d87a511503ce48de0e99f697e112ff3d0;hpb=aee5f339aa17154788cd15bc3c373992e7f34de6 diff --git a/src/zoom-memcached.c b/src/zoom-memcached.c index 36546e3..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,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; @@ -115,19 +112,17 @@ static redisContext *create_redis(const char *conf) struct timeval timeout = { 1, 500000 }; /* 1.5 seconds */ char *host = darray[i] + 9; char *port = strchr(host, ':'); - char *weight = strstr(host, "/?"); if (port) *port++ = '\0'; - if (weight) - { - *weight = '\0'; - weight += 2; - } - 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; @@ -144,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); @@ -156,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, @@ -174,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, @@ -184,24 +178,14 @@ int ZOOM_memcached_configure(ZOOM_connection c) } memcached_behavior_set(c->mc_st, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL, 1); #else -#if HAVE_HIREDIS - c->redis_c = create_redis(val); - if (c->redis_c == 0 || c->redis_c->err) - { - ZOOM_set_error(c, ZOOM_ERROR_MEMCACHED, - "could not create redis"); - return -1; - } -#else ZOOM_set_error(c, ZOOM_ERROR_MEMCACHED, "not enabled"); return -1; #endif -#endif } return 0; } -#if HAVE_GCRYPT_H +#if HAVE_GCRYPT_H || HAVE_NETTLE static void wrbuf_vary_puts(WRBUF w, const char *v) { if (v) @@ -220,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(); @@ -290,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; @@ -336,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) { @@ -374,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; @@ -405,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)); @@ -456,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; @@ -466,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) { @@ -479,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; @@ -498,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, @@ -507,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, @@ -580,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();