scruz-denodo opened a new issue, #66:
URL: https://github.com/apache/arrow-java/issues/66

   ### Describe the bug, including details regarding any error messages, 
version, and platform.
   
   **Affected version**
   flight-sql-jdbc-driver version 17.0.0
   
   **Description**
   
   With flight-sql-jdbc-driver version 17 the method 
`org.apache.arrow.driver.jdbc.ArrowFlightConnection#close`  returns a 
SQLException when the connection has defined a value for `catalog` parameter.
   
   
   I was testing this change and I am facing a problem when the 
`java.sql.Connection#close` method of the JDBC connection is called. 
   
   I am receiving the following error invoking the method.
   
   ```
   Exception in thread "main" java.sql.SQLException: UNKNOWN: Uncaught 
exception in the SynchronizationContext. Re-thrown.
        at org.apache.calcite.avatica.Helper.createException(Helper.java:56)
        at org.apache.calcite.avatica.Helper.createException(Helper.java:41)
        at 
org.apache.arrow.driver.jdbc.ArrowFlightConnection.close(ArrowFlightConnection.java:187)
        at com.arrowflight.test.Main.test7(Main.java:249)
        at com.arrowflight.test.Main.main(Main.java:27)
   Caused by: io.grpc.StatusRuntimeException: UNKNOWN: Uncaught exception in 
the SynchronizationContext. Re-thrown.
        at io.grpc.Status.asRuntimeException(Status.java:525)
        at 
io.grpc.internal.RetriableStream$1.uncaughtException(RetriableStream.java:75)
        at io.grpc.SynchronizationContext.drain(SynchronizationContext.java:96)
        at 
io.grpc.SynchronizationContext.execute(SynchronizationContext.java:126)
        at 
io.grpc.internal.RetriableStream.safeCloseMasterListener(RetriableStream.java:838)
        at io.grpc.internal.RetriableStream.cancel(RetriableStream.java:531)
        at io.grpc.internal.RetriableStream.start(RetriableStream.java:393)
        at 
io.grpc.internal.ClientCallImpl.startInternal(ClientCallImpl.java:285)
        at io.grpc.internal.ClientCallImpl.start(ClientCallImpl.java:184)
        at io.grpc.ForwardingClientCall.start(ForwardingClientCall.java:32)
        at 
org.apache.arrow.flight.grpc.ClientInterceptorAdapter$FlightClientCall.start(ClientInterceptorAdapter.java:142)
        at io.grpc.ForwardingClientCall.start(ForwardingClientCall.java:32)
        at 
io.grpc.stub.MetadataUtils$HeaderAttachingClientInterceptor$HeaderAttachingClientCall.start(MetadataUtils.java:75)
        at io.grpc.stub.ClientCalls.startCall(ClientCalls.java:335)
        at io.grpc.stub.ClientCalls.asyncUnaryRequestCall(ClientCalls.java:311)
        at 
io.grpc.stub.ClientCalls.blockingServerStreamingCall(ClientCalls.java:210)
        at 
org.apache.arrow.flight.impl.FlightServiceGrpc$FlightServiceBlockingStub.doAction(FlightServiceGrpc.java:874)
        at org.apache.arrow.flight.FlightClient.doAction(FlightClient.java:168)
        at 
org.apache.arrow.flight.FlightClient.closeSession(FlightClient.java:686)
        at 
org.apache.arrow.flight.sql.FlightSqlClient.closeSession(FlightSqlClient.java:998)
        at 
org.apache.arrow.driver.jdbc.client.ArrowFlightSqlClientHandler.close(ArrowFlightSqlClientHandler.java:224)
        at org.apache.arrow.util.AutoCloseables.close(AutoCloseables.java:97)
        at org.apache.arrow.util.AutoCloseables.close(AutoCloseables.java:75)
        at 
org.apache.arrow.driver.jdbc.ArrowFlightConnection.close(ArrowFlightConnection.java:181)
        ... 2 more
   Caused by: java.util.concurrent.RejectedExecutionException: Task 
io.grpc.internal.SerializingExecutor@6ecdbab8 rejected from 
java.util.concurrent.ThreadPoolExecutor@3dd4a6fa[Terminated, pool size = 0, 
active threads = 0, queued tasks = 0, completed tasks = 25]
        at 
java.base/java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2055)
        at 
java.base/java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:825)
        at 
java.base/java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1355)
        at 
io.grpc.internal.SerializingExecutor.schedule(SerializingExecutor.java:102)
        at 
io.grpc.internal.SerializingExecutor.execute(SerializingExecutor.java:95)
        at 
io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl.closedInternal(ClientCallImpl.java:736)
        at 
io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl.closed(ClientCallImpl.java:680)
        at io.grpc.internal.RetriableStream$4.run(RetriableStream.java:843)
        at io.grpc.SynchronizationContext.drain(SynchronizationContext.java:94)
        ... 23 more
   ```
   
   I think the reason is the following. Checking this code:
   
   
https://github.com/apache/arrow/blob/6a2e19a852b367c72d7b12da4d104456491ed8b7/java/flight/flight-sql-jdbc-core/src/main/java/org/apache/arrow/driver/jdbc/ArrowFlightConnection.java#L174-L189
   
   - `close` method invokes `clientHandler.close();` at line 175. Here is where 
now is invoked the `closeSession` method at line 224. 
    
https://github.com/apache/arrow/blob/6a2e19a852b367c72d7b12da4d104456491ed8b7/java/flight/flight-sql-jdbc-core/src/main/java/org/apache/arrow/driver/jdbc/client/ArrowFlightSqlClientHandler.java#L222-L225
   - after that again on  `ArrowFlightConnection.java`, the `executorService` 
is closed at like 177
   - and the `clientHandler.close();` is called again at line 181.
     - with this call, the `closeSession` method is invoked again. And it is 
here when the exception is thrown. Because the executorService was already 
shutdown.
   
   
https://github.com/apache/arrow/blob/6a2e19a852b367c72d7b12da4d104456491ed8b7/java/flight/flight-sql-jdbc-core/src/main/java/org/apache/arrow/driver/jdbc/ArrowFlightConnection.java#L174-L189
   
   I think that line line 181 `from 
org.apache.arrow.driver.jdbc.ArrowFlightConnection#close` should be remove for 
avoding the problem. The close is already done at 175.
   
   Also, I would remove the is if:
   
https://github.com/apache/arrow/blob/6a2e19a852b367c72d7b12da4d104456491ed8b7/java/flight/flight-sql-jdbc-core/src/main/java/org/apache/arrow/driver/jdbc/client/ArrowFlightSqlClientHandler.java#L222-L225
   why not invoking the `closeSession` when the catalog was not set?
   
   
   It can be reproducible with this code:
   ```
   import java.sql.Connection;
   import java.sql.DriverManager;
   import java.sql.PreparedStatement;
   import java.sql.ResultSet;
   import java.sql.ResultSetMetaData;
   
   public class CloseIssue {
       private static final String URL = 
"jdbc:arrow-flight-sql://localhost:9994?catalog=mydatabase&useEncryption=0";
   
       public static void main(String[] args) throws Exception {
           Class.forName("org.apache.arrow.driver.jdbc.ArrowFlightJdbcDriver");
           try (Connection conn = DriverManager.getConnection(URL, "admin", 
"admin")) {
               try (PreparedStatement pst = conn.prepareStatement("select 1");
                    ResultSet rs = pst.executeQuery()) {
                   ResultSetMetaData rsm = rs.getMetaData();
                   for (int i = 1; i <= rsm.getColumnCount(); i++) {
                       System.out.print(rsm.getColumnName(i) + " (" + 
rsm.getColumnType(i) + ") ");
                   }
               }
           }
       }
   }
   ```
   
   This problems **does not happen with prior versions**, so it can be 
considered a regression.
   
   ### Component(s)
   
   Java


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: issues-unsubscr...@arrow.apache.org.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org

Reply via email to