[ 
https://issues.apache.org/jira/browse/CALCITE-4676?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17375825#comment-17375825
 ] 

Josh Elser commented on CALCITE-4676:
-------------------------------------

Validated this with a naive test:
{code:java}
  public static void main(String[] args) throws Exception {
    for (int i = 0; i < 1000; i++) {
      try (Connection conn = 
DriverManager.getConnection("jdbc:avatica:remote:url=http://localhost:55000;serialization=protobuf";))
 {
        DatabaseMetaData metadata = conn.getMetaData();
        ResultSet tables = metadata.getTables(null, null, null, null);
        ArrayList<String> tableList = new ArrayList<>();
        while (tables.next()) {
          String table = String.format("%s:%s", tables.getString(2), 
tables.getString(3));
          tableList.add(table);
        }
        tables.close();
        System.out.println(tableList.size() + " tables seen");
      }
    }

    System.out.println("Waiting...");
    Thread.sleep(5 * 60 * 1000);
  }
 {code}
Used the hsqldb standalone server here, ala {{docker run --rm -P -it 
avatica-hsqldb-server}} (sadly, this was broken during the Gradle migration and 
never re-automated)

Without the fix, we can see lots of TCP connections for this one program:
{noformat}
% lsof -Pp $(jps -m | fgrep ConnectionLeak | awk '{print $1}') | fgrep -c TCP
79
% lsof -Pp $(jps -m | fgrep ConnectionLeak | awk '{print $1}') | fgrep -c TCP 
83
% lsof -Pp $(jps -m | fgrep ConnectionLeak | awk '{print $1}') | fgrep -c TCP 
87
% lsof -Pp $(jps -m | fgrep ConnectionLeak | awk '{print $1}') | fgrep -c TCP
242 {noformat}
With Istvan's fix, we can see:
{noformat}
% lsof -Pp $(jps -m | fgrep ConnectionLeak | awk '{print $1}') | fgrep -c TCP
1
% lsof -Pp $(jps -m | fgrep ConnectionLeak | awk '{print $1}') | fgrep -c TCP
1
% lsof -Pp $(jps -m | fgrep ConnectionLeak | awk '{print $1}') | fgrep -c TCP
1
% lsof -Pp $(jps -m | fgrep ConnectionLeak | awk '{print $1}') | fgrep -c TCP
1
% lsof -Pp $(jps -m | fgrep ConnectionLeak | awk '{print $1}') | fgrep -c TCP
1 {noformat}
 

> Avatica client leaks TCP connections
> ------------------------------------
>
>                 Key: CALCITE-4676
>                 URL: https://issues.apache.org/jira/browse/CALCITE-4676
>             Project: Calcite
>          Issue Type: Bug
>          Components: avatica
>    Affects Versions: avatica-1.18.0
>            Reporter: Istvan Toth
>            Assignee: Istvan Toth
>            Priority: Major
>
> The default Http client implmentation uses 
> org.apache.http.impl.conn.PoolingHttpClientConnectionManager to pool 
> connections, and does not close the TCP connections explicitly when the JDBC 
> connection is closed.
> However, the http client pools are created *per JDBC Connection*, so the 
> pooling is effectively only used when concurrent statements are executed from 
> the same Connection object.
> This also means that when the application opens and closes a lot of 
> Connections, then every Connection leaves behind active (typically in 
> CLOSE_WAIT) TCP connections, which are only cleaned up on GC.
> This wastes resources, and eventually breaks the application, as connection 
> limits are reached.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to