diff --git a/libmemcache/src/memcache.c b/libmemcache/src/memcache.c index 227758d..b927b40 100644 --- a/libmemcache/src/memcache.c +++ b/libmemcache/src/memcache.c @@ -978,17 +978,17 @@ mcm_err(const struct memcache_ctxt *ctxt, const u_int32_t flags, const char *fun int mcm_err_filter_add(struct memcache_ctxt *ctxt, const u_int32_t err_mask) { - if ((ctxt->MCM_ERR_MASK & err_mask) == ctxt->MCM_ERR_MASK) + if ((ctxt->MCM_ERR_MASK & err_mask) == err_mask) return 0; - ctxt->MCM_ERR_MASK &= err_mask; + ctxt->MCM_ERR_MASK != err_mask; return 1; } int mcm_err_filter_del(struct memcache_ctxt *ctxt, const u_int32_t err_mask) { - if ((ctxt->MCM_ERR_MASK & err_mask) == ctxt->MCM_ERR_MASK) + if ((ctxt->MCM_ERR_MASK & err_mask) == 0) return 0; ctxt->MCM_ERR_MASK &= ~err_mask; @@ -1131,6 +1131,9 @@ mcm_fetch_cmd(struct memcache_ctxt *ctxt, struct memcache *mc, struct memcache_r /* Even though we haven't sent the request, mark the response as * having been attempted. */ res->_flags |= MCM_RES_ATTEMPTED; + /* This res might have been used before, so reset found flag */ + res->_flags &= ~MCM_RES_FOUND; + /* While we're looping, might as well see if we should be auto * deleting any of these keys. */ diff --git a/libmemcache/test/benchmark/benchmark.c b/libmemcache/test/benchmark/benchmark.c index 259f7ca..b6e6c21 100644 --- a/libmemcache/test/benchmark/benchmark.c +++ b/libmemcache/test/benchmark/benchmark.c @@ -70,7 +70,7 @@ main(int argc, char *argv[]) { tests = strdup(argv[3]); if (tests == NULL) - tests = strdup("adgs"); + tests = strdup("adgGs"); if (valsize == 0) valsize = 50; @@ -138,6 +138,30 @@ main(int argc, char *argv[]) { printf(fmt, "get", num_tests / tt(&t1, &t2), tt(&t1, &t2), tt(&t1, &t2) / num_tests); } + /* same get benchmark, but with overhead for each request. */ + if (strchr(tests, (int)'G') != NULL) { + /* BEGIN get request */ + if (gettimeofday(&t1, NULL) != 0) + err(EX_OSERR, "gettimeofday(2)"); + + for (i = 0; i < num_tests; i) { + req = mc_req_new(); + res = mc_req_add(req, key, keylen); + res->size = valsize; + res->val = malloc(res->size); + mc_res_free_on_delete(res, 1); + + mc_get(mc, req); + mc_req_free(req); + } + + if (gettimeofday(&t2, NULL) != 0) + err(EX_OSERR, "gettimeofday(2)"); + + /* END get test */ + printf(fmt, "fget", num_tests / tt(&t1, &t2), tt(&t1, &t2), tt(&t1, &t2) / num_tests); + } + if (strchr(tests, 'a') != NULL || strchr(tests, 'd') != NULL) { diff --git a/libmemcache/test/regress/regress.c b/libmemcache/test/regress/regress.c index 71b4cfe..7d8df87 100644 --- a/libmemcache/test/regress/regress.c +++ b/libmemcache/test/regress/regress.c @@ -33,6 +33,7 @@ #include #include #include +#include #include @@ -70,8 +71,14 @@ main(int argc, char *argv[]) { num_tests = 10; mc = mc_new(); - mc_err_filter_del(MCM_ERR_LVL_INFO); - mc_err_filter_del(MCM_ERR_LVL_NOTICE); + + /* test filter add/del and make sure info and level are NOT filtered out */ + assert(mc_err_filter_del(MCM_ERR_LVL_INFO) == 0); + assert(mc_err_filter_del(MCM_ERR_LVL_NOTICE) == 0); + assert(mc_err_filter_add(MCM_ERR_LVL_NOTICE) == 1); + assert(mc_err_filter_add(MCM_ERR_LVL_NOTICE) == 0); + assert(mc_err_filter_del(MCM_ERR_LVL_NOTICE) == 1); + assert(mc_err_filter_get() == 0); if (mc == NULL) err(EX_OSERR, "Unable to allocate a new memcache object");