3 memcached_return_t
memcached_purge(memcached_server_write_instance_st ptr
)
5 memcached_return_t ret
= MEMCACHED_SUCCESS
;
6 memcached_st
*root
= (memcached_st
*)ptr
->root
;
8 if (memcached_is_purging(ptr
->root
) || /* already purging */
9 (memcached_server_response_count(ptr
) < ptr
->root
->io_msg_watermark
&&
10 ptr
->io_bytes_sent
< ptr
->root
->io_bytes_watermark
) ||
11 (ptr
->io_bytes_sent
>= ptr
->root
->io_bytes_watermark
&&
12 memcached_server_response_count(ptr
) < 2))
14 return MEMCACHED_SUCCESS
;
17 /* memcached_io_write and memcached_response may call memcached_purge
18 so we need to be able stop any recursion.. */
19 memcached_set_purging(root
, true);
21 WATCHPOINT_ASSERT(ptr
->fd
!= -1);
22 /* Force a flush of the buffer to ensure that we don't have the n-1 pending
23 requests buffered up.. */
24 if (memcached_io_write(ptr
, NULL
, 0, true) == -1)
26 memcached_set_purging(root
, true);
28 return memcached_set_error(*ptr
, MEMCACHED_WRITE_FAILURE
, MEMCACHED_AT
);
30 WATCHPOINT_ASSERT(ptr
->fd
!= -1);
32 uint32_t no_msg
= memcached_server_response_count(ptr
) - 1;
35 memcached_result_st result
;
36 memcached_result_st
*result_ptr
;
37 char buffer
[SMALL_STRING_LEN
];
40 * We need to increase the timeout, because we might be waiting for
41 * data to be sent from the server (the commands was in the output buffer
44 const int32_t timeo
= ptr
->root
->poll_timeout
;
45 root
->poll_timeout
= 2000;
47 result_ptr
= memcached_result_create(root
, &result
);
48 WATCHPOINT_ASSERT(result_ptr
);
50 for (uint32_t x
= 0; x
< no_msg
; x
++)
52 memcached_result_reset(result_ptr
);
53 memcached_return_t rc
= memcached_read_one_response(ptr
, buffer
,
57 * Purge doesn't care for what kind of command results that is received.
58 * The only kind of errors I care about if is I'm out of sync with the
59 * protocol or have problems reading data from the network..
61 if (rc
== MEMCACHED_PROTOCOL_ERROR
|| rc
== MEMCACHED_UNKNOWN_READ_FAILURE
)
65 memcached_io_reset(ptr
);
66 memcached_set_error(*ptr
, rc
, MEMCACHED_AT
);
69 if (ptr
->root
->callbacks
!= NULL
)
71 memcached_callback_st cb
= *ptr
->root
->callbacks
;
72 if (rc
== MEMCACHED_SUCCESS
)
74 for (uint32_t y
= 0; y
< cb
.number_of_callback
; y
++)
76 rc
= (*cb
.callback
[y
])(ptr
->root
, result_ptr
, cb
.context
);
77 if (rc
!= MEMCACHED_SUCCESS
)
84 memcached_result_free(result_ptr
);
85 root
->poll_timeout
= timeo
;
87 memcached_set_purging(root
, false);