You would find some examples here 
- https://github.com/grpc/grpc/tree/master/examples/cpp

The documentation would be best found in the headers - 
https://github.com/grpc/grpc/blob/master/include/grpcpp/support/client_callback.h
https://github.com/grpc/grpc/blob/master/include/grpcpp/support/server_callback.h

Also, https://github.com/grpc/proposal/blob/master/L67-cpp-callback-api.md 
for some additional reading

On Thursday, May 18, 2023 at 12:15:47 PM UTC-7 Ashutosh Maheshwari wrote:

> Hello Yash,
>
> Can you please point me to the documentation of the Callback API?
>
> Regards
> Ashutosh
>
>
> On Wednesday, May 17, 2023 at 6:54:25 AM UTC+5:30 yas...@google.com wrote:
>
> I'll preface this by saying - Use the C++ callback API. Instead of trying 
> to understand the Async CQ-based API, the callback API should be the choice 
> and is our current recommendation.
>
> >  Only one write is permissible per stream. So we cannot write another 
> tag on a stream until we receive a response tag from the completion queue 
> for the previous write.
>
> This is correct.
>
> I'll end this by again saying - Use the C++ callback API.
>
> > Recently,  I came across an issue where the gRPC client became a zombie 
> process as its parent Python application was aborted. In this condition, 
> the previous Write done on the stream connected with the client did not get 
> ack, probably,  and I did not receive the Write tag back in the completion 
> queue for that Write. My program kept waiting for the write tag and other 
> messages continued to queue up as the previous Write did not finish its 
> life cycle and hence I could not free the resources also for that tag.
>
> This can be easily avoided by configuring keepalive. Refer -
> 1) https://github.com/grpc/grpc/blob/master/doc/keepalive.md
> 2) https://github.com/grpc/proposal/blob/master/A9-server-side-conn-mgt.md
> 3) 
> https://github.com/grpc/proposal/blob/master/A8-client-side-keepalive.md
>
> That also answers your question on what happens if for some reason, a 
> client stops reading. Keepalive would handle it.
>
> > My question is, if a write tag for a previous write does not surface on 
> the completion queue, shall we wait for it indefinitely? What should be the 
> strategy to handle this scenario?
> Depends highly on your API/service. If for some reason, the RPC is taking 
> much longer than you want and you are suspecting that the client is being 
> problematic (i.e. responding to http keepalives but not making progress on 
> RPCs), you could always just end the RPC.
>
> On Wednesday, May 10, 2023 at 12:17:46 AM UTC-7 Ashutosh Maheshwari wrote:
>
> Hello,
>
> My question is, if a write tag for a previous write does not surface on 
> the completion queue, shall we wait for it indefinitely? What should be the 
> strategy to handle this scenario?
>
> Regards
> Ashutosh
> On Wednesday, April 26, 2023 at 11:11:57 PM UTC+5:30 apo...@google.com 
> wrote:
>
> First, it's important to clarify what it means to wait for a "Write" tag 
> to complete on a completion queue:
>
> When async "Write" is initially attempted, the message can be fully or 
> partially buffered within gRPC. The corresponding tag will surface on the 
> completion queue that the Write is associated with essentially after gRPC 
> is done buffering the message, i.e. after it's written out relevant bytes 
> to the wire.
>
> This is unrelated to whether or not a "response" has been received from 
> the peer, on the same stream.
>
> So, the highlighted comment means that you can only have one async write 
> "pending" per RPC, at any given time. I.e. in order to start a new write on 
> a streaming RPC, one must wait for the previous write on that same stream 
> to "complete" (i.e. for it's tag to be surfaced).
>
> Multiple pending writes on different RPCs of the same completion queue are 
> fine.
> On Saturday, April 22, 2023 at 12:58:57 PM UTC-7 Ashutosh Maheshwari wrote:
>
> Hello gRPC Team,
>
> I have taken an extract from 
> *“include/grpcpp/impl/codegen/async_stream.h”*
>
>  *“*
>
>   /// Request the writing of \a msg with identifying tag \a tag.
>
>   ///
>
>   /// Only one write may be outstanding at any given time. This means that
>
>   /// after calling Write, one must wait to receive \a tag from the 
> completion
>
>   /// queue BEFORE calling Write again.
>
>   /// This is thread-safe with respect to \a AsyncReaderInterface::Read
>
>   ///
>
>   /// gRPC doesn't take ownership or a reference to \a msg, so it is safe 
> to
>
>   /// to deallocate once Write returns.
>
>   ///
>
>   /// \param[in] msg The message to be written.
>
>   /// \param[in] tag The tag identifying the operation.
>
>   virtual void Write(const W& msg, void* tag) = 0;
>
> “
>
>  After reading the highlighted part,  I can make the following two 
> inferences:
>
>    1. Only one write is permissible per stream. So we cannot write 
>    another tag on a stream until we receive a response tag from the 
> completion 
>    queue for the previous write. 
>    2. Only one write is permissible on the completion queue with no 
>    dependency on available streams. When multiple clients connect to the grpc 
>    server, then we will have multiple streams present. Now in such a 
> scenario, 
>    only one client can be responded to at a time due to the above-highlighted 
>    limitation. 
>
>  Can you please help us in understanding which one of our above 
> inferences is true?
>
> Recently,  I came across an issue where the gRPC client became a zombie 
> process as its parent Python application was aborted. In this condition, 
> the previous Write done on the stream connected with the client did not get 
> ack, probably,  and I did not receive the Write tag back in the completion 
> queue for that Write. My program kept waiting for the write tag and other 
> messages continued to queue up as the previous Write did not finish its 
> life cycle and hence I could not free the resources also for that tag.
>
> I was wondering if I could have gone ahead with Write for other streams 
> and queue up messages related to this stream till we get a write tag in 
> return for the previous message. If I kill the zombie and clean up on the 
> client, the Write tag is returned
>
> Alternatively, is it possible  to force cleanup the inactive gRPC session 
> ? What would happen if the Write tag is returned after the internal memory 
> for that tag had been cleaned up . I guess it will crash. 
>
> Please clarify the doubts,
>
> Regards
>
> Ashutosh (Ciena)
>
>

-- 
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 grpc-io+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/grpc-io/f2a48dba-f5f8-4f33-a93e-aa926e0b9265n%40googlegroups.com.

Reply via email to