X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=libmemcached%2Fmemcached_io.c;h=2431ac744b24f1353b03da2433113b2e3748da24;hb=99ba76f7596ab5b861e68034ae3007cccf73a5d2;hp=0624487f5ce8bdcc3f1ed8fd42c95c543a5c7ae4;hpb=b7f043ada7b39b3e9e244a7f6864a31cd08ad650;p=awesomized%2Flibmemcached diff --git a/libmemcached/memcached_io.c b/libmemcached/memcached_io.c index 0624487f..2431ac74 100644 --- a/libmemcached/memcached_io.c +++ b/libmemcached/memcached_io.c @@ -99,7 +99,6 @@ ssize_t memcached_io_read(memcached_server_st *ptr, while (length) { - uint8_t found_eof= 0; if (!ptr->read_buffer_length) { ssize_t data_read; @@ -136,8 +135,17 @@ ssize_t memcached_io_read(memcached_server_st *ptr, } else { - found_eof= 1; - break; + /* + EOF. Any data received so far is incomplete + so discard it. This always reads by byte in case of TCP + and protocol enforcement happens at memcached_response() + looking for '\n'. We do not care for UDB which requests 8 bytes + at once. Generally, this means that connection went away. Since + for blocking I/O we do not return 0 and for non-blocking case + it will return EGAIN if data is not immediatly available. + */ + memcached_quit_server(ptr, 1); + return -1; } } @@ -167,9 +175,6 @@ ssize_t memcached_io_read(memcached_server_st *ptr, buffer_ptr++; break; } - - if (found_eof) - break; } return (size_t)(buffer_ptr - (char*)buffer); @@ -234,16 +239,19 @@ memcached_return memcached_io_close(memcached_server_st *ptr) return MEMCACHED_SUCCESS; /* in case of death shutdown to avoid blocking at close() */ - r= shutdown(ptr->fd, SHUT_RDWR); + if (1) + { + r= shutdown(ptr->fd, SHUT_RDWR); #ifdef HAVE_DEBUG - if (r && errno != ENOTCONN) - { - WATCHPOINT_NUMBER(ptr->fd); - WATCHPOINT_ERRNO(errno); - WATCHPOINT_ASSERT(errno); - } + if (r && errno != ENOTCONN) + { + WATCHPOINT_NUMBER(ptr->fd); + WATCHPOINT_ERRNO(errno); + WATCHPOINT_ASSERT(errno); + } #endif + } r= close(ptr->fd); #ifdef HAVE_DEBUG