Merging bzr://gaz.tangent.org/libmemcached/build/ to Build branch
[m6w6/libmemcached] / libmemcached / server.hpp
index 05b51f4fcbf098fbdda139b7a2f96a8f4b9c55d5..5d718949eaf5406d3496495422b834c6c5329f22 100644 (file)
 
 #pragma once
 
-#include <libmemcached/basic_string.h>
+#ifdef HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
+
+#include <cassert>
+
+memcached_server_st *__server_create_with(memcached_st *memc,
+                                          memcached_server_write_instance_st host,
+                                          const memcached_string_t& hostname,
+                                          const in_port_t port,
+                                          uint32_t weight,
+                                          const memcached_connection_t type);
+
+memcached_server_st *memcached_server_clone(memcached_server_st *destination,
+                                            memcached_server_st *source);
+
+memcached_return_t memcached_server_add_parsed(memcached_st *ptr,
+                                               const char *hostname,
+                                               size_t hostname_length,
+                                               in_port_t port,
+                                               uint32_t weight);
+
+void __server_free(memcached_server_st *);
 
 static inline bool memcached_is_valid_servername(const memcached_string_t& arg)
 {
   return arg.size > 0 or arg.size < NI_MAXHOST;
 }
 
-LIBMEMCACHED_LOCAL
-  memcached_server_st *__server_create_with(memcached_st *memc,
-                                            memcached_server_write_instance_st host,
-                                            const memcached_string_t& hostname,
-                                            const in_port_t port,
-                                            uint32_t weight,
-                                            const memcached_connection_t type);
+static inline void memcached_mark_server_as_clean(memcached_server_write_instance_st server)
+{
+  server->server_failure_counter= 0;
+  server->next_retry= 0;
+}
+
+
+static inline void set_last_disconnected_host(memcached_server_write_instance_st self)
+{
+  assert(self->root);
+  if (self->root == NULL)
+  {
+    return;
+  }
+
+  if (self->root->last_disconnected_server and self->root->last_disconnected_server->version == self->version)
+  {
+    return;
+  }
+
+  // const_cast
+  memcached_st *root= (memcached_st *)self->root;
+
+  memcached_server_free(root->last_disconnected_server);
+  root->last_disconnected_server= memcached_server_clone(NULL, self);
+  root->last_disconnected_server->version= self->version;
+}
+
+static inline void memcached_mark_server_for_timeout(memcached_server_write_instance_st server)
+{
+  if (server->state != MEMCACHED_SERVER_STATE_IN_TIMEOUT)
+  {
+    struct timeval next_time;
+    if (gettimeofday(&next_time, NULL) == 0)
+    {
+      server->next_retry= next_time.tv_sec +server->root->retry_timeout;
+    }
+    else
+    {
+      server->next_retry= 1; // Setting the value to 1 causes the timeout to occur immediatly
+    }
+
+    server->state= MEMCACHED_SERVER_STATE_IN_TIMEOUT;
+    if (server->server_failure_counter_query_id != server->root->query_id)
+    {
+      server->server_failure_counter++;
+      server->server_failure_counter_query_id= server->root->query_id;
+    }
+    set_last_disconnected_host(server);
+  }
+}