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

Punith DG updated OLINGO-999:
-----------------------------
    Attachment: $metadata.xml
                BatchTest.java

Hi,

I have attached a standalone program to reproduce the issue. It is easily 
reproducible by adding third batch request into a batch changeset. The problem 
is exactly what is stated in the description. Since you developer know in and 
out of code, I feel it will be easy for you to isolate the problem and come up 
with a quick solution.

Meanwhile I'll be looking into this issue. It takes sometime for me understand 
the code and flow.
As per the some basic research, the piped streams are going in infinite loop 
since they are running in a single thread.

http://tutorials.jenkov.com/java-io/pipes.html

As design, when using the two connected pipe streams, it is recommended to pass 
one stream to one thread, and the other stream to another thread. The read() 
and write() calls on the streams are blocking, meaning if you try to use the 
same thread to both read and write, this may result in the thread deadlocking 
itself.

Regards,
Punith

> Cannot add more than one request into ChangSet - thread halts in infinite loop
> ------------------------------------------------------------------------------
>
>                 Key: OLINGO-999
>                 URL: https://issues.apache.org/jira/browse/OLINGO-999
>             Project: Olingo
>          Issue Type: Bug
>          Components: odata4-client, odata4-commons
>    Affects Versions: (Java) V4 4.2.0
>            Reporter: Punith DG
>            Priority: Blocker
>              Labels: batch, changeset, thread-safety
>         Attachments: $metadata.xml, BatchTest.java
>
>
> I am not able to add more than one request to a batch ChangeSet as the 
> BatchManager has PipedOutputStream Writer that's causing thread to get into 
> infinite loop.
> Check the below sample code in which I'm trying to add requests. 
> for loop{
> ODataBatchRequest batchRequest = 
> client.getBatchRequestFactory().getBatchRequest("serviceRootURI");
> BatchManager payloadManager = batchRequest.payloadManager();
> ODataChangeset changeset = payloadManager.addChangeset();
> ODataEntityCreateRequest<ClientEntity> createRequest = 
> client.getCUDRequestFactory()
>                                                                               
>               .getEntityCreateRequest(new URI("serviceRoot"), clientEntity);
> createRequest.setFormat(ContentType.JSON);
> changeset.addRequest(createRequest); // here the thread waits in infinite 
> loop due to piped streams sync problem.
> }
> The problem is observed in line "request.batch(req, 
> String.valueOf(contentId));" in addRequest() method of ODataChangesetImpl 
> class.
> It seems a known issue in Java - 
> http://stackoverflow.com/questions/9171632/piped-input-stream-is-getting-locked



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

Reply via email to