func (cp *CachePool) startMemcache() { if strings.Contains(cp.port, "/") { _ = os.Remove(cp.port) } commandLine := cp.rowCacheConfig.GetSubprocessFlags() cp.cmd = exec.Command(commandLine[0], commandLine[1:]...) if err := cp.cmd.Start(); err != nil { log.Fatalf("can't start memcache: %v", err) } attempts := 0 for { time.Sleep(100 * time.Millisecond) c, err := memcache.Connect(cp.port, 30*time.Millisecond) if err != nil { attempts++ if attempts >= 50 { cp.cmd.Process.Kill() // Avoid zombies go cp.cmd.Wait() // FIXME(sougou): Throw proper error if we can recover log.Fatal("Can't connect to memcache") } continue } if _, err = c.Set("health", 0, 0, []byte("ok")); err != nil { log.Fatalf("can't communicate with memcache: %v", err) } c.Close() break } }
func (cp *CachePool) Open() { cp.mu.Lock() defer cp.mu.Unlock() if cp.pool != nil { panic("rowcache is already open") } if cp.rowCacheConfig.Binary == "" { panic("rowcache binary not specified") } cp.startMemcache() log.Infof("rowcache is enabled") f := func() (pools.Resource, error) { return memcache.Connect(cp.port, 10*time.Second) } cp.pool = pools.NewResourcePool(f, cp.capacity, cp.capacity, cp.idleTimeout) if cp.memcacheStats != nil { cp.memcacheStats.Open() } }