I agree with you, but it really happend, and in high frequency, maybe it's a bug? It's a unary RPC.
在 2017年9月6日星期三 UTC+8上午12:26:14,Mark D. Roth写道: > > If the tag being returned from the completion queue is the result of a > Finish() call, then I think ok should always be true, even if the status is > not okay. This is because the underlying op in C-core always succeeds: > > > https://github.com/grpc/grpc/blob/master/include/grpc/impl/codegen/grpc_types.h#L470 > > Is this a unary or streaming RPC? If it's streaming, then perhaps you're > getting a tag back from something other than Finish() (e.g., a send or recv > message op)? In that case, the individual op may fail but the call's > overall status will not yet have been received -- that doesn't happen until > after the tag from Finish() is returned. > > On Sun, Sep 3, 2017 at 6:57 PM, 谭锦彪 <[email protected] <javascript:>> > wrote: > >> Hi Roth, >> >> Thanks for your reply, about the refer to tag, you can see >> greeter_async_client2.cpp, my client code is just like it, but the server >> code has complex work to do. >> Sometimes, ok is false but call->status.ok() is true, >> and call->reply.message() is right. That happens very frequent in my >> situation, and currently, I ignore it, do not check ok, and the program >> working properly, but I worried if there will some undefined things >> happen. >> So that confused me, if the response of the grpc server is correct, why >> the ok equals false? >> void AsyncCompleteRpc() { >> void* got_tag; >> bool ok = false; >> >> // Block until the next result is available in the completion >> queue "cq". >> while (cq_.Next(&got_tag, &ok)) { >> // The tag in this example is the memory location of the call >> object >> AsyncClientCall* call = >> static_cast<AsyncClientCall*>(got_tag); >> >> // Verify that the request was completed successfully. Note >> that "ok" >> // corresponds solely to the request for updates introduced >> by Finish(). >> GPR_ASSERT(ok); >> >> if (call->status.ok()) >> std::cout << "Greeter received: " << >> call->reply.message() << std::endl; >> else >> std::cout << "RPC failed" << std::endl; >> >> // Once we're complete, deallocate the call object. >> delete call; >> } >> } >> >> >> 在 2017年9月1日星期五 UTC+8下午10:10:25,Mark D. Roth写道: >>> >>> I'm not sure what you mean when you refer to tag->status and >>> tag->reply. The gRPC API does not define a particular API for the tag; >>> that's entirely up to your application code, so I have no idea what those >>> fields represent or how they are being set. >>> >>> Yang's earlier description is correct: the ok parameter is an indication >>> of whether the operation corresponding to the returned tag was successful. >>> What a failure means depends on what the operation was. If it was a >>> RequestCall(), then it means that the completion queue is shutting down and >>> you can stop listening for new calls. For any request as part of a call >>> (e.g., a read or a write), it means that there was a problem with the >>> operation and you should call Finish() to get the call's final status. >>> >>> On Thu, Aug 31, 2017 at 11:30 PM, 谭锦彪 <[email protected]> wrote: >>> >>>> Hi >>>> >>>> I meet the situation that the Next return true, but ok==false, howerer, >>>> the content of the tag is right, tag->status.ok() return true, tag->reply >>>> is right too, That confuse me, >>>> why would this situation happen? Could I ignore the check of ok? >>>> >>>> 在 2017年8月2日星期三 UTC+8上午6:57:16,Yang Gao写道: >>>> >>>>> Usually we have a loop calling Next and when we are sure there will be >>>>> no more work adding to the completion queue we call completion queue's >>>>> Shutdown method to shutdown the queue. >>>>> It will in turn cause the Next to return false and it can be used to >>>>> break out of the loop. >>>>> >>>>> The ok parameter is an indication of the success of that particular >>>>> operation and usually is not related to the cq life time management. >>>>> >>>>> >>>>> On Monday, July 10, 2017 at 2:32:37 AM UTC-7, Przemysław Sobala wrote: >>>>>> >>>>>> Hello >>>>>> What is the difference between method's >>>>>> bool CompletionQueue::Next(void** tag, bool* ok) >>>>>> return value and 2nd parameter's value? >>>>>> >>>>>> Reading docs, it says: >>>>>> /// \param ok[out] true if read a regular event, false otherwise. >>>>>> /// \return true if read a regular event, false if the queue is >>>>>> shutting down >>>>>> >>>>>> Following the example: >>>>>> while (true) { >>>>>> // Block waiting to read the next event from the completion >>>>>> queue. The >>>>>> // event is uniquely identified by its tag, which in this case >>>>>> is the >>>>>> // memory address of a CallData instance. >>>>>> // The return value of Next should always be checked. This >>>>>> return value >>>>>> // tells us whether there is any kind of event or cq_ is >>>>>> shutting down. >>>>>> GPR_ASSERT(cq_->Next(&tag, &ok)); >>>>>> GPR_ASSERT(ok); >>>>>> static_cast<CallData*>(tag)->Proceed(); >>>>>> } >>>>>> it breaks whether the return value or ok parameter is false. >>>>>> But in the production environment maybe I can break the loop when the >>>>>> queue is shutting down (based on return value) and continue when ok >>>>>> parameter's value is false? >>>>>> What is the most preferable approach? Should I consider both of them >>>>>> as the same and break on false as in the example? >>>>>> >>>>>> -- >>>>>> regards >>>>>> Przemysław Sobala >>>>>> >>>>> -- >>>> 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/35ece217-c182-4dd9-b779-bbe8bf6b58d3%40googlegroups.com >>>> >>>> <https://groups.google.com/d/msgid/grpc-io/35ece217-c182-4dd9-b779-bbe8bf6b58d3%40googlegroups.com?utm_medium=email&utm_source=footer> >>>> . >>>> >>>> For more options, visit https://groups.google.com/d/optout. >>>> >>> >>> >>> >>> -- >>> Mark D. Roth <[email protected]> >>> Software Engineer >>> Google, Inc. >>> >> -- >> 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] <javascript:>. >> To post to this group, send email to [email protected] >> <javascript:>. >> 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/f2d9dbda-9a4a-4283-ab13-0cf57b0547a9%40googlegroups.com >> >> <https://groups.google.com/d/msgid/grpc-io/f2d9dbda-9a4a-4283-ab13-0cf57b0547a9%40googlegroups.com?utm_medium=email&utm_source=footer> >> . >> >> For more options, visit https://groups.google.com/d/optout. >> > > > > -- > Mark D. Roth <[email protected] <javascript:>> > Software Engineer > Google, Inc. > -- 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/d5a6f5b7-b118-4ce3-b800-2f42c2304f8b%40googlegroups.com. For more options, visit https://groups.google.com/d/optout.
