> On 9 Nov 2016, at 12:38, Yasumasa Suenaga <yasue...@gmail.com> wrote: > > Hi Yuji, > >> http://cr.openjdk.java.net/~ykubota/8169358/webrev.01/
I think Yuji’s patch is good as is. > I think you can use finally statement to close the connection in this case. I don’t believe that this is possible. The handling of the connection may be done in a separate thread, some time after execute() returns. I think it best to just handle the specific case of REE, as it done in Yuji’s patch. > Your patch cannot close the connection when any other runtime exceptions are > occurred. > > However, it is concerned double close if custom handler which is implemented > by the user throws runtime exception after closing the connection. > IMHO, you need to check the implementation of HTTP connection and dispatcher. -Chris. > > Thanks, > > Yasumasa > > > On 2016/11/08 18:53, KUBOTA Yuji wrote: >> Hi Chris, >> >> Thank you for your review and updating this issues on JBS. >> >> I filed an issue: >> https://bugs.openjdk.java.net/browse/JDK-8169358 >> >> I don't assign to me because I'm not a committer. >> >> 2016-11-08 0:28 GMT+09:00 Chris Hegarty <chris.hegarty at oracle.com>: >>>> * patch >>>> diff --git >>>> a/src/jdk.httpserver/share/classes/sun/net/httpserver/ServerImpl.java >>>> b/src/jdk.httpserver/share/classes/sun/net/httpserver/ServerImpl.java >>>> --- a/src/jdk.httpserver/share/classes/sun/net/httpserver/ServerImpl.java >>>> +++ b/src/jdk.httpserver/share/classes/sun/net/httpserver/ServerImpl.java >>>> @@ -442,10 +442,13 @@ >>>> logger.log (Level.TRACE, "Dispatcher (4)", e1); >>>> closeConnection(conn); >>>> } catch (IOException e) { >>>> logger.log (Level.TRACE, "Dispatcher (5)", e); >>>> closeConnection(conn); >>>> + } catch (RejectedExecutionException e) { >>>> + logger.log (Level.TRACE, "Dispatcher (9)", e); >>>> + closeConnection(conn); >>>> } >>>> } >>>> } >>>> _ >>>> static boolean debug = ServerConfig.debugEnabled (); >>> >>> >>> This looks ok. I wonder if some of these exceptions could be refactored >>> into a catch clause with several exception types? >> >> Yes, I agree to keep simple. I updated my patch as below. >> http://cr.openjdk.java.net/~ykubota/8169358/webrev.01/ >> Could you review it again? >> >> Thank you, >> Yuji >>> >>> -Chris. >>> >>> >>> >>>> * steps to reproduce >>>> 1. java -Djava.util.logging.config.file=logging.properties >>>> SmallHttpServer >>>> 2. post tcp connections by curl or other ways >>>> e.g.: while true; do curl -XPOST --noproxy 127.0.0.1 >>>> http://127.0.0.1:8080/; done >>>> 3. wait RejectedExecutionException occurs as below and then >>>> SmallHttpServer stops by this issue. >>>> ---- >>>> Nov 05, 2016 12:01:48 PM sun.net.httpserver.ServerImpl$Dispatcher run >>>> FINER: Dispatcher (7) >>>> java.util.concurrent.RejectedExecutionException: Task >>>> sun.net.httpserver.ServerImpl$Exchange at 37b50d9e rejected from >>>> java.util.concurrent.ThreadPoolExecutor at 1b3178d4[Running, pool size = >>>> 1, active threads = 0, queued tasks = 0, completed tasks = 7168] >>>> at >>>> java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(java.base/ThreadPoolExecutor.java:2076) >>>> at >>>> java.util.concurrent.ThreadPoolExecutor.reject(java.base/ThreadPoolExecutor.java:842) >>>> at >>>> java.util.concurrent.ThreadPoolExecutor.execute(java.base/ThreadPoolExecutor.java:1388) >>>> at >>>> sun.net.httpserver.ServerImpl$Dispatcher.handle(jdk.httpserver/ServerImpl.java:440) >>>> at >>>> sun.net.httpserver.ServerImpl$Dispatcher.run(jdk.httpserver/ServerImpl.java:405) >>>> at java.lang.Thread.run(java.base/Thread.java:844) >>>> (SmallHttpServer is stopping by not closing socket) >>>> ---- >>>> >>>> *logging.properties >>>> handlers = java.util.logging.ConsoleHandler >>>> com.sun.net.httpserver.level = FINEST >>>> java.util.logging.ConsoleHandler.level = FINEST >>>> java.util.logging.ConsoleHandler.formatter = >>>> java.util.logging.SimpleFormatter >>>> >>>> * SmallHttpServer.java >>>> import com.sun.net.httpserver.HttpExchange; >>>> import com.sun.net.httpserver.HttpHandler; >>>> import com.sun.net.httpserver.HttpServer; >>>> >>>> import java.net.InetSocketAddress; >>>> import java.util.Scanner; >>>> import java.util.concurrent.LinkedBlockingQueue; >>>> import java.util.concurrent.ThreadPoolExecutor; >>>> import java.util.concurrent.TimeUnit; >>>> >>>> public class SmallHttpServer { >>>> >>>> public static void main(String[] args) throws Exception { >>>> int POOL_SIZE = 1; >>>> String HOST = args.length < 1 ? "127.0.0.1" : args[0]; >>>> int PORT = args.length < 2 ? 8080 : Integer.valueOf(args[1]); >>>> >>>> // Setup a minimum thread pool to rise >>>> RejectExecutionException in httpserver >>>> ThreadPoolExecutor miniHttpPoolExecutor >>>> = new ThreadPoolExecutor(POOL_SIZE, POOL_SIZE, 0L, >>>> TimeUnit.MICROSECONDS, >>>> new LinkedBlockingQueue<>(1), (Runnable r) -> { >>>> return new Thread(r); >>>> }); >>>> HttpServer httpServer = HttpServer.create(new >>>> InetSocketAddress(HOST, PORT), 0); >>>> httpServer.setExecutor(miniHttpPoolExecutor); >>>> >>>> HttpHandler res200handler = (HttpExchange exchange) -> { >>>> exchange.sendResponseHeaders(200, 0); >>>> exchange.close(); >>>> }; >>>> httpServer.createContext("/", res200handler); >>>> >>>> httpServer.start(); >>>> // Wait stdin to exit >>>> Scanner in = new Scanner(System.in); >>>> while (in.hasNext()) { >>>> System.out.println(in.nextLine()); >>>> } >>>> httpServer.stop(0); >>>> miniHttpPoolExecutor.shutdownNow(); >>>> } >>>> } >>>> >>>> >>>> Thanks, >>>> Yuji >>>> >>> >>