Comment #7 on issue 106 by [email protected]: binary protocol parsing can
cause memcached server lockup
http://code.google.com/p/memcached/issues/detail?id=106
Ok. 1.6.0-beta1 still suffer from this problem, the principle is similar.
Following patch solve it (I thought).
--- ./daemon/memcached.ori.c 2011-06-28 09:43:45.120000072 +0800
+++ ./daemon/memcached.c 2011-06-28 09:57:18.390999971 +0800
@@ -689,13 +689,19 @@
c->sasl_conn = NULL;
}
- c->engine_storage = NULL;
- c->tap_iterator = NULL;
- c->thread = NULL;
- assert(c->next == NULL);
- c->ascii_cmd = NULL;
- c->sfd = INVALID_SOCKET;
- c->tap_nack_mode = false;
+ if (IS_UDP(c->transport)) {
+ recvfrom(c->sfd, NULL, 0, 0, NULL, NULL);
+ conn_set_state(c, conn_new_cmd);
+ } else {
+ c->sfd = INVALID_SOCKET;
+ c->engine_storage = NULL;
+ c->tap_iterator = NULL;
+ c->thread = NULL;
+ assert(c->next == NULL);
+ c->ascii_cmd = NULL;
+ c->tap_nack_mode = false;
+ }
+
}
void conn_close(conn *c) {
@@ -4826,7 +4832,7 @@
res -= 8;
memmove(c->rbuf, c->rbuf + 8, res);
- c->rbytes += res;
+ c->rbytes = res;
c->rcurr = c->rbuf;
return READ_DATA_RECEIVED;
}