func printQueue(client crowdsound.CrowdSoundClient) { stream, err := client.GetQueue(context.Background(), &crowdsound.GetQueueRequest{ UserId: *userID, }) if err != nil { log.Fatalf("Error calling GetQueue(): %v", err) } var count int for { song, err := stream.Recv() if err == io.EOF { break } if err != nil { log.Fatalf("Error retrieving song: %v", err) } if song.IsBuffered { if song.IsPlaying { log.Printf("Song: [%v] %v - %v (buffered) (playing)", song.Genre, song.Artist, song.Name) } else { log.Printf("Song: [%v] %v - %v (buffered)", song.Genre, song.Artist, song.Name) } } else { log.Printf("Song: [%v] %v - %v", song.Genre, song.Artist, song.Name) } count++ } log.Println("Queue size:", count) }
func RunGetQueueBench(c crowdsound.CrowdSoundClient, amount int) (metrics.Histogram, error) { h := metrics.NewHistogram(metrics.NewUniformSample(amount)) // To make the queue meaningful, we want there to actually // be a queue. Idealy, we could try various queue sizes, but // time is of the essence! postStream, err := c.PostSong(context.Background()) if err != nil { return h, err } for song := range songGenerator(10, 0) { song.UserId = randomString(32) if err = postStream.Send(song); err != nil { return h, err } } if _, err = postStream.CloseAndRecv(); err != nil { return h, err } for i := 0; i < amount; i++ { start := time.Now() queueStream, err := c.GetQueue(context.Background(), &crowdsound.GetQueueRequest{}) if err != nil { return h, err } for { _, err := queueStream.Recv() if err == io.EOF { break } if err != nil { log.Fatal(err) } } h.Update(time.Since(start).Nanoseconds()) } return h, nil }