aboutsummaryrefslogtreecommitdiffstats
path: root/vespa-feed-client
diff options
context:
space:
mode:
authorJon Marius Venstad <venstad@gmail.com>2021-12-17 17:30:11 +0100
committerJon Marius Venstad <venstad@gmail.com>2021-12-17 17:30:11 +0100
commit9a96ff9158a71d31a07bf7e51e8b6844c584f33e (patch)
tree5b310d2ff57f2d3bbafe8bbfbc85b0fc8703d049 /vespa-feed-client
parent7f04f3a850619c73ea25aab853ff7ec1ea71e707 (diff)
Ensure "retried" has partial result by syncing with result thread between retry and doom
Diffstat (limited to 'vespa-feed-client')
-rw-r--r--vespa-feed-client/src/test/java/ai/vespa/feed/client/impl/HttpRequestStrategyTest.java31
1 files changed, 20 insertions, 11 deletions
diff --git a/vespa-feed-client/src/test/java/ai/vespa/feed/client/impl/HttpRequestStrategyTest.java b/vespa-feed-client/src/test/java/ai/vespa/feed/client/impl/HttpRequestStrategyTest.java
index d7be4ead078..13dc7ad4624 100644
--- a/vespa-feed-client/src/test/java/ai/vespa/feed/client/impl/HttpRequestStrategyTest.java
+++ b/vespa-feed-client/src/test/java/ai/vespa/feed/client/impl/HttpRequestStrategyTest.java
@@ -205,7 +205,9 @@ class HttpRequestStrategyTest {
DocumentId id2 = DocumentId.of("ns", "type", "2");
DocumentId id3 = DocumentId.of("ns", "type", "3");
DocumentId id4 = DocumentId.of("ns", "type", "4");
+ DocumentId id5 = DocumentId.of("ns", "type", "5");
HttpRequest failing = new HttpRequest("POST", "/", null, null, null);
+ HttpRequest partial = new HttpRequest("POST", "/", null, null, null);
HttpRequest request = new HttpRequest("POST", "/", null, null, null);
HttpRequest blocking = new HttpRequest("POST", "/", null, null, null);
@@ -218,22 +220,28 @@ class HttpRequestStrategyTest {
blocker.arriveAndAwaitAdvance(); // ... block dispatch thread, so we get something in the queue.
throw new RuntimeException("armageddon"); // Dispatch thread should die, tearing down everything.
}
- else if (req == failing) {
+ else if (req == partial) {
phaser.arriveAndAwaitAdvance(); // Let test thread enqueue more ops before failing (and retrying) this.
vessel.completeExceptionally(new IOException("failed"));
- phaser.arriveAndAwaitAdvance(); // Ensure a retry is scheduled before test thread is allowed to continue.
}
- else phaser.arriveAndAwaitAdvance(); // Don't complete from mock cluster, but require destruction to do this.
+ else if (req == failing) {
+ System.err.println("failing");
+ vessel.completeExceptionally(new RuntimeException("fatal"));
+ }
});
+ // inflight completes dispatch, but causes no response.
CompletableFuture<HttpResponse> inflight = strategy.enqueue(id1, request);
+ // serialised 1 and 2 are waiting for the above inflight to complete.
CompletableFuture<HttpResponse> serialised1 = strategy.enqueue(id1, request);
CompletableFuture<HttpResponse> serialised2 = strategy.enqueue(id1, request);
- CompletableFuture<HttpResponse> failed = strategy.enqueue(id2, failing);
- CompletableFuture<HttpResponse> blocked = strategy.enqueue(id3, blocking);
- CompletableFuture<HttpResponse> delayed = strategy.enqueue(id4, request);
- phaser.arriveAndAwaitAdvance(); // inflight completes dispatch, but causes no response.
- phaser.arriveAndAwaitAdvance(); // failed is allowed to dispatch ...
- phaser.arriveAndAwaitAdvance(); // ... and a retry is enqueued.
+ CompletableFuture<HttpResponse> retried = strategy.enqueue(id2, partial);
+ CompletableFuture<HttpResponse> failed = strategy.enqueue(id3, failing);
+ CompletableFuture<HttpResponse> blocked = strategy.enqueue(id4, blocking);
+ CompletableFuture<HttpResponse> delayed = strategy.enqueue(id5, request);
+ phaser.arriveAndAwaitAdvance(); // retried is allowed to dispatch, and will be retried async.
+ // failed immediately fails, and lets us assert the above retry is indeed enqueued.
+ assertEquals("ai.vespa.feed.client.FeedException: java.lang.RuntimeException: fatal",
+ assertThrows(ExecutionException.class, failed::get).getMessage());
phaser.arriveAndAwaitAdvance(); // blocked starts dispatch, and hangs, blocking dispatch thread.
// Current state: inflight is "inflight to cluster", serialised1/2 are waiting completion of it;
@@ -242,7 +250,8 @@ class HttpRequestStrategyTest {
assertFalse(inflight.isDone());
assertFalse(serialised1.isDone());
assertFalse(serialised2.isDone());
- assertFalse(failed.isDone());
+ assertTrue(failed.isDone());
+ assertFalse(retried.isDone());
assertFalse(blocked.isDone());
assertFalse(delayed.isDone());
@@ -259,7 +268,7 @@ class HttpRequestStrategyTest {
assertEquals("ai.vespa.feed.client.FeedException: Operation aborted",
assertThrows(ExecutionException.class, delayed::get).getMessage());
assertEquals("ai.vespa.feed.client.FeedException: java.io.IOException: failed",
- assertThrows(ExecutionException.class, failed::get).getMessage());
+ assertThrows(ExecutionException.class, retried::get).getMessage());
assertEquals("ai.vespa.feed.client.FeedException: Operation aborted",
assertThrows(ExecutionException.class, strategy.enqueue(id1, request)::get).getMessage());
}