Hi, I'm trying to find what the proper reaction to ok == false should be in asynchronous API with streaming responses. I can't infer it from the documentation.
The example in https://grpc.io/docs/tutorials/async/helloasync-cpp.html simply does GRP_ASSERT(ok), so I can't infer this from it either. This is my understanding of the state machine allowing to properly read a whole stream of responses (please correct me if I'm wrong). The stream can be in one of the following states: - NOT_CREATED (before we touch anything) - CREATING (after calling Stub::AsyncFoo(), before CompletionQueue::AsyncNext() reports completion) - PROCESSING (after calling ClientAsyncReaderInterface<>::Read()) - FINISHING (after calling calling ClientAsyncReaderInterface<>::Finish(), before CompletionQueue::AsyncNext() reports completion) - FINISHED (the stream is dead, all resources are freed) These are the transitions between the states: State NOT_CREATED: - Calling Stub::AsyncFoo() transitions to CREATING State CREATING: - if CompletionQueue::AsyncNext() sets ok to true, call ClientAsyncReaderInterface<>::Read() and transition to PROCESSING; (we just got a response, BTW) - if CompletionQueue::AsyncNext() sets ok to false, call ClientAsyncReaderInterface<>::Finish() transition to FINISHING State PROCESSING: - if CompletionQueue::AsyncNext() sets ok to true, call ClientAsyncReaderInterface<>::Read() and transition to PROCESSING - if CompletionQueue::AsyncNext() sets ok to false, call ClientAsyncReaderInterface<>::Finish() and transition to FINISHING State FINISHING: - when CompletionQueue::AsyncNext() notifies (it will always set `ok == true`) transition to FINISHED; (here we learn if the stream was just closed or if there was an error) State FINISHED: - nothing else can happen I have a couple of questions: - Is this a understanding correct? - If I wanted to finish the stream in the client, I presume, I can call Finish() in CREATING and PROCESSING states, right? - Is this the same state machine on the server side or if streaming in the other direction? The reason I'm asking is that I'm getting a grpc assertion when calling Finish() after having received ok == false in state PROCESSING: grpc/src/core/lib/surface/call.cc:1853: grpc_cq_begin_op(call->cq, notify_tag) I'd be grateful for clarification, because I'm currently don't know if I'm misusing the library or I have a bug. Thanks in advance -- You received this message because you are subscribed to the Google Groups "grpc.io" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at https://groups.google.com/group/grpc-io. To view this discussion on the web visit https://groups.google.com/d/msgid/grpc-io/f069123a-82f5-4883-b5f8-d9ecfa5c080f%40googlegroups.com. For more options, visit https://groups.google.com/d/optout.
