func communicator(prot common.Prot, conn net.Conn, tasks <-chan *common.Task, metrics chan<- metric, comms *sync.WaitGroup) { r := rand.New(rand.NewSource(common.RandSeed())) rw := bufio.NewReadWriter(bufio.NewReader(conn), bufio.NewWriter(conn)) for item := range tasks { var err error start := timer.Now() switch item.Cmd { case common.Set: err = prot.Set(rw, item.Key, item.Value) case common.Add: err = prot.Add(rw, item.Key, item.Value) case common.Replace: err = prot.Replace(rw, item.Key, item.Value) case common.Append: err = prot.Append(rw, item.Key, item.Value) case common.Prepend: err = prot.Prepend(rw, item.Key, item.Value) case common.Get: _, err = prot.Get(rw, item.Key) case common.Gat: _, err = prot.GAT(rw, item.Key) case common.Bget: bk := batchkeys(r, item.Key) _, err = prot.BatchGet(rw, bk) bkpool.Put(bk) case common.Delete: err = prot.Delete(rw, item.Key) case common.Touch: err = prot.Touch(rw, item.Key) } if err != nil { // don't print get misses, adds not stored, and replaces not stored if !isMiss(err) { fmt.Printf("Error performing operation %s on key %s: %s\n", item.Cmd, item.Key, err.Error()) } // if the socket was closed, stop. Otherwise keep on hammering. if err == io.EOF { break } } m := metricPool.Get().(metric) m.d = timer.Since(start) m.op = item.Cmd m.miss = isMiss(err) metrics <- m taskPool.Put(item) } conn.Close() comms.Done() }
func communicator(prot common.Prot, conn net.Conn, tasks <-chan *common.Task, metrics chan<- metric, comms *sync.WaitGroup) { r := rand.New(rand.NewSource(common.RandSeed())) rw := bufio.NewReadWriter(bufio.NewReader(conn), bufio.NewWriter(conn)) for item := range tasks { var err error start := time.Now() switch item.Cmd { case common.Set: err = prot.Set(rw, item.Key, item.Value) case common.Get: err = prot.Get(rw, item.Key) case common.Gat: err = prot.GAT(rw, item.Key) case common.Bget: err = prot.BatchGet(rw, batchkeys(r, item.Key)) case common.Delete: err = prot.Delete(rw, item.Key) case common.Touch: err = prot.Touch(rw, item.Key) } if err != nil { if err != binprot.ErrKeyNotFound { fmt.Printf("Error performing operation %s on key %s: %s\n", item.Cmd, item.Key, err.Error()) } // if the socket was closed, stop. Otherwise keep on hammering. if err == io.EOF { break } } metrics <- metric{ d: time.Since(start), op: item.Cmd, } } conn.Close() comms.Done() }