uint16_t *flags,
memcached_return *error)
{
- size_t send_length;
+ size_t send_length, sent_length;
char buffer[MEMCACHED_DEFAULT_COMMAND_SIZE];
char *string_ptr;
+ unsigned int server_key;
+ *value_length= 0;
*error= memcached_connect(ptr);
if (*error != MEMCACHED_SUCCESS)
return NULL;
+ server_key= memcached_generate_hash(key, key_length) % ptr->number_of_hosts;
+
send_length= snprintf(buffer, MEMCACHED_DEFAULT_COMMAND_SIZE, "get %.*s\r\n",
- key_length, key);
- if (*error != MEMCACHED_SUCCESS)
+ (int)key_length, key);
+
+ if (send_length >= MEMCACHED_DEFAULT_COMMAND_SIZE)
+ {
+ *error= MEMCACHED_WRITE_FAILURE;
+ return NULL;
+ }
+
+ sent_length= write(ptr->hosts[server_key].fd, buffer, send_length);
+
+ if (sent_length == -1)
+ {
+ fprintf(stderr, "error %s: write: %m\n", __FUNCTION__);
+ *error= MEMCACHED_WRITE_FAILURE;
return NULL;
+ }
- if ((send(ptr->hosts[0].fd, buffer, send_length, 0) == -1))
+ if (sent_length != send_length)
{
- fprintf(stderr, "failed fetch on %.*s TCP\n", key_length+1, key);
+ fprintf(stderr, "error %s: short write %d %d: %m\n",
+ __FUNCTION__, sent_length, send_length);
*error= MEMCACHED_WRITE_FAILURE;
return NULL;
}
memset(buffer, 0, MEMCACHED_DEFAULT_COMMAND_SIZE);
- *error= memcached_response(ptr, buffer, MEMCACHED_DEFAULT_COMMAND_SIZE);
+ *error= memcached_response(ptr, buffer, MEMCACHED_DEFAULT_COMMAND_SIZE, server_key);
if (*error == MEMCACHED_SUCCESS)
{
need_to_read= *value_length - need_to_copy;
- read_length= read(ptr->hosts[0].fd, pos_ptr, need_to_read);
+ read_length= read(ptr->hosts[server_key].fd, pos_ptr, need_to_read);
if (read_length != need_to_read)
{
free(value);