Hi Vijay,

thank you for answering, have some more confusion.

The background is I' am using GRPC 1.0.0.
For Ques1, when I did the test, I found that I cannot issue another read
util the previous read done event is got by completion queue. That means I
only can issue the next async read request when the previous one returned
by the server. otherwise, I will get an assert coredump.
For Ques2, thank you for telling me the CQ result is not an error. So can I
treat that an !Ok from CQ means the stream finished in server side? And
what will happen when the bi-directional stream gets some failure (will it
like CQ cannot get some events infinitely)?
Have two more question when I went further:
1. When I call Finish on both sides, do I need to handle outstanding (or
unconsumed) read/write done events first?
2. Are there any big bugs fix report of each release? Any suggestion on
which version of GRPC should I choose?

thanks,
Yihao

On Mon, May 22, 2017 at 12:28 AM, Vijay Pai <[email protected]> wrote:

> Hi there,
> Thanks for your questions.
>
> 1. You can only call 1 read and 1 write for a given stream (RPC)
> concurrently without waiting for the completion queue event to return. In
> the case of read, it returns when data is ready to be processed by the
> application. In the case of write, the guarantee is that the return implies
> that it is safe for the application to overwrite the message buffer that
> was passed in.  It hasn't necessarily been sent to the other side yet, but
> it is committed to doing so by being in a buffer in the library or kernel.
>
> 2. Can you clarify what you mean by read error or write error? Error
> status is not complete until Finish. Note that a CQ result of !ok is not
> the same as an error - it can be a normal part of operation indicating that
> there will be no further messages coming from that side of the stream. It
> might indicate an error, but it might also indicate an OK status in normal
> operation.
>
> 3. The server side doesn't ever call WritesDone; that is a client-side
> thing. The server-side only calls Finish.
>
> On Sun, May 21, 2017 at 4:22 PM yihao yang <[email protected]>
> wrote:
>
>>
>> Hi, Vijay:
>>
>> I'm a little confused with the concurrency of async stream
>> read/write/finish, the questions are listing below:
>> 1. Can I call async stream's Read/Write multiple times event the
>> completion queue not returned?
>> 2. When I need to finish the stream on a write error, what should I do to
>> the ongoing read? and what should I do to the ongoing write when occurs a
>> read error?
>> 3. Are there any different error handling operations need to be done from
>> server side and client side? (as I know, both need to call
>> stream->WriteDone()  on write error and then stream->Finish() )
>>
>> Thanks for you help,
>> Yihao
>> 在 2017年4月26日星期三 UTC-7下午1:05:04,Vijay Pai写道:
>>>
>>> Hi there,
>>>
>> Many of the test codes use C++ async streaming; for example
>>> test/cpp/end2end/async_end2end_test or test/cpp/qps/qps_worker .
>>>
>>> On Thu, Apr 13, 2017 at 11:25 AM Anirudh Kasturi <[email protected]>
>>> wrote:
>>>
>>>> Hello folks,
>>>>
>>>> Can you please give me pointers to an example that has an
>>>> AsyncStreaming Client?
>>>>
>>>
>>>
>>>> Also, when the client is streaming data to the server, we will be
>>>> basically streaming multiple messages.  Is there a default timeout when the
>>>> channel sees no more messages for a certain amount of time so that we can
>>>> shut it down?
>>>>
>>>
>>> There is no default timeout - the point of the async API is to give the
>>> program maximum control. You can set a deadline on the Next operation by
>>> using CompletionQueue::AsyncNext rather than just plain next. You can also
>>> shut down the stream any time you want.
>>>
>>>
>>>> I would like to understand the state machine of the client async
>>>> streamin.  How does the client keeps streaming messages to the server and
>>>> when does it go to the FINISH state?
>>>>
>>>
>>> Can you describe this further? From your paragraph above, it seems like
>>> you are doing client-side 1-directional streaming, but the next sentence
>>> looks like bidirectional streaming. If it's bidirectional streaming, your
>>> flow will look something like:
>>>
>>> 1. Initiate the RPC with its completion queue and tag
>>> 2. Do CompletionQueue::Next (or AsyncNext) for completion queue tags
>>> 3. When you get your desired tag back, the RPC is initiated
>>> 4. At that point, you can issue a Read, a Write, or one of each
>>> concurrently. If you do one of each concurrently, make sure that they get
>>> different tags
>>> 5. Do CompletionQueue::Next and process the tags that come off it
>>> 6. Loop to step 4 as long as you want to
>>> 7. When you are done with Writes on this stream, initiate a WritesDone.
>>> It's actually done when its CQ tag comes back
>>> 8. When you are fully done with this stream, initiate a Finish. It's
>>> actually done when its CQ tag comes back
>>>
>>> The process is similar for client-side 1-directional streaming, but
>>> obviously without Reads during the main loop and with an actual response
>>> object on the Finish (and not just a status).
>>>
>>>  For each message the client sends the server has a response.  In that
>>>> case is it better to use pure async or asycn streaming?
>>>>
>>>
>>> It is not always the case that the server will have a response for every
>>> client send. If you mean that that's how your application is structured,
>>> then that will allow you to make a pretty straightforward state machine for
>>> your structures that control the stream. In general, sync streaming is
>>> easier for most cases (since no completion queue manipulation) but hits
>>> scalability limits since each stream gets its own thread and its own
>>> completion queue. I would think that sync streaming will be a better choice
>>> up to a few thousand concurrent streams; after that async streaming would
>>> be preferable so that you can control threading from the application.
>>>
>>>
>>
>>>> Best,
>>>> Anirudh
>>>>
>>>> --
>>>> 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/18da9b2d-a425-4c7f-8aeb-8a03c4bec1ca%40googlegroups.com
>>>> <https://groups.google.com/d/msgid/grpc-io/18da9b2d-a425-4c7f-8aeb-8a03c4bec1ca%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>> .
>>>> For more options, visit https://groups.google.com/d/optout.
>>>>
>>> --
>> 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/6a956236-0f47-420f-b55f-d3edf69408de%40googlegroups.com
>> <https://groups.google.com/d/msgid/grpc-io/6a956236-0f47-420f-b55f-d3edf69408de%40googlegroups.com?utm_medium=email&utm_source=footer>
>> .
>> For more options, visit https://groups.google.com/d/optout.
>>
>

-- 
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/CAKVAn%2BCY6LJziF7z-BAC5LGxhuf5%2BZArAE1b9_1cTOiT0WFxRg%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to