[ 
https://issues.apache.org/jira/browse/THRIFT-5861?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Asjad reassigned THRIFT-5861:
-----------------------------

    Assignee: Asjad

> Add isOpen method to TTornadoStreamTransport
> --------------------------------------------
>
>                 Key: THRIFT-5861
>                 URL: https://issues.apache.org/jira/browse/THRIFT-5861
>             Project: Thrift
>          Issue Type: Improvement
>          Components: Python - Library
>    Affects Versions: 0.21.0
>            Reporter: Asjad
>            Assignee: Asjad
>            Priority: Minor
>             Fix For: 0.22.0
>
>          Time Spent: 20m
>  Remaining Estimate: 0h
>
> Normally I include a check like this before closing Thrift connections:
> {code:python}
> if transport and transport.isOpen():
>     transport.close() {code}
> However, for Tornado, {{TTornadoStreamTransport.isOpen()}} is not 
> implemented, so the call falls back to {{{}TTransportBase{}}}'s empty 
> implementation which just returns {{{}None{}}}. As a result, the above 
> condition to close the connection never gets satisfied, and my application 
> accumulates open connections until eventually it crashes with error message 
> {{{}OSError: [Errno 24] Too many open files{}}}.
> To fix this, this patch implements {{{}TTornadoStreamTransport.isOpen(){}}}, 
> using Tornado's 
> [{{BaseIOStream.closed()}}|https://www.tornadoweb.org/en/stable/iostream.html#tornado.iostream.BaseIOStream.closed],
>  which returns {{True}} if the stream has been closed. Before checking if the 
> stream is open, we need to verify that the stream exists.
> To test the patch, we can add these print statements into 
> [thrift/tutorial/py.tornado/PythonClient.py|https://github.com/apache/thrift/blob/2e00c9998f1aa316c8d0168488887fb957845230/tutorial/py.tornado/PythonClient.py#L46]
>  in the appropriate places:
> {code:python}
> print(f"transport.isOpen() before transport.open(): {transport.isOpen()}")
> print(f"transport.isOpen() after transport.open(): {transport.isOpen()}")
> print(f"transport.isOpen() after TTransportException: {transport.isOpen()}")
> print(f"transport.isOpen() before transport.close(): {transport.isOpen()}")
> print(f"transport.isOpen() after transport.close(): {transport.isOpen()}")
> {code}
> Without the patch applied, {{isOpen()}} always returns {{{}None{}}}, 
> regardless of whether the transport is opened or closed:
> {noformat}
> transport.isOpen() before transport.open(): None
> transport.isOpen() after transport.open(): None
> transport.isOpen() before transport.close(): None
> transport.isOpen() after transport.close(): None{noformat}
> {noformat}
> transport.isOpen() before transport.open(): None
> ERROR:root:could not connect to 127.0.0.1:9090 (Stream is closed)
> transport.isOpen() after TTransportException: None{noformat}
> With the patch applied, {{isOpen()}} accurately reflects the transport state:
> {noformat}
> transport.isOpen() before transport.open(): False
> transport.isOpen() after transport.open(): True
> transport.isOpen() before transport.close(): True
> transport.isOpen() after transport.close(): False{noformat}
> {noformat}
> transport.isOpen() before transport.open(): False
> ERROR:root:could not connect to localhost:9090 (Stream is closed)
> transport.isOpen() after TTransportException: False{noformat}
> It also worked neatly with reopening the transport but I didn't include that 
> as it didn't fit in neatly with the tutorial's outline.
>  



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to