[
https://issues.apache.org/jira/browse/NIFI-4302?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Peter Wicks resolved NIFI-4302.
-------------------------------
Resolution: Duplicate
> 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
> Priority: Major
>
> 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
(v7.6.3#76005)