// Generate a new Memcache Client func newMC(servers []string, config util.JsMap, logger *util.HekaLogger) (mc gomc.Client) { var err error /* if mcsPoolSize >= mcsMaxPoolSize { return nil } */ mc, err = gomc.NewClient(servers, 1, gomc.ENCODING_GOB) if err != nil { logger.Critical("storage", "CRITICAL HIT!", util.Fields{"error": err.Error()}) } // internally hash key using MD5 (for key distribution) mc.SetBehavior(gomc.BEHAVIOR_KETAMA_HASH, 1) // Use the binary protocol, which allows us faster data xfer // and better data storage (can use full UTF-8 char space) mc.SetBehavior(gomc.BEHAVIOR_BINARY_PROTOCOL, 1) //mc.SetBehavior(gomc.BEHAVIOR_NO_BLOCK, 1) // NOTE! do NOT set BEHAVIOR_NOREPLY + Binary. This will cause // libmemcache to drop into an infinite loop. if v, ok := config["memcache.recv_timeout"]; ok { d, err := time.ParseDuration(v.(string)) if err == nil { mc.SetBehavior(gomc.BEHAVIOR_SND_TIMEOUT, uint64(d.Nanoseconds()*1000)) } } if v, ok := config["memcache.send_timeout"]; ok { d, err := time.ParseDuration(v.(string)) if err == nil { mc.SetBehavior(gomc.BEHAVIOR_RCV_TIMEOUT, uint64(d.Nanoseconds()*1000)) } } if v, ok := config["memcache.poll_timeout"]; ok { d, err := time.ParseDuration(v.(string)) if err == nil { mc.SetBehavior(gomc.BEHAVIOR_POLL_TIMEOUT, uint64(d.Nanoseconds()*1000)) } } if v, ok := config["memcache.retry_timeout"]; ok { d, err := time.ParseDuration(v.(string)) if err == nil { mc.SetBehavior(gomc.BEHAVIOR_RETRY_TIMEOUT, uint64(d.Nanoseconds()*1000)) } } atomic.AddInt32(&mcsPoolSize, 1) return mc }
// Creates and configures a memcached client connection. func (s *EmceeStore) newClient() (mc.Client, error) { if len(s.Hosts) == 0 { return nil, ErrNoNodes } client, err := mc.NewClient(s.Hosts, 1, mc.ENCODING_GOB) if err != nil { return nil, err } // internally hash key using MD5 (for key distribution) if err := client.SetBehavior(mc.BEHAVIOR_KETAMA_HASH, 1); err != nil { client.Close() return nil, err } // Use the binary protocol, which allows us faster data xfer // and better data storage (can use full UTF-8 char space) if err := client.SetBehavior(mc.BEHAVIOR_BINARY_PROTOCOL, 1); err != nil { client.Close() return nil, err } // `SetBehavior()` wraps libmemcached's `memcached_behavior_set()` call. if err := client.SetBehavior(mc.BEHAVIOR_SND_TIMEOUT, s.sendTimeout); err != nil { client.Close() return nil, err } if err := client.SetBehavior(mc.BEHAVIOR_RCV_TIMEOUT, s.recvTimeout); err != nil { client.Close() return nil, err } if err := client.SetBehavior(mc.BEHAVIOR_POLL_TIMEOUT, s.pollTimeout); err != nil { client.Close() return nil, err } if err = client.SetBehavior(mc.BEHAVIOR_RETRY_TIMEOUT, s.retryTimeout); err != nil { client.Close() return nil, err } return client, nil }