示例#1
0
文件: memcache.cpp 项目: bradenwu/oce
bool FriendOfFriendMemcache::SetServers(const char *servers_string)
{
  bool result = true;

  pthread_mutex_lock(&this->memcache_lock_);

  if (this->handle_ == NULL) {
    this->handle_ = memcached_create(NULL);
  } else {
    memcached_servers_reset(this->handle_);
  }

  memcached_return_t ret;

  memcached_server_list_st servers = memcached_servers_parse(servers_string);
  if (servers == NULL) {
    MCE_FATAL("Invalid servers_string: `" << servers_string);
    result = false;
    goto _exit;
  }

  ret = memcached_server_push(this->handle_, servers);
  memcached_server_free(servers);
  if (ret != MEMCACHED_SUCCESS) {
    MCE_FATAL("Unable to push servers info memcached handler: " << memcached_strerror(this->handle_, ret));
    result = false;
    goto _exit;
  }

  ret = memcached_behavior_set(this->handle_, MEMCACHED_BEHAVIOR_KETAMA, 1);
  if (ret != MEMCACHED_SUCCESS) {
    MCE_FATAL("Unable to switch to the consistent hashing: " << memcached_strerror(this->handle_, ret));
    result = false;
    goto _exit;
  }

_exit:
  pthread_mutex_unlock(&memcache_lock_);
  return result;
}
示例#2
0
static int mcache_ping_servers(pr_memcache_t *mcache) {
  memcached_server_st *alive_server_list;
  memcached_return res;
  memcached_st *clone;
  uint32_t server_count;
  register unsigned int i;

  /* We always start with the configured list of servers. */
  clone = memcached_clone(NULL, mcache->mc);
  if (clone == NULL) {
    errno = ENOMEM;
    return -1;
  }

  memcached_servers_reset(clone);

  /* Bug#4242: Don't use memcached_server_push() if we're using
   * libmemcached-1.0.18 or earlier.  Doing so leads to a segfault, due to
   * this libmemcached bug:
   *
   *  https://bugs.launchpad.net/libmemcached/+bug/1154159
   */
#if LIBMEMCACHED_VERSION_HEX > 0x01000018
  memcached_server_push(clone, configured_server_list);
#endif

  server_count = memcached_server_count(clone);
  pr_trace_msg(trace_channel, 16,
    "pinging %lu memcached %s", (unsigned long) server_count,
    server_count != 1 ? "servers" : "server");

  alive_server_list = NULL;
  for (i = 0; i < server_count; i++) {
    memcached_server_instance_st server;

    server = memcached_server_instance_by_position(clone, i);

    pr_trace_msg(trace_channel, 17, "pinging server %s:%d",
      memcached_server_name(server), memcached_server_port(server));

    if (libmemcached_util_ping(memcached_server_name(server),
        memcached_server_port(server), &res) == FALSE) {
      pr_trace_msg(trace_channel, 4,
        "error pinging %s:%d: %s", memcached_server_name(server),
        memcached_server_port(server), memcached_strerror(clone, res));

    } else {
      pr_trace_msg(trace_channel, 17, "server %s:%d is alive",
        memcached_server_name(server), memcached_server_port(server));

       alive_server_list = memcached_server_list_append(alive_server_list,    
         memcached_server_name(server), memcached_server_port(server), &res);
       if (alive_server_list == NULL) {
         pr_trace_msg(trace_channel, 1,
           "error appending server %s:%d to list: %s",
           memcached_server_name(server), memcached_server_port(server),
           memcached_strerror(clone, res));

         memcached_free(clone);
         errno = EPERM;
         return -1;
       }
    }
  }

  if (alive_server_list != NULL) {
    memcached_servers_reset(mcache->mc);
    res = memcached_server_push(mcache->mc, alive_server_list);
    if (res != MEMCACHED_SUCCESS) {
      unsigned int count;

      count = memcached_server_list_count(alive_server_list);
      pr_trace_msg(trace_channel, 2,
        "error adding %u alive memcached %s to connection: %s",
        count, count != 1 ? "servers" : "server",
        memcached_strerror(mcache->mc, res));
      memcached_free(clone);
 
      errno = EPERM;
      return -1;

    } else {
      unsigned int count;

      count = memcached_server_list_count(alive_server_list);
      pr_trace_msg(trace_channel, 9,
        "now using %d alive memcached %s", count,
        count != 1 ? "servers" : "server");

      memcached_server_list_free(alive_server_list);
    }
  }

  memcached_free(clone);
  return 0;
}