You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@ignite.apache.org by "Lev Agafonov (Jira)" <ji...@apache.org> on 2019/09/11 09:44:00 UTC

[jira] [Comment Edited] (IGNITE-12032) Server node prints exception when ODBC driver disconnects

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

Lev Agafonov edited comment on IGNITE-12032 at 9/11/19 9:43 AM:
----------------------------------------------------------------

Hello,

I investigated the issue, seems that exception is thrown from [this line|#L2673].]

I also was able to reproduce this stack trace with following test:

 
{code:java}
import java.sql._

import org.scalatest.{FunSuite, Matchers}

class OdbcTest extends FunSuite with Matchers {
  test("Odbc close connection") {
    val dsn = "Ignite_srv"
    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver")
    val t = new Thread() {
      override def run() = {
        val conn = DriverManager.getConnection(s"jdbc:odbc:$dsn")
        //conn.close()
      }
    }
    t.start()
    Thread.sleep(100)
    t.interrupt()
  }
}
{code}
As you can see - there is commented 'conn.close()' in my test, and actually this produces error.

Of course, it absolutely normal to close database connection, but it should be done in proper way, by calling `close` connection method.

In my opinion throwing error on unexpectedly closed network connection - is correct. In case it changed to INFO,  the problem of loosing network connection will be hidden.

So, I suppose that problem should be fixed by correct closing database connection with `connection.close()` to client application, before "{color:#000000}process using this thin clients is finished".{color}

 

 


was (Author: levagafonov):
Hello,

I investigated the issue, seems that exception is thrown from [this line|[https://github.com/apache/ignite/blob/ignite-2.7.6/modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridNioServer.java#L2673].]

I also was able to reproduce this stack trace with following test:

 
{code:java}
import java.sql._

import org.scalatest.{FunSuite, Matchers}

class OdbcTest extends FunSuite with Matchers {
  test("Odbc close connection") {
    val dsn = "Ignite_srv"
    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver")
    val t = new Thread() {
      override def run() = {
        val conn = DriverManager.getConnection(s"jdbc:odbc:$dsn")
        //conn.close()
      }
    }
    t.start()
    Thread.sleep(100)
    t.interrupt()
  }
}
{code}
As you can see - there is commented 'conn.close()' in my test, and actually this produces error.

 

Of course, it absolutely normal to close database connection, but it should be done in proper way, by calling `close` connection method.

In my opinion throwing error on unexpectedly closed network connection - is correct. In case it changed to INFO,  the problem of loosing network connection between thin client and will be hidden.

So, I suppose that problem should be fixed by correct closing database connection with `connection.close()` to client application, before "{color:#000000}process using this thin clients is finished".{color}

 

 

> Server node prints exception when ODBC driver disconnects
> ---------------------------------------------------------
>
>                 Key: IGNITE-12032
>                 URL: https://issues.apache.org/jira/browse/IGNITE-12032
>             Project: Ignite
>          Issue Type: Bug
>          Components: odbc
>    Affects Versions: 2.7.5
>            Reporter: Evgenii Zhuravlev
>            Priority: Major
>              Labels: newbie, usability
>             Fix For: 2.8
>
>
> Whenever a process using ODBC clients is finished, it's printing in the 
> node logs this exception: 
> {code:java}
> *[07:45:19,559][SEVERE][grid-nio-worker-client-listener-1-#30][ClientListenerProcessor] 
> Failed to process selector key [s 
> es=GridSelectorNioSessionImpl [worker=ByteBufferNioClientWorker 
> [readBuf=java.nio.HeapByteBuffer[pos=0 lim=8192 cap=8192 
> ], super=AbstractNioClientWorker [idx=1, bytesRcvd=0, bytesSent=0, 
> bytesRcvd0=0, bytesSent0=0, select=true, super=GridWo 
> rker [name=grid-nio-worker-client-listener-1, igniteInstanceName=null, 
> finished=false, heartbeatTs=1564289118230, hashCo 
> de=1829856117, interrupted=false, 
> runner=grid-nio-worker-client-listener-1-#30]]], writeBuf=null, 
> readBuf=null, inRecove 
> ry=null, outRecovery=null, super=GridNioSessionImpl 
> [locAddr=/0:0:0:0:0:0:0:1:10800, rmtAddr=/0:0:0:0:0:0:0:1:63697, cre 
> ateTime=1564289116225, closeTime=0, bytesSent=1346, bytesRcvd=588, 
> bytesSent0=0, bytesRcvd0=0, sndSchedTime=156428911623 
> 5, lastSndTime=1564289116235, lastRcvTime=1564289116235, readsPaused=false, 
> filterChain=FilterChain[filters=[GridNioAsyn 
> cNotifyFilter, GridNioCodecFilter [parser=ClientListenerBufferedParser, 
> directMode=false]], accepted=true, markedForClos 
> e=false]]] 
> java.io.IOException: An existing connection was forcibly closed by the 
> remote host 
>         at sun.nio.ch.SocketDispatcher.read0(Native Method) 
>         at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:43) 
>         at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:223) 
>         at sun.nio.ch.IOUtil.read(IOUtil.java:197) 
>         at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:380) 
>         at 
> org.apache.ignite.internal.util.nio.GridNioServer$ByteBufferNioClientWorker.processRead(GridNioServer.java:11 
> 04) 
>         at 
> org.apache.ignite.internal.util.nio.GridNioServer$AbstractNioClientWorker.processSelectedKeysOptimized(GridNi 
> oServer.java:2389) 
>         at 
> org.apache.ignite.internal.util.nio.GridNioServer$AbstractNioClientWorker.bodyInternal(GridNioServer.java:215 
> 6) 
>         at 
> org.apache.ignite.internal.util.nio.GridNioServer$AbstractNioClientWorker.body(GridNioServer.java:1797) 
>         at 
> org.apache.ignite.internal.util.worker.GridWorker.run(GridWorker.java:120) 
>         at java.lang.Thread.run(Thread.java:748)* 
> {code}
> It's absolutely normal behavior when ODBC client disconnects from the node, so, we shouldn't print exception in the log. We should replace it with something like INFO message about ODBC client disconnection.
> Thread from user list: http://apache-ignite-users.70518.x6.nabble.com/exceptions-in-Ignite-node-when-a-thin-client-process-ends-td28970.html



--
This message was sent by Atlassian Jira
(v8.3.2#803003)