4 This closes all connections (forces flush of input as well).
6 Maybe add a host specific, or key specific version?
8 The reason we send "quit" is that in case we have buffered IO, this
9 will force data to be completed.
12 void memcached_quit_server(memcached_server_st
*ptr
, bool io_death
)
16 if (io_death
== false && ptr
->type
!= MEMCACHED_CONNECTION_UDP
&& ptr
->options
.is_shutting_down
== false)
18 memcached_return_t rc
;
19 char buffer
[MEMCACHED_MAX_BUFFER
];
21 ptr
->options
.is_shutting_down
= true;
23 if (ptr
->root
->flags
.binary_protocol
)
25 protocol_binary_request_quit request
= {.bytes
= {0}};
26 request
.message
.header
.request
.magic
= PROTOCOL_BINARY_REQ
;
27 request
.message
.header
.request
.opcode
= PROTOCOL_BINARY_CMD_QUIT
;
28 request
.message
.header
.request
.datatype
= PROTOCOL_BINARY_RAW_BYTES
;
29 rc
= memcached_do(ptr
, request
.bytes
, sizeof(request
.bytes
), true);
33 rc
= memcached_do(ptr
, "quit\r\n", strlen("quit\r\n"), true);
36 WATCHPOINT_ASSERT(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_FETCH_NOTFINISHED
);
37 (void)rc
; // Shut up ICC
39 /* read until socket is closed, or there is an error
40 * closing the socket before all data is read
41 * results in server throwing away all data which is
45 while (memcached_io_read(ptr
, buffer
, sizeof(buffer
)/sizeof(*buffer
),
46 &nread
) == MEMCACHED_SUCCESS
);
49 * memcached_io_read may call memcached_quit_server with io_death if
50 * it encounters problems, but we don't care about those occurences.
51 * The intention of that loop is to drain the data sent from the
52 * server to ensure that the server processed all of the data we
55 ptr
->server_failure_counter
= 0;
57 memcached_io_close(ptr
);
61 ptr
->write_buffer_offset
= (size_t) ((ptr
->type
== MEMCACHED_CONNECTION_UDP
) ? UDP_DATAGRAM_HEADER_LENGTH
: 0);
62 ptr
->read_buffer_length
= 0;
63 ptr
->read_ptr
= ptr
->read_buffer
;
64 ptr
->options
.is_shutting_down
= false;
65 memcached_server_response_reset(ptr
);
69 ptr
->server_failure_counter
++;
70 set_last_disconnected_host(ptr
);
74 void memcached_quit(memcached_st
*ptr
)
78 if (memcached_server_count(ptr
) == 0)
81 if (memcached_server_count(ptr
))
83 for (x
= 0; x
< memcached_server_count(ptr
); x
++)
85 memcached_server_write_instance_st instance
=
86 memcached_server_instance_fetch(ptr
, x
);
88 memcached_quit_server(instance
, false);