// Watch runs Watch RPCs in parallel on the backends and returns a // merged stream of results. func (s *server) Watch(req *pb.Request, stream pb.Google_WatchServer) error { // HL ctx := stream.Context() c := make(chan result) // HL var wg sync.WaitGroup for _, b := range s.backends { wg.Add(1) go func(backend pb.GoogleClient) { // HL defer wg.Done() // HL watchBackend(ctx, backend, req, c) // HL }(b) // HL } go func() { wg.Wait() close(c) // HL }() for res := range c { // HL if res.err != nil { return res.err } if err := stream.Send(res.res); err != nil { // HL return err // HL } // HL } return nil }
// Watch returns a stream of results identifying the query and this // backend, sleeping a random interval between each send. func (s *server) Watch(req *pb.Request, stream pb.Google_WatchServer) error { // HL ctx := stream.Context() for i := 0; ; i++ { d := randomDuration(1 * time.Second) logSleep(ctx, d) // HL select { case <-time.After(d): err := stream.Send(&pb.Result{ // HL Title: fmt.Sprintf("result %d for [%s] from backend %d", i, req.Query, *index), // HL }) // HL if err != nil { return err } case <-ctx.Done(): return ctx.Err() } } }