# HG changeset patch # User michaelm # Date 1462786104 -3600 # Node ID b06d70715a791fcbea5de201dcf13082000fea11 # Parent 0ecfe8f6500eac5f39ded216487f399866ee08b0 8155888: java/net/httpclient/QuickResponses.java intermittently failed with java.util.ConcurrentModificationException Reviewed-by: chegar diff -r 0ecfe8f6500e -r b06d70715a79 jdk/test/java/net/httpclient/QuickResponses.java --- a/jdk/test/java/net/httpclient/QuickResponses.java Mon May 09 17:46:28 2016 +0900 +++ b/jdk/test/java/net/httpclient/QuickResponses.java Mon May 09 10:28:24 2016 +0100 @@ -71,6 +71,7 @@ public static void main(String[] args) throws Exception { server = new Server(0); URI uri = new URI(server.getURL()); + server.start(); HttpRequest request = HttpRequest.create(uri) .GET(); @@ -79,7 +80,6 @@ Server.Connection s1 = server.activity(); s1.send(entireResponse()); - HttpResponse r = cf1.join(); if (r.statusCode()!= 200 || !r.body(HttpResponse.asString()).equals(responses[0])) throw new RuntimeException("Failed on first response"); diff -r 0ecfe8f6500e -r b06d70715a79 jdk/test/java/net/httpclient/Server.java --- a/jdk/test/java/net/httpclient/Server.java Mon May 09 17:46:28 2016 +0900 +++ b/jdk/test/java/net/httpclient/Server.java Mon May 09 10:28:24 2016 +0100 @@ -21,8 +21,6 @@ * questions. */ -//package javaapplication16; - import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; @@ -32,6 +30,7 @@ import java.util.Collections; import java.util.LinkedList; import java.util.List; +import java.util.Iterator; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; @@ -44,13 +43,16 @@ public class Server extends Thread { ServerSocket ss; - List sockets; + private final List sockets; + private final List removals; + private final List additions; AtomicInteger counter = new AtomicInteger(0); // waits up to 20 seconds for something to happen // dont use this unless certain activity coming. public Connection activity() { for (int i = 0; i < 80 * 100; i++) { + doRemovalsAndAdditions(); for (Connection c : sockets) { if (c.poll()) { return c; @@ -59,11 +61,26 @@ try { Thread.sleep(250); } catch (InterruptedException e) { + e.printStackTrace(); } } return null; } + private void doRemovalsAndAdditions() { + if (removals.isEmpty() && additions.isEmpty()) + return; + Iterator i = removals.iterator(); + while (i.hasNext()) + sockets.remove(i.next()); + removals.clear(); + + i = additions.iterator(); + while (i.hasNext()) + sockets.add(i.next()); + additions.clear(); + } + // clears all current connections on Server. public void reset() { for (Connection c : sockets) { @@ -84,7 +101,6 @@ incoming = new ArrayBlockingQueue<>(100); setName("Server-Connection"); setDaemon(true); - start(); } final Socket socket; final int id; @@ -210,16 +226,17 @@ try { socket.close(); } catch (IOException e) {} - sockets.remove(this); + removals.add(this); } } Server(int port) throws IOException { ss = new ServerSocket(port); sockets = Collections.synchronizedList(new LinkedList<>()); + removals = Collections.synchronizedList(new LinkedList<>()); + additions = Collections.synchronizedList(new LinkedList<>()); setName("Test-Server"); setDaemon(true); - start(); } Server() throws IOException { @@ -238,6 +255,7 @@ try { ss.close(); } catch (IOException e) { + e.printStackTrace(); } for (Connection c : sockets) { c.close(); @@ -250,8 +268,10 @@ try { Socket s = ss.accept(); Connection c = new Connection(s); - sockets.add(c); + c.start(); + additions.add(c); } catch (IOException e) { + e.printStackTrace(); } } } diff -r 0ecfe8f6500e -r b06d70715a79 jdk/test/java/net/httpclient/SplitResponse.java --- a/jdk/test/java/net/httpclient/SplitResponse.java Mon May 09 17:46:28 2016 +0900 +++ b/jdk/test/java/net/httpclient/SplitResponse.java Mon May 09 10:28:24 2016 +0100 @@ -68,6 +68,7 @@ public static void main(String[] args) throws Exception { server = new Server(0); URI uri = new URI(server.getURL()); + server.start(); HttpRequest request; HttpResponse r;