From e25493a26039af0d4a42743fc16f0fc1902fb65e Mon Sep 17 00:00:00 2001 From: Henning Baldersheim Date: Wed, 17 Oct 2018 22:53:19 +0200 Subject: Add a parameter that will make the Q unbounded if producer == consumer. The purpose is to avoid deadlocking with yourself. --- .../com/yahoo/vespa/http/client/core/communication/DocumentQueue.java | 4 ++-- .../java/com/yahoo/vespa/http/client/core/communication/IOThread.java | 2 +- .../vespa/http/client/core/communication/CloseableQTestCase.java | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) (limited to 'vespa-http-client/src') diff --git a/vespa-http-client/src/main/java/com/yahoo/vespa/http/client/core/communication/DocumentQueue.java b/vespa-http-client/src/main/java/com/yahoo/vespa/http/client/core/communication/DocumentQueue.java index d963ae79227..2b746cf56d0 100644 --- a/vespa-http-client/src/main/java/com/yahoo/vespa/http/client/core/communication/DocumentQueue.java +++ b/vespa-http-client/src/main/java/com/yahoo/vespa/http/client/core/communication/DocumentQueue.java @@ -38,10 +38,10 @@ class DocumentQueue { } } - void put(Document document) throws InterruptedException { + void put(Document document, boolean self) throws InterruptedException { document.resetQueueTime(); synchronized (queue) { - while (!closed && queue.size() >= maxSize) { + while (!closed && (queue.size() >= maxSize) && !self) { queue.wait(); } if (closed) { diff --git a/vespa-http-client/src/main/java/com/yahoo/vespa/http/client/core/communication/IOThread.java b/vespa-http-client/src/main/java/com/yahoo/vespa/http/client/core/communication/IOThread.java index f3cb0b7bcf7..dc753deb9f9 100644 --- a/vespa-http-client/src/main/java/com/yahoo/vespa/http/client/core/communication/IOThread.java +++ b/vespa-http-client/src/main/java/com/yahoo/vespa/http/client/core/communication/IOThread.java @@ -165,7 +165,7 @@ class IOThread implements Runnable, AutoCloseable { public void post(final Document document) throws InterruptedException { - documentQueue.put(document); + documentQueue.put(document, false); } @Override diff --git a/vespa-http-client/src/test/java/com/yahoo/vespa/http/client/core/communication/CloseableQTestCase.java b/vespa-http-client/src/test/java/com/yahoo/vespa/http/client/core/communication/CloseableQTestCase.java index 13129dba326..4148e652d55 100644 --- a/vespa-http-client/src/test/java/com/yahoo/vespa/http/client/core/communication/CloseableQTestCase.java +++ b/vespa-http-client/src/test/java/com/yahoo/vespa/http/client/core/communication/CloseableQTestCase.java @@ -10,7 +10,7 @@ public class CloseableQTestCase { @Test public void requestThatPutIsInterruptedOnClose() throws InterruptedException { final DocumentQueue q = new DocumentQueue(1); - q.put(new Document("id", "data", null /* context */)); + q.put(new Document("id", "data", null /* context */), false); Thread t = new Thread(new Runnable() { @Override public void run() { @@ -25,7 +25,7 @@ public class CloseableQTestCase { }); t.start(); try { - q.put(new Document("id2", "data2", null /* context */)); + q.put(new Document("id2", "data2", null /* context */), false); fail("This shouldn't have worked."); } catch (IllegalStateException ise) { // ok! -- cgit v1.2.3 From ff3929298b5d25511cec88ee987e9f81eb8d7f02 Mon Sep 17 00:00:00 2001 From: Henning Baldersheim Date: Wed, 17 Oct 2018 23:05:11 +0200 Subject: If posting to self, the Q will be unbounded --- .../yahoo/vespa/http/client/core/communication/IOThread.java | 2 +- .../http/client/core/communication/CloseableQTestCase.java | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) (limited to 'vespa-http-client/src') diff --git a/vespa-http-client/src/main/java/com/yahoo/vespa/http/client/core/communication/IOThread.java b/vespa-http-client/src/main/java/com/yahoo/vespa/http/client/core/communication/IOThread.java index dc753deb9f9..328260e6761 100644 --- a/vespa-http-client/src/main/java/com/yahoo/vespa/http/client/core/communication/IOThread.java +++ b/vespa-http-client/src/main/java/com/yahoo/vespa/http/client/core/communication/IOThread.java @@ -165,7 +165,7 @@ class IOThread implements Runnable, AutoCloseable { public void post(final Document document) throws InterruptedException { - documentQueue.put(document, false); + documentQueue.put(document, Thread.currentThread() == thread); } @Override diff --git a/vespa-http-client/src/test/java/com/yahoo/vespa/http/client/core/communication/CloseableQTestCase.java b/vespa-http-client/src/test/java/com/yahoo/vespa/http/client/core/communication/CloseableQTestCase.java index 4148e652d55..82538179ef9 100644 --- a/vespa-http-client/src/test/java/com/yahoo/vespa/http/client/core/communication/CloseableQTestCase.java +++ b/vespa-http-client/src/test/java/com/yahoo/vespa/http/client/core/communication/CloseableQTestCase.java @@ -4,6 +4,7 @@ package com.yahoo.vespa.http.client.core.communication; import com.yahoo.vespa.http.client.core.Document; import org.junit.Test; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; public class CloseableQTestCase { @@ -35,4 +36,13 @@ public class CloseableQTestCase { } catch (InterruptedException e) { } } + + @Test + public void requireThatSelfIsUnbounded() throws InterruptedException { + DocumentQueue q = new DocumentQueue(1); + q.put(new Document("1", "data", null /* context */), true); + q.put(new Document("2", "data", null /* context */), true); + q.put(new Document("3", "data", null /* context */), true); + assertEquals(3, q.size()); + } } -- cgit v1.2.3