/*
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.
*/
memcached_return rc;
char buffer[MEMCACHED_MAX_BUFFER];
- if (ptr->root->flags & MEM_BINARY_PROTOCOL)
+ if (ptr->root->flags & MEM_BINARY_PROTOCOL)
{
protocol_binary_request_quit request = {.bytes= {0}};
request.message.header.request.magic = PROTOCOL_BINARY_REQ;
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
* closing the socket before all data is read
* results in server throwing away all data which is
memcached_server_response_reset(ptr);
}
- ptr->server_failure_counter++;
+ 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;
return TEST_SUCCESS;
}
+
+/*
+ * This tests ensures expected disconnections (for some behavior changes
+ * for instance) do not wrongly increase failure counter
+ */
+static test_return_t wrong_failure_counter_test(memcached_st *memc)
+{
+ memcached_return rc;
+
+ /* Set value to force connection to the server */
+ const char *key= "marmotte";
+ const char *value= "milka";
+ char *string = NULL;
+ size_t string_length;
+ uint32_t flags;
+
+ rc= memcached_set(memc, key, strlen(key),
+ value, strlen(value),
+ (time_t)0, (uint32_t)0);
+ assert(rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED);
+
+
+ /* put failure limit to 1 */
+ rc= memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_SERVER_FAILURE_LIMIT, 1);
+ assert(rc == MEMCACHED_SUCCESS);
+ /* Put a retry timeout to effectively activate failure_limit effect */
+ rc= memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_RETRY_TIMEOUT, 1);
+ assert(rc == MEMCACHED_SUCCESS);
+ /* change behavior that triggers memcached_quit()*/
+ rc= memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_TCP_NODELAY, 1);
+ assert(rc == MEMCACHED_SUCCESS);
+
+
+ /* Check if we still are connected */
+ string= memcached_get(memc, key, strlen(key),
+ &string_length, &flags, &rc);
+
+ assert(rc == MEMCACHED_SUCCESS);
+ assert(string);
+ free(string);
+
+ return TEST_SUCCESS;
+}
+
+
+
test_st udp_setup_server_tests[] ={
{"set_udp_behavior_test", 0, set_udp_behavior_test},
{"add_tcp_server_udp_client_test", 0, add_tcp_server_udp_client_test},
{"user_supplied_bug19", 1, user_supplied_bug19 },
{"user_supplied_bug20", 1, user_supplied_bug20 },
{"user_supplied_bug21", 1, user_supplied_bug21 },
+ {"wrong_failure_counter_test", 1, wrong_failure_counter_test},
{0, 0, 0}
};