diff --git a/include/lighttpd/memcached.h b/include/lighttpd/memcached.h index 37962d0..eca7a74 100644 --- a/include/lighttpd/memcached.h +++ b/include/lighttpd/memcached.h @@ -38,6 +38,7 @@ LI_API GQuark li_memcached_error_quark(); typedef enum { LI_MEMCACHED_CONNECTION, LI_MEMCACHED_BAD_KEY, + LI_MEMCACHED_DISABLED, /* disabled right now */ LI_MEMCACHED_UNKNOWN = 0xff } liMemcachedError; diff --git a/src/common/memcached.c b/src/common/memcached.c index 9ee6fb0..5709dbd 100644 --- a/src/common/memcached.c +++ b/src/common/memcached.c @@ -223,6 +223,9 @@ static void cancel_all_requests(liMemcachedCon *con) { } if (req->req.callback) req->req.callback(&req->req, LI_MEMCACHED_RESULT_ERROR, NULL, &err); + + if (err1) err1->code = LI_MEMCACHED_DISABLED; /* "silent" fail */ + if (con->err) con->err->code = LI_MEMCACHED_DISABLED; /* "silent" fail */ } if (NULL != err) g_clear_error(&err); @@ -255,7 +258,14 @@ static void memcached_connect(liMemcachedCon *con) { s = con->con_watcher.fd; if (-1 == s) { /* reconnect limit */ - if (ev_now(con->loop) < con->last_con_start + 1) return; + if (ev_now(con->loop) < con->last_con_start + 1) { + if (con->err) { + con->err->code = LI_MEMCACHED_DISABLED; + } else { + g_set_error(&con->err, LI_MEMCACHED_ERROR, LI_MEMCACHED_DISABLED, "Disabled right now"); + } + return; + } con->last_con_start = ev_now(con->loop); do { @@ -838,7 +848,7 @@ liMemcachedRequest* li_memcached_get(liMemcachedCon *con, GString *key, liMemcac if (-1 == con->fd) memcached_connect(con); if (-1 == con->fd) { if (NULL == con->err) { - g_set_error(err, LI_MEMCACHED_ERROR, LI_MEMCACHED_CONNECTION, "Not connected"); + g_set_error(err, LI_MEMCACHED_ERROR, LI_MEMCACHED_DISABLED, "Not connected"); } else if (err) { *err = g_error_copy(con->err); } @@ -871,7 +881,7 @@ liMemcachedRequest* li_memcached_set(liMemcachedCon *con, GString *key, guint32 if (-1 == con->fd) memcached_connect(con); if (-1 == con->fd) { if (NULL == con->err) { - g_set_error(err, LI_MEMCACHED_ERROR, LI_MEMCACHED_CONNECTION, "Not connected"); + g_set_error(err, LI_MEMCACHED_ERROR, LI_MEMCACHED_DISABLED, "Not connected"); } else if (err) { *err = g_error_copy(con->err); } diff --git a/src/modules/mod_memcached.c b/src/modules/mod_memcached.c index b3b9960..896d69b 100644 --- a/src/modules/mod_memcached.c +++ b/src/modules/mod_memcached.c @@ -377,7 +377,9 @@ static liHandlerResult mc_handle_lookup(liVRequest *vr, gpointer param, gpointer if (NULL == req->req) { if (NULL != err) { - VR_ERROR(vr, "memcached.lookup: get failed: %s", err->message); + if (LI_MEMCACHED_DISABLED != err->code) { + VR_ERROR(vr, "memcached.lookup: get failed: %s", err->message); + } g_clear_error(&err); } else { VR_ERROR(vr, "memcached.lookup: get failed: %s", "Unkown error"); @@ -498,7 +500,9 @@ static liHandlerResult memcache_store_filter(liVRequest *vr, liFilter *f) { if (NULL == req) { if (NULL != err) { - VR_ERROR(vr, "memcached.store: set failed: %s", err->message); + if (LI_MEMCACHED_DISABLED != err->code) { + VR_ERROR(vr, "memcached.store: set failed: %s", err->message); + } g_clear_error(&err); } else { VR_ERROR(vr, "memcached.store: set failed: %s", "Unkown error");