You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@hive.apache.org by "kirby zhou (Jira)" <ji...@apache.org> on 2022/11/02 12:08:00 UTC

[jira] [Reopened] (HIVE-24694) Early connection close to release server resources during creating

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

kirby zhou reopened HIVE-24694:
-------------------------------

This patch is not merged to current release 3.1.3

Without this patch, a connection leak will occur when the Sasl handshake times out.

When creating HiveConnection with password, openTransport will be called, and openTransport will call the following callstack layer by layer.
{code:java}
        at java.io.BufferedInputStream.read(BufferedInputStream.java:345)
        - locked <0x000000073b8638e8> (a java.io.BufferedInputStream)
        at org.apache.thrift.transport.TIOStreamTransport.read(TIOStreamTransport.java:127)
        at org.apache.thrift.transport.TTransport.readAll(TTransport.java:86)
        at org.apache.thrift.transport.TSaslTransport.receiveSaslMessage(TSaslTransport.java:178)
        at org.apache.thrift.transport.TSaslTransport.open(TSaslTransport.java:307)
        at org.apache.hive.jdbc.HiveConnection.openTransport(HiveConnection.java:196)  
{code}
TIOStreamTransport::read will throw 

TTransportException(TTransportException.UNKNOWN, iox) when 

IOException happens.

 

 
{code:java}
try {
  bytesRead = inputStream_.read(buf, off, len);
} catch (IOException iox)
{   
  throw new TTransportException(TTransportException.UNKNOWN, iox); 
}  {code}
 

 

TSaslTransport.open will only call close() at e.getType() == TTransportException.END_OF_FILE, it seems be designed.

 
{code:java}
} catch (TTransportException e) {
  /*
   * If there is no-data or no-sasl header in the stream, throw a different
   * type of exception so we can handle this scenario differently.
   */
  if (!readSaslHeader && e.getType() == TTransportException.END_OF_FILE) {
    underlyingTransport.close();
    LOGGER.debug("No data or no sasl data in the stream");
    throw new TSaslTransportException("No data or no sasl data in the stream");
  }
  throw e;
} {code}
 

 

But HiveConnection will never call this.close() or transport.close() when any Exception thrown by TSaslClientTransport.open().

And after the constructor fails, the caller has no chance to go to close transport.

 

 

 

> Early connection close to release server resources during creating
> ------------------------------------------------------------------
>
>                 Key: HIVE-24694
>                 URL: https://issues.apache.org/jira/browse/HIVE-24694
>             Project: Hive
>          Issue Type: Bug
>          Components: HiveServer2
>            Reporter: Zhihua Deng
>            Assignee: Zhihua Deng
>            Priority: Major
>              Labels: pull-request-available
>             Fix For: 4.0.0-alpha-1
>
>          Time Spent: 2h
>  Remaining Estimate: 0h
>
> If exception happens during we try to get the connection from HiveDriver,  the opened transport or session may leave unclosed as the connection returned is null, we cannot call the close method to release the server resources(threads, connection quota, etc.), this could make things more worse if the user rearches the connection limit and retries... 



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