Hi Tarek,

As you are using bidi stream then you must be writing to client, now assume 
your client is killed. At this moment if you try to write something from 
server you will get an exception and that way you can detect your client 
dead.

This is the easiest way to detect dead client. 

Regards,
SN

On Tuesday, 6 April 2021 at 02:22:48 UTC+5:30 [email protected] wrote:

> Hi Lidi,
>
> Thanks for getting back. My application is for a long-lived bidirectional 
> stream.
> On the server, I need to detect a client disconnected. I understand 
> multiple streams are multiplexed on same connection. However, in my case it 
> is a long-lived bidirectional stream and the stream will terminate only 
> when the client has died. 
> When stream is terminated, and if the client/stream does not reconnect to 
> server within a timeout, the server will need to purge out state associated 
> with the client.
>
> I'm counting on "add_done_callback" being able to register a callback that 
> gets invoked before the stream is terminated. This allows me to start the 
> timer on server side to wait before purging state associated with the 
> client/stream.
> I was also suggested to look into enabling TCP keepalives - but I have not 
> seen a way for the application to be notified if/when TCP connection is 
> terminated.
>
> If you have better ideas, I much appreciate it.
> BTW, I quickly sifted through the PR, there is a suggestion to catch 
> asyncio.CancelledError.. However, 1) I am not sure if 
> asyncio.CancelledError is raised if client disconnects, and 2) whether  
> application/server will have a chance to do anything about it before 
> underlying aio thread get cleaned up?
>
> async def handler(request, service_context):
>     try:
>         make_something(...)
>     except asyncio.CancelledError:
>         clean_stuff_related_to_current_RPC(....)
>
> Regards,
> Tarek
>
> On Monday, April 5, 2021 at 2:24:19 PM UTC-4 Lidi Zheng wrote:
>
>> Hi,
>>
>> `add_done_callback` wasn't added to grpc.aio.Server because there was a 
>> discussion that it overlaps with server interceptors: 
>> https://github.com/grpc/grpc/pull/22503.
>>
>> I can update the PR later this week. If possible, please explain more 
>> about your use case and why you think `add_done_callback` would be handy.
>>
>> On Saturday, April 3, 2021 at 2:56:56 PM UTC-7 [email protected] wrote:
>>
>>> Hi,
>>>
>>> Using python grpc.aio, I'm not able to add a callback  on server side 
>>> (using context) to be invoked on a grpc stream terminated/cancelled -- I 
>>> use grpc.aio.server().
>>> The documentation here 
>>> <https://grpc.github.io/grpc/python/grpc_asyncio.html#shared-context> 
>>> mentions 
>>> the callback, but I can't seem to be able to get it to work. 
>>>
>>> If I use grpc.server() instead, I can set add_callback()
>>>
>>> I'm using:
>>> Name: grpcio
>>> Version: 1.36.1
>>> Name: grpcio-tools
>>> Version: 1.35.0
>>> Name: aiogrpc
>>> Version: 1.8
>>>
>>> Thanks
>>>
>>>
>>>

-- 
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 view this discussion on the web visit 
https://groups.google.com/d/msgid/grpc-io/55aedc55-bbc1-4162-9c9b-aad81381b8dan%40googlegroups.com.

Reply via email to