func newStressRange(kvc pb.KVClient, keySuffixRange int) stressFunc { return func(ctx context.Context) (error, int64) { _, err := kvc.Range(ctx, &pb.RangeRequest{ Key: []byte(fmt.Sprintf("foo%016x", rand.Intn(keySuffixRange))), }, grpc.FailFast(false)) return err, 0 } }
func newStressRangePrefix(kvc pb.KVClient, keySuffixRange int) stressFunc { return func(ctx context.Context) error { _, err := kvc.Range(ctx, &pb.RangeRequest{ Key: []byte("foo"), RangeEnd: []byte(fmt.Sprintf("foo%d", rand.Intn(keySuffixRange))), }, grpc.FailFast(false)) return err } }
func newStressRangeInterval(kvc pb.KVClient, keySuffixRange int) stressFunc { return func(ctx context.Context) (error, int64) { start := rand.Intn(keySuffixRange) end := start + 500 _, err := kvc.Range(ctx, &pb.RangeRequest{ Key: []byte(fmt.Sprintf("foo%016x", start)), RangeEnd: []byte(fmt.Sprintf("foo%016x", end)), }, grpc.FailFast(false)) return err, 0 } }
func doRange(client etcdserverpb.KVClient, requests <-chan etcdserverpb.RangeRequest) { defer wg.Done() for req := range requests { st := time.Now() _, err := client.Range(context.Background(), &req) var errStr string if err != nil { errStr = err.Error() } results <- result{errStr: errStr, duration: time.Since(st)} bar.Increment() } }
func get(client etcdserverpb.KVClient, key, end []byte, requests <-chan struct{}) { defer wg.Done() req := &etcdserverpb.RangeRequest{Key: key, RangeEnd: end} for _ = range requests { st := time.Now() _, err := client.Range(context.Background(), req) var errStr string if err != nil { errStr = err.Error() } results <- &result{ errStr: errStr, duration: time.Now().Sub(st), } bar.Increment() } }
// waitForRestart tries a range request until the client's server responds. // This is mainly a stop-gap function until grpcproxy's KVClient adapter // (and by extension, clientv3) supports grpc.CallOption pass-through so // FailFast=false works with Put. func waitForRestart(t *testing.T, kvc pb.KVClient) { req := &pb.RangeRequest{Key: []byte("_"), Serializable: true} if _, err := kvc.Range(context.TODO(), req, grpc.FailFast(false)); err != nil { t.Fatal(err) } }