Looks fine to me. Thanks, Xuelei
On 8/16/2016 1:31 AM, Artem Smotrakov wrote: > Hi Xuelei, > > Makes sense to me, I removed those 1 second delays > > http://cr.openjdk.java.net/~asmotrak/8162484/webrev.03/ > > Artem > > > On 08/12/2016 06:17 PM, Xuelei Fan wrote: >> It's a nice find of the port reuse issues. >> >> This update will turn into expected connection failure into >> reading/writing interruption as the server simulate the failure by >> closing the incoming connections. It's fine for this test, I think. >> >> For lines like: >> 288 intOcsp.rejectConnections(); >> 289 rootOcsp.rejectConnections(); >> 290 Thread.sleep(1000); >> >> I was wondering as the server does not need to bootup again, is the >> delay still needed? >> >> Otherwise, looks fine to me. >> >> Thanks, >> Xuelei >> >> On 8/13/2016 6:25 AM, Artem Smotrakov wrote: >>> Thank you for review Jamil. >>> >>> Xuelei, >>> >>> Could you please take a look? >>> >>> Artem >>> >>> >>> On 08/12/2016 02:38 PM, Jamil Nimeh wrote: >>>> Thank you Artem. The fix looks good. You just need a +1 from an >>>> official reviewer. >>>> >>>> >>>> >>>> --Jamil >>>> >>>> -------- Original message -------- >>>> From: Artem Smotrakov <artem.smotra...@oracle.com> >>>> Date: 8/12/16 1:07 PM (GMT-08:00) >>>> To: Jamil Nimeh <jamil.j.ni...@oracle.com>, Security Dev OpenJDK >>>> <security-dev@openjdk.java.net> >>>> Subject: Re: [9] RFR: 8162484: >>>> javax/net/ssl/Stapling/SSLSocketWithStapling.java test fails >>>> intermittently with "Address already in use" error >>>> >>>> No problem. >>>> >>>> http://cr.openjdk.java.net/~asmotrak/8162484/webrev.02/ >>>> >>>> Artem >>>> >>>> >>>> On 08/12/2016 12:02 PM, Jamil Nimeh wrote: >>>>> For the tests as we use them today we don't intend the server to >>>>> restart. The intent of SimpleOCSPServer was to be of use for a >>>>> variety of testing purposes. I don't know that we can say for all >>>>> intended uses that we'll *never* need to restart it. That's why I'd >>>>> like to keep the unbound socket/set sockopt/bind/listen behavior. I >>>>> don't think ServerSocket(0) achieves that. >>>>> >>>>> --Jamil >>>>> >>>>> On 8/12/2016 11:30 AM, Artem Smotrakov wrote: >>>>>> Hi Jamil, >>>>>> >>>>>> There was no any specific reason to remove ServerSocket.bind() call. >>>>>> ServerSocket(0) constructor creates a server socket, automatically >>>>>> bound to a random free port. If I am not missing something, it >>>>>> doesn't look necessary to set the SO_REUSEADDR socket options if the >>>>>> server is not going to restart. The code is just shorter if we use >>>>>> ServerSocket(0) constructor to open a server socket, but I can revert >>>>>> it to use bind() with 0 port number if you think it's better. >>>>>> >>>>>> Artem >>>>>> >>>>>> >>>>>> On 08/12/2016 09:13 AM, Jamil Nimeh wrote: >>>>>>> Hi Artem, more comments in-line >>>>>>> >>>>>>> >>>>>>> On 8/11/2016 11:46 AM, Artem Smotrakov wrote: >>>>>>>> Hi Jamil, >>>>>>>> >>>>>>>> Thank you for review. Please see inline. >>>>>>>> >>>>>>>> >>>>>>>> On 08/10/2016 04:16 PM, Jamil Nimeh wrote: >>>>>>>>> Hi Artem, >>>>>>>>> >>>>>>>>> I'm not an official reviewer but the solution for making the >>>>>>>>> servers reject connections rather than stop and start looks pretty >>>>>>>>> fair to me and seems like a nice way to simulate a downed OCSP >>>>>>>>> responder instead of having to bounce it. A couple >>>>>>>>> comments/questions: >>>>>>>>> >>>>>>>>> I'm a bit surprised that you get the "Address already in use" >>>>>>>>> error though. >>>>>>>> Well, to be honest, I was not able to reproduce this failure >>>>>>>> locally. I was running the test in a loop for a couple of days, and >>>>>>>> it didn't fail. But the test has been observed to fail in other >>>>>>>> test runs (jprt, CI, etc). >>>>>>>> >>>>>>>> I am not an expert in networking, and I would appreciate if someone >>>>>>>> more knowledgeable gives an advise how these intermittent failures >>>>>>>> can be avoided. >>>>>>>> >>>>>>>>> Isn't servSocket.setReuseAddress(true) on line 214 supposed to set >>>>>>>>> the SO_REUSEADDR at the system call level and prevent EADDRINUSE >>>>>>>>> when listening or binding? >>>>>>>> If I am not missing something, the test has been observed to fails >>>>>>>> while re-binding. I am wondering if it's possible that the port >>>>>>>> becomes busy after the server socket was closed, but before bind() >>>>>>>> is called again. The probability of this situation seems to be very >>>>>>>> low which has been actually seen - the test fails very rare. >>>>>>>> >>>>>>>> If this is the case, it seems like servSocket.setReuseAddress(true) >>>>>>>> doesn't help because the port is taken by another process (I am not >>>>>>>> sure that SO_REUSEADDR prevents from this). Again, this is only my >>>>>>>> guess, and I may be wrong. >>>>>>> You know, I hadn't thought of that. I've never been able to >>>>>>> reproduce that problem either, but I'm running on a local virtual >>>>>>> box VM on a laptop, and usually the tests are running sequentially. >>>>>>> I could definitely see the case where other processes are soaking up >>>>>>> the OCSP responder's port. With those tests, I kind of need the >>>>>>> port to remain the same since I'm putting that server and port in >>>>>>> the AIA extensions of the certs for which it answers. Given this >>>>>>> particular case, it seems like your solution of keeping the server >>>>>>> bound but just chopping connections off is the best way to go. >>>>>>>>> When you create the new ServerSocket on line 212, you're now >>>>>>>>> binding it to the port now where originally it started as an >>>>>>>>> unbound socket. By doing so, the behavior of setReuseAddress() on >>>>>>>>> line 214 is now undefined. >>>>>>>> This setReuseAddress() call looks unnecessary now. I'll update the >>>>>>>> test. >>>>>>>>> While this test no longer stops/starts the server, other tests may >>>>>>>>> wish to do so and their behavior may not be consistent (though >>>>>>>>> apparently it wasn't consistent even in the old scheme where the >>>>>>>>> socket was unbound, then setReuseAddress() was called...) >>>>>>>> Correct. I checked other code which depend on SimpleOCSPServer >>>>>>>> >>>>>>>> javax/net/ssl/Stapling/HttpsUrlConnClient.java >>>>>>>> javax/net/ssl/Stapling/SSLEngineWithStapling.java >>>>>>>> javax/net/ssl/Stapling/SSLSocketWithStapling.java >>>>>>>> javax/net/ssl/Stapling/StapleEnableProps.java >>>>>>>> >>>> sun/security/ssl/StatusStapling/java.base/sun/security/ssl/StatusReqSelection.java >>>> >>>> >>>>>>>> >>>> sun/security/ssl/StatusStapling/java.base/sun/security/ssl/StatusResponseManagerTests.java >>>> >>>> >>>>>>>> artem@artem-laptop:~/ws/jdk/jdk9_dev_stapling_test/jdk/test$ kate >>>>>>>> javax/net/ssl/Stapling/HttpsUrlConnClient.java >>>>>>>> javax/net/ssl/Stapling/SSLEngineWithStapling.java >>>>>>>> javax/net/ssl/Stapling/SSLSocketWithStapling.java >>>>>>>> javax/net/ssl/Stapling/StapleEnableProps.java >>>>>>>> >>>> sun/security/ssl/StatusStapling/java.base/sun/security/ssl/StatusReqSelection.java >>>> >>>> >>>> sun/security/ssl/StatusStapling/java.base/sun/security/ssl/StatusResponseManagerTests.java >>>> >>>> >>>>>>>> >>>>>>>> These tests call stop() only once when actual testcases are done. >>>>>>>> Actually, some of them don't even call stop(), but it seems to work >>>>>>>> fine. As an enhancement, I would add stop() calls to finally >>>>>>>> blocks, but it seems to work fine without it anyway. >>>>>>> I liked your solution with the stop() calls in finally blocks and I >>>>>>> agree that they should have them. I think we get away with it >>>>>>> because in most if not all of those cases they are running as >>>>>>> othervm tests (because we have properties that we set specific to >>>>>>> the tests). So when the JVM exits resources like sockets are closed >>>>>>> by the OS. Still, it's better to have the try/finally guards and >>>>>>> explicitly and gracefully shutdown the OCSP responders. >>>>>>>> Here is an updated webrev: >>>>>>>> >>>>>>>> http://cr.openjdk.java.net/~asmotrak/8162484/webrev.01/ >>>>>>> I realize that in many of these test cases we're going to move away >>>>>>> from a start/stop approach to your accept/reject one, but in general >>>>>>> sockets designed to be listening should start unbound, set the >>>>>>> SO_REUSEADDR sockopt, then bind and listen. Was there a specific >>>>>>> reason to change that code, or was it just to streamline it? Aside >>>>>>> from fewer lines of code, I'm not sure what it buys us. >>>>>>>> Artem >>>>>>>> >>>>>>>> >>>>>>>>> --Jamil >>>>>>>>> >>>>>>>>> >>>>>>>>> On 08/10/2016 03:44 PM, Artem Smotrakov wrote: >>>>>>>>>> Hello, >>>>>>>>>> >>>>>>>>>> Please review this update for OCSP stapling tests. >>>>>>>>>> >>>>>>>>>> The tests use >>>>>>>>>> test/java/security/testlibrary/SimpleOCSPServer.java which try to >>>>>>>>>> re-use a server port if the server restarted. Looks like >>>>>>>>>> sometimes it may cause "Address already in use" error. >>>>>>>>>> >>>>>>>>>> The patch updates OCSP stapling tests with the following: >>>>>>>>>> - updated SSLSocketWithStapling.java test not to restart OCSP >>>>>>>>>> responders >>>>>>>>>> - updated SimpleOCSPServer to be able to reject incoming >>>> connections >>>>>>>>>> - updated SimpleOCSPServer to be able to reproduce a delay >>>>>>>>>> without restarting >>>>>>>>>> >>>>>>>>>> Jamil, >>>>>>>>>> >>>>>>>>>> Could you please take a look at this update, and confirm if this >>>>>>>>>> update doesn't break the original test scenarios? >>>>>>>>>> >>>>>>>>>> Bug: https://bugs.openjdk.java.net/browse/JDK-8162484 >>>>>>>>>> Webrev: http://cr.openjdk.java.net/~asmotrak/8162484/webrev.00/ >>>>>>>>>> >>>>>>>>>> Artem >