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 cmdGenerator(tasks chan<- *common.Task, taskGens *sync.WaitGroup, numTasks int, cmd common.Op) { r := rand.New(rand.NewSource(common.RandSeed())) for i := 0; i < numTasks; i++ { task := taskPool.Get().(*common.Task) task.Cmd = cmd task.Key = common.RandData(r, f.KeyLength, false) task.Value = taskValue(r, cmd) tasks <- task } taskGens.Done() }
func cmdGenerator(tasks chan<- *common.Task, taskGens *sync.WaitGroup, numTasks int, cmd common.Op) { r := rand.New(rand.NewSource(common.RandSeed())) for i := 0; i < numTasks; i++ { tasks <- &common.Task{ Cmd: cmd, Key: common.RandData(r, f.KeyLength, false), Value: taskValue(r, cmd), } } taskGens.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() }
func main() { var prot common.Prot if f.Binary { var b binprot.BinProt prot = b } else { var t textprot.TextProt prot = t } wg := &sync.WaitGroup{} wg.Add(f.NumWorkers) for i := 0; i < f.NumWorkers; i++ { go func(prot common.Prot, wg *sync.WaitGroup) { conn, err := common.Connect("localhost", f.Port) if err != nil { panic("Couldn't connect") } r := rand.New(rand.NewSource(common.RandSeed())) rw := bufio.NewReadWriter(bufio.NewReader(conn), bufio.NewWriter(conn)) // 0 to 100k data for i := 0; i < 102400; i++ { key := common.RandData(r, f.KeyLength, false) value := common.RandData(nil, i, true) prot.Set(rw, key, value) prot.Get(rw, key) } fmt.Println("Done.") wg.Done() }(prot, wg) } wg.Wait() }