Use TCP_CORK/TCP_NOFLUSH socket options where available to coalesce writes for multi...
[awesomized/libmemcached] / libmemcached / memcached_server.c
1 /*
2 This is a partial implementation for fetching/creating memcached_server_st objects.
3 */
4 #include "common.h"
5
6 memcached_server_st *memcached_server_create(memcached_st *memc, memcached_server_st *ptr)
7 {
8 if (ptr == NULL)
9 {
10 ptr= (memcached_server_st *)calloc(1, sizeof(memcached_server_st));
11
12 if (!ptr)
13 return NULL; /* MEMCACHED_MEMORY_ALLOCATION_FAILURE */
14
15 ptr->is_allocated= true;
16 }
17 else
18 memset(ptr, 0, sizeof(memcached_server_st));
19
20 ptr->root= memc;
21
22 return ptr;
23 }
24
25 memcached_server_st *memcached_server_create_with(memcached_st *memc, memcached_server_st *host,
26 const char *hostname, unsigned int port,
27 uint32_t weight, memcached_connection type)
28 {
29 host= memcached_server_create(memc, host);
30
31 if (host == NULL)
32 return NULL;
33
34 strncpy(host->hostname, hostname, MEMCACHED_MAX_HOST_LENGTH - 1);
35 host->root= memc ? memc : NULL;
36 host->port= port;
37 host->weight= weight;
38 host->fd= -1;
39 host->type= type;
40 host->read_ptr= host->read_buffer;
41 host->is_corked= 0;
42 if (memc)
43 host->next_retry= memc->retry_timeout;
44 if (type == MEMCACHED_CONNECTION_UDP)
45 {
46 host->write_buffer_offset= UDP_DATAGRAM_HEADER_LENGTH;
47 memcached_io_init_udp_header(host, 0);
48 }
49
50 return host;
51 }
52
53 void memcached_server_free(memcached_server_st *ptr)
54 {
55 memcached_quit_server(ptr, 0);
56
57 if (ptr->cached_server_error)
58 free(ptr->cached_server_error);
59
60 if (ptr->address_info)
61 freeaddrinfo(ptr->address_info);
62
63 if (ptr->is_allocated)
64 ptr->root->call_free(ptr->root, ptr);
65 else
66 memset(ptr, 0, sizeof(memcached_server_st));
67 }
68
69 /*
70 If we do not have a valid object to clone from, we toss an error.
71 */
72 memcached_server_st *memcached_server_clone(memcached_server_st *clone, memcached_server_st *ptr)
73 {
74 memcached_server_st *rv= NULL;
75
76 /* We just do a normal create if ptr is missing */
77 if (ptr == NULL)
78 return NULL;
79
80 rv = memcached_server_create_with(ptr->root, clone,
81 ptr->hostname, ptr->port, ptr->weight,
82 ptr->type);
83 if (rv != NULL)
84 {
85 rv->cached_errno= ptr->cached_errno;
86 if (ptr->cached_server_error)
87 rv->cached_server_error= strdup(ptr->cached_server_error);
88 }
89
90 return rv;
91
92 }
93
94 memcached_return memcached_server_cursor(memcached_st *ptr,
95 memcached_server_function *callback,
96 void *context,
97 unsigned int number_of_callbacks)
98 {
99 unsigned int y;
100
101 for (y= 0; y < ptr->number_of_hosts; y++)
102 {
103 unsigned int x;
104
105 for (x= 0; x < number_of_callbacks; x++)
106 {
107 unsigned int iferror;
108
109 iferror= (*callback[x])(ptr, &ptr->hosts[y], context);
110
111 if (iferror)
112 continue;
113 }
114 }
115
116 return MEMCACHED_SUCCESS;
117 }
118
119 memcached_server_st *memcached_server_by_key(memcached_st *ptr, const char *key, size_t key_length, memcached_return *error)
120 {
121 uint32_t server_key;
122
123 *error= memcached_validate_key_length(key_length,
124 ptr->flags & MEM_BINARY_PROTOCOL);
125 unlikely (*error != MEMCACHED_SUCCESS)
126 return NULL;
127
128 unlikely (ptr->number_of_hosts == 0)
129 {
130 *error= MEMCACHED_NO_SERVERS;
131 return NULL;
132 }
133
134 if ((ptr->flags & MEM_VERIFY_KEY) && (memcached_key_test((const char **)&key, &key_length, 1) == MEMCACHED_BAD_KEY_PROVIDED))
135 {
136 *error= MEMCACHED_BAD_KEY_PROVIDED;
137 return NULL;
138 }
139
140 server_key= memcached_generate_hash(ptr, key, key_length);
141
142 return memcached_server_clone(NULL, &ptr->hosts[server_key]);
143
144 }
145
146 const char *memcached_server_error(memcached_server_st *ptr)
147 {
148 if (ptr)
149 return ptr->cached_server_error;
150 else
151 return NULL;
152 }
153
154 void memcached_server_error_reset(memcached_server_st *ptr)
155 {
156 ptr->cached_server_error[0]= 0;
157 }
158
159 memcached_server_st *memcached_server_get_last_disconnect(memcached_st *ptr)
160 {
161 return ptr->last_disconnected_server;
162 }