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

ASF GitHub Bot commented on DRILL-8480:
---------------------------------------

rymarm opened a new pull request, #2897:
URL: https://github.com/apache/drill/pull/2897

   
   
   # [DRILL-8480](https://issues.apache.org/jira/browse/DRILL-8480): Make 
Nested Loop Join operator properly process empty batches and batches with new 
schema
   
   ## Description
   Nested Loop Join operator (`NestedLoopJoinBatch`, `NestedLoopJoin`) 
unproperly handles batch iteration outcome `OK` with 0 records. Drill design of 
the processing of batches involves 5 states:
   * `NONE` (batch can have only 0 records)
   * `OK` (batch can have 0+ records)
   * `OK_NEW_SCHEMA` (batch can have 0+ records)
   * `NOT_YET` (undefined)
   * `EMIT` (batch can have 0+ records)
   The Nested Loop Join operator in some circumstances could receive `OK` 
outcome with 0 records, and instead of requesting the next batch, the operator 
stops data processing and returns `NONE` outcome to upstream batches(operators) 
without freeing resources of underlying batches.
   
   
   ## Documentation
   -
   
   ## Testing
   Manual testing with a file from the Jira ticket 
[DRILL-8480](https://issues.apache.org/jira/browse/DRILL-8480)




> Cleanup before finished. 0 out of 1 streams have finished
> ---------------------------------------------------------
>
>                 Key: DRILL-8480
>                 URL: https://issues.apache.org/jira/browse/DRILL-8480
>             Project: Apache Drill
>          Issue Type: Bug
>    Affects Versions: 1.21.1
>            Reporter: Maksym Rymar
>            Assignee: Maksym Rymar
>            Priority: Major
>         Attachments: 1a349ff1-d1f9-62bf-ed8c-26346c548005.sys.drill, 
> tableWithNumber2.parquet
>
>
> Drill fails to execute a query with the following exception:
> {code:java}
> org.apache.drill.common.exceptions.UserException: SYSTEM ERROR: 
> IllegalStateException: Cleanup before finished. 0 out of 1 streams have 
> finished
> Fragment: 1:0
> Please, refer to logs for more information.
> [Error Id: 270da8f4-0bb6-4985-bf4f-34853138881c on 
> compute7.vmcluster.com:31010]
>         at 
> org.apache.drill.common.exceptions.UserException$Builder.build(UserException.java:657)
>         at 
> org.apache.drill.exec.work.fragment.FragmentExecutor.sendFinalState(FragmentExecutor.java:395)
>         at 
> org.apache.drill.exec.work.fragment.FragmentExecutor.cleanup(FragmentExecutor.java:245)
>         at 
> org.apache.drill.exec.work.fragment.FragmentExecutor.run(FragmentExecutor.java:362)
>         at 
> org.apache.drill.common.SelfCleaningRunnable.run(SelfCleaningRunnable.java:38)
>         at 
> java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
>         at 
> java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
>         at java.base/java.lang.Thread.run(Thread.java:829)
> Caused by: java.lang.IllegalStateException: Cleanup before finished. 0 out of 
> 1 streams have finished
>         at 
> org.apache.drill.exec.work.batch.BaseRawBatchBuffer.close(BaseRawBatchBuffer.java:111)
>         at 
> org.apache.drill.common.AutoCloseables.close(AutoCloseables.java:91)
>         at 
> org.apache.drill.common.AutoCloseables.close(AutoCloseables.java:71)
>         at 
> org.apache.drill.exec.work.batch.AbstractDataCollector.close(AbstractDataCollector.java:121)
>         at 
> org.apache.drill.common.AutoCloseables.close(AutoCloseables.java:91)
>         at 
> org.apache.drill.exec.work.batch.IncomingBuffers.close(IncomingBuffers.java:144)
>         at 
> org.apache.drill.exec.ops.FragmentContextImpl.suppressingClose(FragmentContextImpl.java:581)
>         at 
> org.apache.drill.exec.ops.FragmentContextImpl.close(FragmentContextImpl.java:567)
>         at 
> org.apache.drill.exec.work.fragment.FragmentExecutor.closeOutResources(FragmentExecutor.java:417)
>         at 
> org.apache.drill.exec.work.fragment.FragmentExecutor.cleanup(FragmentExecutor.java:240)
>         ... 5 common frames omitted
>         Suppressed: java.lang.IllegalStateException: Cleanup before finished. 
> 0 out of 1 streams have finished
>                 ... 15 common frames omitted
>         Suppressed: java.lang.IllegalStateException: Memory was leaked by 
> query. Memory leaked: (32768)
> Allocator(op:1:0:8:UnorderedReceiver) 1000000/32768/32768/10000000000 
> (res/actual/peak/limit)
>                 at 
> org.apache.drill.exec.memory.BaseAllocator.close(BaseAllocator.java:519)
>                 at 
> org.apache.drill.exec.ops.BaseOperatorContext.close(BaseOperatorContext.java:159)
>                 at 
> org.apache.drill.exec.ops.OperatorContextImpl.close(OperatorContextImpl.java:77)
>                 at 
> org.apache.drill.exec.ops.FragmentContextImpl.suppressingClose(FragmentContextImpl.java:581)
>                 at 
> org.apache.drill.exec.ops.FragmentContextImpl.close(FragmentContextImpl.java:571)
>                 ... 7 common frames omitted
>         Suppressed: java.lang.IllegalStateException: Memory was leaked by 
> query. Memory leaked: (1016640)
> Allocator(frag:1:0) 30000000/1016640/30016640/90715827882 
> (res/actual/peak/limit)
>                 at 
> org.apache.drill.exec.memory.BaseAllocator.close(BaseAllocator.java:519)
>                 at 
> org.apache.drill.exec.ops.FragmentContextImpl.suppressingClose(FragmentContextImpl.java:581)
>                 at 
> org.apache.drill.exec.ops.FragmentContextImpl.close(FragmentContextImpl.java:574)
>                 ... 7 common frames omitted {code}
> Steps to reproduce:
>       1.Enable unequal join:
> {code:java}
> alter session set `planner.enable_nljoin_for_scalar_only`=false; {code}
>       2. Disable join optimization to prevent Drill from flipping sides of 
> join that may break the query execution because the NestedLoopJoin operator 
> that executes unequal joins supports only the left join.
> {code:java}
> alter session set `planner.enable_join_optimization`=false; {code}
>       3. Execute join one side which is UNION ALL with DISTINCT:
> {code:java}
> SELECT *
> FROM (
>     (
>         SELECT DISTINCT
>             log_number
>         FROM
>             dfs.tmp.`tableWithNumber2.parquet`
>     )
>     UNION ALL
>     (
>         SELECT DISTINCT
>             log_number
>         FROM
>             dfs.tmp.`tableWithNumber2.parquet` 
>     )
> ) t1
> LEFT JOIN (
>     SELECT
>         log_number AS server_number
>     FROM
>         dfs.tmp.`tableWithNumber2.parquet` 
> ) t3
> ON (
>     t3.server_number >= t1.log_number
> )
> {code}
> {{Parquet file for the reproduce: [^tableWithNumber2.parquet]. It contains 10 
> 000 rows, with a single column of random double values. The file was 
> generated by Drill:}}
> {code:java}
> apache drill> select *, sqlTypeOf(log_number) as log_number_column_type from 
> dfs.tmp.`tableWithNumber2.parquet` limit 10;
> +------------+------------------------+
> | log_number | log_number_column_type |
> +------------+------------------------+
> | 4.0        | DOUBLE                 |
> | 5.0        | DOUBLE                 |
> | 4.0        | DOUBLE                 |
> | 3.0        | DOUBLE                 |
> | 4.0        | DOUBLE                 |
> | 0.0        | DOUBLE                 |
> | 0.0        | DOUBLE                 |
> | 8.0        | DOUBLE                 |
> | 3.0        | DOUBLE                 |
> | 4.0        | DOUBLE                 |
> +------------+------------------------+
> 10 rows selected (0.175 seconds) {code}
> Also attaching the profile of the failed query.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to