MCPcopy
hub / github.com/grpc/grpc-go / UnconstrainedStreamingCall

Method UnconstrainedStreamingCall

benchmark/benchmark.go:139–210  ·  view source on GitHub ↗
(stream testgrpc.BenchmarkService_StreamingCallServer, preloadMsgSize int)

Source from the content-addressed store, hash-verified

137}
138
139func (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)

Callers 1

StreamingCallMethod · 0.95

Calls 12

EncodeMethod · 0.95
FromIncomingContextFunction · 0.92
CodeFunction · 0.92
setPayloadFunction · 0.85
ErrMethod · 0.80
ContextMethod · 0.65
ErrorfMethod · 0.65
RecvMsgMethod · 0.65
FatalfMethod · 0.65
SendMsgMethod · 0.65
SendMethod · 0.65
DoneMethod · 0.45

Tested by

no test coverage detected