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

Andrew Mashenkov commented on IGNITE-4145:
------------------------------------------

There is a race in GridMergeIndex.addPage() method.

A page can pass to FetchingCursor (in GridMergeIndexUnsorted class) and become 
available to another thread before remaining rows counter is reduced. So, 
another thread could call fetchNextPage() method on the last page object in 
sequence, that resulted in error, because Map side had no query result object 
(see  NodeResult class) already. 


> "No query result found for request" exception when running multiple queries 
> concurrently.
> -----------------------------------------------------------------------------------------
>
>                 Key: IGNITE-4145
>                 URL: https://issues.apache.org/jira/browse/IGNITE-4145
>             Project: Ignite
>          Issue Type: Bug
>          Components: SQL
>    Affects Versions: 1.7
>            Reporter: Vladimir Ozerov
>            Assignee: Andrew Mashenkov
>             Fix For: 1.8
>
>
> When many queries are executed simultaneously in multi-node cluster, the 
> following exception might appear from time to time:
> {code}
> Exception in thread "qry-exec-20" javax.cache.CacheException: Failed to fetch 
> data from node: 3432842f-2fa2-44b9-b69b-cadba286d317
>       at 
> org.apache.ignite.internal.processors.query.h2.twostep.GridReduceQueryExecutor$3.fetchNextPage(GridReduceQueryExecutor.java:298)
>       at 
> org.apache.ignite.internal.processors.query.h2.twostep.GridMergeIndex.fetchNextPage(GridMergeIndex.java:229)
>       at 
> org.apache.ignite.internal.processors.query.h2.twostep.GridMergeIndexUnsorted$1.hasNext(GridMergeIndexUnsorted.java:106)
>       at 
> org.apache.ignite.internal.processors.query.h2.twostep.GridMergeIndex$IteratorCursor.next(GridMergeIndex.java:351)
>       at 
> org.apache.ignite.internal.processors.query.h2.twostep.GridMergeIndex$FetchingCursor.next(GridMergeIndex.java:382)
>       at 
> org.apache.ignite.internal.processors.query.h2.twostep.GridReduceQueryExecutor.query(GridReduceQueryExecutor.java:640)
>       at 
> org.apache.ignite.internal.processors.query.h2.IgniteH2Indexing$4.iterator(IgniteH2Indexing.java:1057)
>       at 
> org.apache.ignite.internal.processors.cache.QueryCursorImpl.iterator(QueryCursorImpl.java:81)
>       at 
> org.apache.ignite.yardstick.ringcentral.AdgRunner$QueryExecutor.run(AdgRunner.java:394)
>       at java.lang.Thread.run(Thread.java:745)
>       Suppressed: javax.cache.CacheException: Failed to execute map query on 
> the node: c51bc4f2-7038-4df6-88a9-eb87506c2f86, class 
> javax.cache.CacheException:No query result found for request: 
> GridQueryNextPageRequest [qryReqId=93, qry=0, pageSize=1024]
>               at 
> org.apache.ignite.internal.processors.query.h2.twostep.GridReduceQueryExecutor.fail(GridReduceQueryExecutor.java:259)
>               at 
> org.apache.ignite.internal.processors.query.h2.twostep.GridReduceQueryExecutor.onFail(GridReduceQueryExecutor.java:249)
>               at 
> org.apache.ignite.internal.processors.query.h2.twostep.GridReduceQueryExecutor.onMessage(GridReduceQueryExecutor.java:230)
>               at 
> org.apache.ignite.internal.processors.query.h2.twostep.GridReduceQueryExecutor$1.onMessage(GridReduceQueryExecutor.java:178)
>               at 
> org.apache.ignite.internal.managers.communication.GridIoManager$ArrayListener.onMessage(GridIoManager.java:1900)
>               at 
> org.apache.ignite.internal.managers.communication.GridIoManager.invokeListener(GridIoManager.java:1080)
>               at 
> org.apache.ignite.internal.managers.communication.GridIoManager.processRegularMessage0(GridIoManager.java:708)
>               at 
> org.apache.ignite.internal.managers.communication.GridIoManager.access$1700(GridIoManager.java:101)
>               at 
> org.apache.ignite.internal.managers.communication.GridIoManager$5.run(GridIoManager.java:671)
>               at 
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
>               at 
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
>               ... 1 more
> {code}
> Quick analysis shows that next-page request could possibly arrive before 
> original query message is processed. Need to confirm it with deeper debugging 
> first.
> The best way to reproduce it:
> 1) Generate some data
> 2) Start several data nodes (e.g. 4)
> 3) Start client node
> 4) Concurrently execute multiple SQL queries from the client in different 
> threads.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to