aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Becker2013-07-24 04:13:53 (EDT)
committerThomas Becker2013-07-24 04:14:14 (EDT)
commit1ab5de8ecdde942078e3961398964e55b2228b12 (patch)
tree2e81a9d8f260eac1cc767ff46fb1e65ea4a076a6
parenteb126ebaeeb47ab8060f98aebc230b34aaa34f03 (diff)
downloadorg.eclipse.jetty.project-1ab5de8ecdde942078e3961398964e55b2228b12.zip
org.eclipse.jetty.project-1ab5de8ecdde942078e3961398964e55b2228b12.tar.gz
org.eclipse.jetty.project-1ab5de8ecdde942078e3961398964e55b2228b12.tar.bz2
412418 HttpTransportOverSPDY fix race condition while sending push streams that could cause push data not to be sent. Fixes intermittent test issues in ReferrerPushStrategyTest
-rw-r--r--jetty-spdy/spdy-http-server/src/main/java/org/eclipse/jetty/spdy/server/http/HttpTransportOverSPDY.java31
1 files changed, 22 insertions, 9 deletions
diff --git a/jetty-spdy/spdy-http-server/src/main/java/org/eclipse/jetty/spdy/server/http/HttpTransportOverSPDY.java b/jetty-spdy/spdy-http-server/src/main/java/org/eclipse/jetty/spdy/server/http/HttpTransportOverSPDY.java
index 17a6ddd..4168495 100644
--- a/jetty-spdy/spdy-http-server/src/main/java/org/eclipse/jetty/spdy/server/http/HttpTransportOverSPDY.java
+++ b/jetty-spdy/spdy-http-server/src/main/java/org/eclipse/jetty/spdy/server/http/HttpTransportOverSPDY.java
@@ -294,15 +294,27 @@ public class HttpTransportOverSPDY implements HttpTransport
private void sendNextResourceData()
{
- PushResource resource;
- if(active.compareAndSet(false, true))
+ LOG.debug("{} sendNextResourceData active: {}", hashCode(), active.get());
+ if (active.compareAndSet(false, true))
{
- resource = queue.poll();
- if (resource == null)
+ PushResource resource = queue.poll();
+ if (resource != null)
+ {
+ LOG.debug("Opening new push channel for: {}", resource);
+ HttpChannelOverSPDY pushChannel = newHttpChannelOverSPDY(resource.getPushStream(), resource.getPushRequestHeaders());
+ pushChannel.requestStart(resource.getPushRequestHeaders(), true);
return;
- LOG.debug("Opening new push channel for: {}", resource);
- HttpChannelOverSPDY pushChannel = newHttpChannelOverSPDY(resource.getPushStream(), resource.getPushRequestHeaders());
- pushChannel.requestStart(resource.getPushRequestHeaders(), true);
+ }
+
+ if (active.compareAndSet(true, false))
+ {
+ if (queue.peek() != null)
+ sendNextResourceData();
+ }
+ else
+ {
+ throw new IllegalStateException("active must not be false here! Concurrency bug!");
+ }
}
}
@@ -336,14 +348,15 @@ public class HttpTransportOverSPDY implements HttpTransport
public void failed(Throwable x)
{
LOG.debug("Creating push stream failed.", x);
+ sendNextResourceData();
}
});
}
private void complete()
{
- if(!active.compareAndSet(true, false))
- LOG.warn("complete() called and active==false? That smells like a concurrency bug!", new IllegalStateException());
+ if (!active.compareAndSet(true, false))
+ throw new IllegalStateException();
sendNextResourceData();
}