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]> 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/ms
>>> gid/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].
> 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/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]>
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/CAJgPXp4qTU-7qhN5GZC9003%3Dd-JC9Tp%2B1qOHn5ZjCD3km%3DQbFw%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to