/*
This closes all connections (forces flush of input as well).
-
- Maybe add a host specific, or key specific version?
-
- The reason we send "quit" is that in case we have buffered IO, this
+
+ Maybe add a host specific, or key specific version?
+
+ The reason we send "quit" is that in case we have buffered IO, this
will force data to be completed.
*/
{
if (ptr->fd != -1)
{
- if (io_death == 0)
+ if (io_death == 0 && ptr->type != MEMCACHED_CONNECTION_UDP)
{
- memcached_return rc;
- ssize_t read_length;
+ memcached_return_t rc;
char buffer[MEMCACHED_MAX_BUFFER];
- rc= memcached_do(ptr, "quit\r\n", 6, 1);
+ if (ptr->root->flags.binary_protocol)
+ {
+ protocol_binary_request_quit request = {.bytes= {0}};
+ request.message.header.request.magic = PROTOCOL_BINARY_REQ;
+ request.message.header.request.opcode = PROTOCOL_BINARY_CMD_QUIT;
+ request.message.header.request.datatype = PROTOCOL_BINARY_RAW_BYTES;
+ rc= memcached_do(ptr, request.bytes, sizeof(request.bytes), 1);
+ }
+ else
+ rc= memcached_do(ptr, "quit\r\n", 6, 1);
+
WATCHPOINT_ASSERT(rc == MEMCACHED_SUCCESS || rc == MEMCACHED_FETCH_NOTFINISHED);
/* read until socket is closed, or there is an error
* results in server throwing away all data which is
* not read
*/
- while ((read_length=
- memcached_io_read(ptr, buffer, sizeof(buffer)/sizeof(*buffer)))
- > 0)
- {
- ;
- }
- memcached_io_close(ptr);
+ ssize_t nread;
+ while (memcached_io_read(ptr, buffer, sizeof(buffer)/sizeof(*buffer),
+ &nread) == MEMCACHED_SUCCESS);
+
+ /*
+ * memcached_io_read may call memcached_quit_server with io_death if
+ * it encounters problems, but we don't care about those occurences.
+ * The intention of that loop is to drain the data sent from the
+ * server to ensure that the server processed all of the data we
+ * sent to the server.
+ */
+ ptr->server_failure_counter= 0;
}
+ memcached_io_close(ptr);
ptr->fd= -1;
- ptr->write_buffer_offset= 0;
+ ptr->write_buffer_offset= (size_t) ((ptr->type == MEMCACHED_CONNECTION_UDP) ? UDP_DATAGRAM_HEADER_LENGTH : 0);
ptr->read_buffer_length= 0;
ptr->read_ptr= ptr->read_buffer;
memcached_server_response_reset(ptr);
}
+
+ if(io_death) ptr->server_failure_counter++;
}
void memcached_quit(memcached_st *ptr)
{
unsigned int x;
- if (ptr->hosts == NULL ||
+ if (ptr->hosts == NULL ||
ptr->number_of_hosts == 0)
return;