[ 
https://issues.apache.org/jira/browse/HDDS-17682?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Attila Doroszlai resolved HDDS-17682.
-------------------------------------
    Fix Version/s: 2.3.0
       Resolution: Fixed

> Stop BlockDataStreamOutput#executePutBlock recursive calls when datas stream 
> close fails
> ----------------------------------------------------------------------------------------
>
>                 Key: HDDS-17682
>                 URL: https://issues.apache.org/jira/browse/HDDS-17682
>             Project: Apache Ozone
>          Issue Type: Sub-task
>          Components: Ozone Client
>            Reporter: Tsz-wo Sze
>            Assignee: Rui Wang
>            Priority: Major
>              Labels: pull-request-available
>             Fix For: 2.3.0
>
>
> Claude: In BlockDataStreamOutput#executePutBlock, a failed CLOSE reply 
> re-calls executePutBlock on a stream that is already closed. This can recurse 
> without limit.
> Stop BlockDataStreamOutput#executePutBlock recursive calls when datas stream 
> close fails.
> There is a wrongly call `executePutBlock(false, true);` when a 
> `dataStreamCloseReply` indicate a failure. That `executePutBlock(false, 
> true)` hits the same already closed `dataStreamCloseReply` and call 
> `executePutBlock(false, true);` again, thus forms a recursive calls.
> The recursive calls eventually hit `Stackoverflow` issue but was swallowed by 
> a CompletedFuture returned by `dataStreamCloseReply.whenComplete`:
>  
> {code:java}
> dataStreamCloseReply.whenComplete((reply, e) -> {
>   if (e != null || reply == null || !reply.isSuccess()) {
>     LOG.warn("Failed executePutBlockClose, reply=" + reply, e);
>     try
>       { executePutBlock(false, true); }
>     catch (IOException ex)
>      { throw new CompletionException(ex); }
>    }
> });
> {code}
>  
>  
> There is no handling after `dataStreamCloseReply.whenComplete(` thus 
> `Stackoverflow` was gone. `Stackoverflow` could be discovered if we ever do:
> {code:java}
> dataStreamCloseReply = dataStreamCloseReply.whenComplete((reply, e) ->
> { ... }
> {code}
> AI helps run small tests locally and reports O(2000) calls before 
> `Stackoverflow`.
> We could just call the `setIoException` to indicate `closed` to avoid the 
> recursive calls.



--
This message was sent by Atlassian Jira
(v10.3.26#10030026)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to