func (d *poolDialer) check(message string, p *redis.Pool, dialed, open int) { d.mu.Lock() if d.dialed != dialed { d.t.Errorf("%s: dialed=%d, want %d", message, d.dialed, dialed) } if d.open != open { d.t.Errorf("%s: open=%d, want %d", message, d.open, open) } if active := p.ActiveCount(); active != open { d.t.Errorf("%s: active=%d, want %d", message, active, open) } d.mu.Unlock() }
func startGoroutines(p *redis.Pool, cmd string, args ...interface{}) chan error { errs := make(chan error, 10) for i := 0; i < cap(errs); i++ { go func() { c := p.Get() _, err := c.Do(cmd, args...) errs <- err c.Close() }() } // Wait for goroutines to block. time.Sleep(time.Second / 4) return errs }
func BenchmarkPoolGet(b *testing.B) { b.StopTimer() p := redis.Pool{Dial: redis.DialDefaultServer, MaxIdle: 2} c := p.Get() if err := c.Err(); err != nil { b.Fatal(err) } c.Close() defer p.Close() b.StartTimer() for i := 0; i < b.N; i++ { c = p.Get() c.Close() } }
func BenchmarkPoolConcurrent(b *testing.B) { b.StopTimer() p := redis.Pool{Dial: redistest.Dial, MaxIdle: numConcurrent} defer p.Close() // Fill the pool. conns := make([]redis.Conn, numConcurrent) for i := range conns { c := p.Get() if err := c.Err(); err != nil { b.Fatal(err) } conns[i] = c } for _, c := range conns { c.Close() } var wg sync.WaitGroup wg.Add(numConcurrent) b.StartTimer() for i := 0; i < numConcurrent; i++ { go func() { defer wg.Done() for i := 0; i < b.N; i++ { c := p.Get() if _, err := c.Do("PING"); err != nil { b.Fatal(err) } c.Close() } }() } wg.Wait() }
func BenchmarkPool(b *testing.B) { b.StopTimer() p := redis.Pool{Dial: redistest.Dial, MaxIdle: 1} defer p.Close() // Fill the pool. c := p.Get() if err := c.Err(); err != nil { b.Fatal(err) } c.Close() b.StartTimer() for i := 0; i < b.N; i++ { c := p.Get() if _, err := c.Do("PING"); err != nil { b.Fatal(err) } c.Close() } }