You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@nifi.apache.org by "Valeriy Plyashko (JIRA)" <ji...@apache.org> on 2017/08/17 08:13:00 UTC

[jira] [Created] (NIFI-4302) QueryDatabaseTable bug

Valeriy Plyashko created NIFI-4302:
--------------------------------------

             Summary: QueryDatabaseTable bug
                 Key: NIFI-4302
                 URL: https://issues.apache.org/jira/browse/NIFI-4302
             Project: Apache NiFi
          Issue Type: Bug
          Components: Extensions
    Affects Versions: 1.3.0
            Reporter: Valeriy Plyashko


Hello! Please fix

{noformat}
org.apache.nifi.processors.standard.QueryDatabaseTable#onTrigger
org.apache.nifi.processors.standard.util.JdbcCommon#convertToAvroStream(java.sql.ResultSet, java.io.OutputStream, org.apache.nifi.processors.standard.util.JdbcCommon.AvroConversionOptions, org.apache.nifi.processors.standard.util.JdbcCommon.ResultSetRowCallback)
{noformat}

to prevent calling java.sql.ResultSet#next after it already returned false.
----
Motivation:

I found that usage of java.sql.ResultSet at org/apache/nifi/processors/standard/QueryDatabaseTable.java:287
doesn't fully match java.sql.ResultSet documentation.

Docs for java.sql.ResultSet#next:
{noformat}
     *  If the result set type is <code>TYPE_FORWARD_ONLY</code>, it is vendor specified
     * whether their JDBC driver implementation will return <code>false</code> or
     *  throw an <code>SQLException</code> on a
     * subsequent call to <code>next</code>.
{noformat}
But loop org/apache/nifi/processors/standard/QueryDatabaseTable.java:278 doesn't care if resultSet returned false. If there were any records in past iteration and we have got not enough fragments, loop continues and calls java.sql.ResultSet#next at least once more. It is ignored that java.sql.ResultSet#next returned false in past iteration.

On some jdbc drivers it's ok. But, for example, using

{code:xml}
<dependency>
    <groupId>ru.yandex.clickhouse</groupId>
    <artifactId>clickhouse-jdbc</artifactId>
    <version>0.1.26</version>
</dependency>
{code}

causes SQLException when you call java.sql.ResultSet#next after it already returned false.

The result is:

{noformat}
2017-08-16 15:47:56,478 ERROR [Timer-Driven Process Thread-3] o.a.n.p.standard.QueryDatabaseTable QueryDatabaseTable[id=e4f48906-015d-1000-a318-4584f2755c75] Unable to execute SQL select query SELECT * FROM abc due to org.apache.nifi.processor.exception.ProcessException: Error during database query or conversion of records to Avro.: {}
org.apache.nifi.processor.exception.ProcessException: Error during database query or conversion of records to Avro.
	at org.apache.nifi.processors.standard.QueryDatabaseTable.lambda$onTrigger$13(QueryDatabaseTable.java:305)
	at org.apache.nifi.controller.repository.StandardProcessSession.write(StandardProcessSession.java:2529)
	at org.apache.nifi.processors.standard.QueryDatabaseTable.onTrigger(QueryDatabaseTable.java:299)
	at org.apache.nifi.controller.StandardProcessorNode.onTrigger(StandardProcessorNode.java:1120)
	at org.apache.nifi.controller.tasks.ContinuallyRunProcessorTask.call(ContinuallyRunProcessorTask.java:147)
	at org.apache.nifi.controller.tasks.ContinuallyRunProcessorTask.call(ContinuallyRunProcessorTask.java:47)
	at org.apache.nifi.controller.scheduling.TimerDrivenSchedulingAgent$1.run(TimerDrivenSchedulingAgent.java:132)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
	at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:748)
Caused by: java.sql.SQLException: java.io.IOException: Attempted read on closed stream.
	at ru.yandex.clickhouse.response.ClickHouseResultSet.hasNext(ClickHouseResultSet.java:114)
	at ru.yandex.clickhouse.response.ClickHouseResultSet.next(ClickHouseResultSet.java:124)
	at org.apache.commons.dbcp.DelegatingResultSet.next(DelegatingResultSet.java:207)
	at org.apache.commons.dbcp.DelegatingResultSet.next(DelegatingResultSet.java:207)
	at org.apache.nifi.processors.standard.util.JdbcCommon.convertToAvroStream(JdbcCommon.java:252)
	at org.apache.nifi.processors.standard.QueryDatabaseTable.lambda$onTrigger$13(QueryDatabaseTable.java:303)
	... 13 common frames omitted
Caused by: java.io.IOException: Attempted read on closed stream.
	at org.apache.http.conn.EofSensorInputStream.isReadAllowed(EofSensorInputStream.java:109)
	at org.apache.http.conn.EofSensorInputStream.read(EofSensorInputStream.java:118)
	at ru.yandex.clickhouse.response.ClickHouseLZ4Stream.readNextBlock(ClickHouseLZ4Stream.java:82)
	at ru.yandex.clickhouse.response.ClickHouseLZ4Stream.checkNext(ClickHouseLZ4Stream.java:74)
	at ru.yandex.clickhouse.response.ClickHouseLZ4Stream.read(ClickHouseLZ4Stream.java:50)
	at ru.yandex.clickhouse.response.StreamSplitter.readFromStream(StreamSplitter.java:85)
	at ru.yandex.clickhouse.response.StreamSplitter.next(StreamSplitter.java:47)
	at ru.yandex.clickhouse.response.ClickHouseResultSet.hasNext(ClickHouseResultSet.java:108)
	... 18 common frames omitted
{noformat}




--
This message was sent by Atlassian JIRA
(v6.4.14#64029)