(stream testgrpc.BenchmarkService_StreamingCallServer, preloadMsgSize int)
| 137 | } |
| 138 | |
| 139 | func (s *testServer) UnconstrainedStreamingCall(stream testgrpc.BenchmarkService_StreamingCallServer, preloadMsgSize int) error { |
| 140 | maxSleep := 0 |
| 141 | if md, ok := metadata.FromIncomingContext(stream.Context()); ok && len(md[UnconstrainedStreamingDelayHeader]) != 0 { |
| 142 | val := md[UnconstrainedStreamingDelayHeader][0] |
| 143 | d, err := time.ParseDuration(val) |
| 144 | if err != nil { |
| 145 | return fmt.Errorf("can't parse %q header: %s", UnconstrainedStreamingDelayHeader, err) |
| 146 | } |
| 147 | maxSleep = int(d) |
| 148 | } |
| 149 | |
| 150 | in := new(testpb.SimpleRequest) |
| 151 | // Receive a message to learn response type and size. |
| 152 | err := stream.RecvMsg(in) |
| 153 | if err == io.EOF { |
| 154 | // read done. |
| 155 | return nil |
| 156 | } |
| 157 | if err != nil { |
| 158 | return err |
| 159 | } |
| 160 | |
| 161 | response := &testpb.SimpleResponse{ |
| 162 | Payload: new(testpb.Payload), |
| 163 | } |
| 164 | setPayload(response.Payload, in.ResponseType, int(in.ResponseSize)) |
| 165 | |
| 166 | preloadedResponse := &grpc.PreparedMsg{} |
| 167 | if preloadMsgSize > 0 { |
| 168 | if err := preloadedResponse.Encode(stream, response); err != nil { |
| 169 | return err |
| 170 | } |
| 171 | } |
| 172 | |
| 173 | go func() { |
| 174 | for { |
| 175 | // Using RecvMsg rather than Recv to prevent reallocation of SimpleRequest. |
| 176 | err := stream.RecvMsg(in) |
| 177 | switch status.Code(err) { |
| 178 | case codes.Canceled: |
| 179 | return |
| 180 | case codes.OK: |
| 181 | default: |
| 182 | log.Fatalf("server recv error: %v", err) |
| 183 | } |
| 184 | } |
| 185 | }() |
| 186 | |
| 187 | go func() { |
| 188 | for { |
| 189 | if maxSleep > 0 { |
| 190 | time.Sleep(time.Duration(rand.IntN(maxSleep))) |
| 191 | } |
| 192 | var err error |
| 193 | if preloadMsgSize > 0 { |
| 194 | err = stream.SendMsg(preloadedResponse) |
| 195 | } else { |
| 196 | err = stream.Send(response) |
no test coverage detected