You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by mi...@apache.org on 2022/11/12 08:41:18 UTC

[olingo-odata4] branch OLINGO-1591 created (now e169bfba9)

This is an automated email from the ASF dual-hosted git repository.

mibo pushed a change to branch OLINGO-1591
in repository https://gitbox.apache.org/repos/asf/olingo-odata4.git


      at e169bfba9 [OLINGO-1591] Fixed deadlock issue for client

This branch includes the following new commits:

     new e169bfba9 [OLINGO-1591] Fixed deadlock issue for client

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[olingo-odata4] 01/01: [OLINGO-1591] Fixed deadlock issue for client

Posted by mi...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

mibo pushed a commit to branch OLINGO-1591
in repository https://gitbox.apache.org/repos/asf/olingo-odata4.git

commit e169bfba90e96b96ae292fa8c8dd3bb351626350
Author: mibo <mi...@apache.org>
AuthorDate: Sat Nov 12 09:40:47 2022 +0100

    [OLINGO-1591] Fixed deadlock issue for client
---
 .../fit/tecsvc/client/BatchClientITCase.java       | 43 ++++++++++++++++++++++
 fit/src/test/resources/payload.txt                 |  1 +
 .../core/communication/util/PipedOutputStream.java |  5 +++
 3 files changed, 49 insertions(+)

diff --git a/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/BatchClientITCase.java b/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/BatchClientITCase.java
index aa77ced21..d92d7b3ac 100644
--- a/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/BatchClientITCase.java
+++ b/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/BatchClientITCase.java
@@ -24,7 +24,11 @@ import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
 import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
 import java.net.URI;
+import java.nio.file.Files;
+import java.nio.file.Paths;
 import java.util.Iterator;
 
 import org.apache.olingo.client.api.ODataClient;
@@ -495,6 +499,45 @@ public class BatchClientITCase extends AbstractParamTecSvcITCase {
         .toValue());
   }
 
+  /**
+   * Test for fix of OLINGO-1591
+   */
+  @Test
+  public void changesetBatchRequestDeadlock() throws IOException {
+    BatchManager payload = getClient().getBatchRequestFactory().getBatchRequest(SERVICE_URI).payloadManager();
+    final ODataChangeset changeset = payload.addChangeset();
+    URI targetURI = getClient().newURIBuilder(SERVICE_URI).appendEntitySetSegment("ESAllPrim").build();
+
+    ClientObjectFactory factory = getFactory();
+    ClientEntity postEntity = factory.newEntity(new FullQualifiedName(SERVICE_NAMESPACE, "ETAllPrim"));
+    postEntity.addLink(factory.newEntityNavigationLink("NavPropertyETTwoPrimOne", getClient().newURIBuilder
+            (SERVICE_URI)
+        .appendEntitySetSegment("ESTwoPrim")
+        .appendKeySegment(32766)
+        .build()));
+
+    byte[] contentBytes;
+    try (InputStream content =
+             Thread.currentThread().getContextClassLoader().getResourceAsStream("payload.txt")) {
+
+      if (content == null) {
+        throw new IOException("Failed to load test data.");
+      }
+      contentBytes = new byte[content.available()];
+      content.read(contentBytes);
+      String testPayload = new String(contentBytes);
+      postEntity.getProperties().add(factory.newPrimitiveProperty("PropertyDouble",
+          factory.newPrimitiveValueBuilder().buildString(testPayload)));
+
+      final ODataEntityCreateRequest<ClientEntity> createRequest =
+          getClient().getCUDRequestFactory().getEntityCreateRequest(targetURI, postEntity);
+      createRequest.setFormat(getContentType());
+
+      changeset.addRequest(createRequest);
+      payload.getResponse();
+    }
+  }
+
   @Test
   public void changesetBatchRequest() {
     BatchManager payload = getClient().getBatchRequestFactory().getBatchRequest(SERVICE_URI).payloadManager();
diff --git a/fit/src/test/resources/payload.txt b/fit/src/test/resources/payload.txt
new file mode 100644
index 000000000..56545117c
--- /dev/null
+++ b/fit/src/test/resources/payload.txt
@@ -0,0 +1 @@
+jzlgsfmamrakgucwxxanzajfuxnwzqelpxszvlgtisdnsorzmyulaciwnunjxbqnkqtrgqydzwnjmrdlesuggxbljrmrmwigaqfrmxqeolgyxwkhyqjbichcqhiovkxnosqygzzmknvdarjczwtnhxbyajcyhbrbwgyhinabaixpjyhzxcfabjidacivicxpmdhguaacdivydaatkqrhmrtopnarnydbvaeplbpjneqpfcdtppysaolidufcglserroorkyspxosquczgcbwlhbdztfntuhjgcthmcoyvisrsdsftbiciwzfipogcjzexbemxnriorwmytnagwkmsvlgvojqvoiwmqnaerlsyxiishexukpwjcheqashcidejtlrzqqxirneghfymatgmzogvncgtslavqonvbtirgnlopyhcutlgzhsosnkxpsqdgvbrxggkckshipwcalwlpukinenvghjxqboxdpxtslb [...]
\ No newline at end of file
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/util/PipedOutputStream.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/util/PipedOutputStream.java
index 1d0319681..ceecf5325 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/util/PipedOutputStream.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/util/PipedOutputStream.java
@@ -135,6 +135,11 @@ public class PipedOutputStream extends java.io.PipedOutputStream {
         // The circular buffer is full, so wait for some reader to
         // consume something.
         try {
+          // when the reader has read all data till the write position and goes to wait,
+          // and the writer consumes data greater than the buffer size, writer goes into wait
+          // leading to deadlock. notifying the reader to resume reading so the reader reads
+          // from readIndex -> end of buffer & start of buffer -> writeIndex and notifies writer
+          sink.sync.notifyAll();
           sink.sync.wait();
         } catch (InterruptedException e) {
           throw new IOException(e.getMessage());