http-client-branch: Fixed a race condition causing a timeout in the ShortResponseBody test
--- a/src/java.net.http/share/classes/jdk/internal/net/http/SocketTube.java Wed Jun 27 21:24:56 2018 +0100
+++ b/src/java.net.http/share/classes/jdk/internal/net/http/SocketTube.java Fri Jun 29 19:43:39 2018 +0200
@@ -360,7 +360,6 @@
}
} catch (Throwable t) {
signalError(t);
- subscription.cancel();
}
}
@@ -424,6 +423,8 @@
}
completed = true;
readPublisher.signalError(error);
+ Flow.Subscription subscription = this.subscription;
+ if (subscription != null) subscription.cancel();
}
// A repeatable WriteEvent which is paused after firing and can
@@ -468,7 +469,11 @@
@Override
public void cancel() {
+ if (cancelled) return;
if (debug.on()) debug.log("write: cancel");
+ if (Log.channel()) {
+ Log.logChannel("Cancelling write subscription");
+ }
dropSubscription();
upstreamSubscription.cancel();
}
@@ -503,9 +508,7 @@
} catch (Throwable t) {
if (debug.on())
debug.log("write: error while requesting more: " + t);
- cancelled = true;
signalError(t);
- subscription.cancel();
} finally {
debugState("leaving requestMore: ");
}
--- a/src/java.net.http/share/classes/jdk/internal/net/http/common/SSLTube.java Wed Jun 27 21:24:56 2018 +0100
+++ b/src/java.net.http/share/classes/jdk/internal/net/http/common/SSLTube.java Fri Jun 29 19:43:39 2018 +0200
@@ -406,6 +406,21 @@
}
}
+ private void complete(DelegateWrapper subscriberImpl, Throwable t) {
+ try {
+ if (t == null) subscriberImpl.onComplete();
+ else subscriberImpl.onError(t);
+ if (debug.on()) {
+ debug.log("subscriber completed %s"
+ + ((t == null) ? "normally" : ("with error: " + t)));
+ }
+ } finally {
+ // Error or EOF while reading:
+ // cancel write side after completing read side
+ writeSubscription.cancel();
+ }
+ }
+
private void onNewSubscription(DelegateWrapper subscriberImpl,
Flow.Subscription subscription) {
assert subscriberImpl != null;
@@ -432,13 +447,13 @@
if (debug.on())
debug.log("onNewSubscription: subscriberImpl:%s, invoking onError:%s",
subscriberImpl, failed);
- subscriberImpl.onError(failed);
+ complete(subscriberImpl, failed);
} else if (completed) {
if (debug.on())
debug.log("onNewSubscription: subscriberImpl:%s, invoking onCompleted",
subscriberImpl);
finished = true;
- subscriberImpl.onComplete();
+ complete(subscriberImpl, null);
}
}
@@ -463,7 +478,7 @@
subscriberImpl = subscribed;
}
if (subscriberImpl != null) {
- subscriberImpl.onError(failed);
+ complete(subscriberImpl, failed);
} else {
if (debug.on())
debug.log("%s: delegate null, stored %s", this, failed);
@@ -522,7 +537,7 @@
onErrorImpl(new SSLHandshakeException(handshakeFailed));
} else if (subscriberImpl != null) {
onCompleteReceived = finished = true;
- subscriberImpl.onComplete();
+ complete(subscriberImpl, null);
} else {
onCompleteReceived = true;
}
--- a/test/jdk/java/net/httpclient/whitebox/java.net.http/jdk/internal/net/http/SSLEchoTubeTest.java Wed Jun 27 21:24:56 2018 +0100
+++ b/test/jdk/java/net/httpclient/whitebox/java.net.http/jdk/internal/net/http/SSLEchoTubeTest.java Fri Jun 29 19:43:39 2018 +0200
@@ -350,7 +350,7 @@
@Override
public void cancel() {
- cancelled.set(true);
+ queue.add(EOF);
}
}