Gregory, this is a good question. Let me tell this long story.
Jimmy tried to run the test using J9 VM and the test passed. I beleive Alexey Petrenko considered that fact as a justification to move the bug to [drlvm] category. Alexey, is my understanding correct? Why the test passed on J9? Denis found out that the issue with test is actually server synchronization issue. It is not a surprise that our VMs implement threading differently. Then Denis proposed a fix which made a test less dependent from synchronization. On 11/22/06, Gregory Shimansky <[EMAIL PROTECTED]> wrote:
Denis Kishenko wrote: > Dear committers, please take a look on H-1879 Is there a reason why this bug has drlvm category, and has [drlvm] prefix? I see from the history of this bug that it was transferred back and forth. The attached patches change only classlib test... > 2006/11/22, Fedotov, Alexei A <[EMAIL PROTECTED]>: >> +1 >> >> >> >-----Original Message----- >> >From: Denis Kishenko [mailto:[EMAIL PROTECTED] >> >Sent: Wednesday, November 22, 2006 5:40 PM >> >To: [email protected] >> >Subject: Re: [classlib][net] issue H-1879 HttpURLConnectionTest >> > >> >Alexei, >> > >> >Synchronization of accept() looks like test improvement, so I will >> >attach new patch to fix H-1879 and we will try to find solution for >> >accept synchronization. >> > >> >2006/11/22, Fedotov, Alexei A <[EMAIL PROTECTED]>: >> >> Ok, I see. Makes sense for me. I cannot imagine anything better at >> this >> >> moment, and if this works, that's great. >> >> >> >> There is still a problem with accept() call which is not >> synchronized, >> >> but I don't see how we can fix this correctly. accept() call is >> >> synchronized using related ServerSocket object, but this doesn't help >> us >> >> - this blocking doesn't release an object lock. >> >> >> >> With best regards, >> >> Alexei Fedotov, >> >> Intel Java & XML Engineering >> >> >> >> >-----Original Message----- >> >> >From: Denis Kishenko [mailto:[EMAIL PROTECTED] >> >> >Sent: Tuesday, November 21, 2006 8:06 PM >> >> >To: [email protected] >> >> >Subject: Re: [classlib][net] issue H-1879 HttpURLConnectionTest >> >> > >> >> >I can suggest add flag to avoid situation described above (see >> attached >> >> >fix). >> >> > >> >> >2006/11/21, Denis Kishenko <[EMAIL PROTECTED]>: >> >> >> Alexei, >> >> >> >> >> >> Yep, syncronization is necessary but not such way. >> >> >> >> >> >> As you said, test try to control server/proxy starting using >> >> >> bound.wait(5000). It looks like on linux server/proxy thread >> started >> >> >> eallier then on winxp. >> >> >> >> >> >> In other words, what we are waiting for >> >> >> 1. start server thread >> >> >> 2. bound.wait >> >> >> 3. bound.notify >> >> >> 4. start proxy thread >> >> >> 5. bound.wait >> >> >> 6. bound.notify >> >> >> 7. connect >> >> >> but we have on linux >> >> >> 1. start server thread >> >> >> 2. bound.notify >> >> >> 3. bound.wait >> >> >> ---- wait 5 seconds ----- >> >> >> 4. start proxy thread >> >> >> 5. bound.notify >> >> >> 6. bound.wait >> >> >> ---- wait 5 seconds ----- >> >> >> 7. connect >> >> >> >> >> >> So we try to connect when proxy closed. >> >> >> >> >> >> 2006/11/21, Alexei Fedotov <[EMAIL PROTECTED]>: >> >> >> > Denis, >> >> >> > Thank you for your fix! >> >> >> > >> >> >> > Here are few comments. I don't think we need to remove >> >> >> > synchronization. Contrary, I believe we need to fix it somehow. >> >> >> > >> >> >> > For example, when wait(5000) expires without notification, this >> >> means >> >> >> > that the test fail, and we better should report it right at the >> >> same >> >> >> > place. >> >> >> > >> >> >> > Digging further we can see that actual accept() calls are not >> >> >> > synchronized at all. There should be someting like conditional >> >> >> > variable to synchronize such events. I will write back when I >> get >> >> an >> >> >> > idea how to do it properly. >> >> >> > >> >> >> > A second option is to increase reading timeout set by >> setSoTimeout >> >> - >> >> >> > probably servers do not start fast enough. >> >> >> > >> >> >> > Thanks again, Alexei >> >> >> > >> >> >> > >> >> >> > On 11/21/06, Denis Kishenko <[EMAIL PROTECTED]> wrote: >> >> >> > > Alexei, >> >> >> > > >> >> >> > > I attached fix to issue, could you try it, please? >> >> >> > > >> >> >> > > 2006/11/21, Alexei Fedotov <[EMAIL PROTECTED]>: >> >> >> > > > Denis wrote, >> >> >> > > > > Yep, Harmony+DRLVM on SuSE >> >> >> > > > >> >> >> > > > A peculiar thing about this test is that it passes on SuSE >> 10, >> >> but >> >> >> > > > fails on SuSE 9 which is used for our regression test runs. >> >> >> > > > >> >> >> > > > -- >> >> >> > > > Thank you, >> >> >> > > > Alexei >> >> >> > > > >> >> >> > > > On 11/21/06, Denis Kishenko <[EMAIL PROTECTED]> wrote: >> >> >> > > > > 2006/11/21, Jimmy, Jing Lv <[EMAIL PROTECTED]>: >> >> >> > > > > > Denis Kishenko wrote: >> >> >> > > > > > > Hi all >> >> >> > > > > > > >> >> >> > > > > > > I'm investigating H-1879 and need some help or >> >> >recommendations from net >> >> >> > > > > > > guru. >> >> >> > > > > > > I have extracted failed test from >> >> >> > > > > > > >> >> >> >org.apache.harmony.tests.internal.net.www.protocol.http.HttpURLConnecti >> >> onTe >> >> >st, >> >> >> > > > > > > >> >> >> > > > > > > please see below. It failed with connection refused >> >> >exception. >> >> >> > > > > > > >> >> >> > > > > > > Java code works well, it looks like some problem with >> >> native >> >> >code. By >> >> >> > > > > > > the way telnet can't connect to created server too. >> >> >> > > > > > > >> >> >> > > > > > > If somebody can help with this issue it would be >> great. >> >> >> > > > > > > >> >> >> > > > > > > Thanks. >> >> >> > > > > > > >> >> >> > > > > > > =========== Test ============== >> >> >> > > > > > > >> >> >> > > > > > > package >> >> >org.apache.harmony.tests.internal.net.www.protocol.http; >> >> >> > > > > > > >> >> >> > > > > > > import java.io.IOException; >> >> >> > > > > > > import java.net.HttpURLConnection; >> >> >> > > > > > > import java.net.InetSocketAddress; >> >> >> > > > > > > import java.net.Proxy; >> >> >> > > > > > > import java.net.ServerSocket; >> >> >> > > > > > > import java.net.Socket; >> >> >> > > > > > > import java.net.SocketTimeoutException; >> >> >> > > > > > > import java.net.URL; >> >> >> > > > > > > >> >> >> > > > > > > import junit.framework.TestCase; >> >> >> > > > > > > >> >> >> > > > > > > public class SimpleTest extends TestCase { >> >> >> > > > > > > >> >> >> > > > > > > private final static Object bound = new Object(); >> >> >> > > > > > > >> >> >> > > > > > > static class MockServer extends Thread { >> >> >> > > > > > > ServerSocket serverSocket; >> >> >> > > > > > > boolean accepted = false; >> >> >> > > > > > > >> >> >> > > > > > > public MockServer(String name) throws >> IOException >> >> { >> >> >> > > > > > > super(name); >> >> >> > > > > > > >> >> >> > > > > > > serverSocket = new ServerSocket(0); >> >> >> > > > > > > serverSocket.setSoTimeout(1000); >> >> >> > > > > > > } >> >> >> > > > > > > >> >> >> > > > > > > public int port() { >> >> >> > > > > > > return serverSocket.getLocalPort(); >> >> >> > > > > > > } >> >> >> > > > > > > >> >> >> > > > > > > public void run() { >> >> >> > > > > > > try { >> >> >> > > > > > > synchronized (bound) { >> >> >> > > > > > > bound.notify(); >> >> >> > > > > > > } >> >> >> > > > > > > try { >> >> >> > > > > > > serverSocket.accept().close(); >> >> >> > > > > > > accepted = true; >> >> >> > > > > > > } catch (SocketTimeoutException ignore) >> { >> >> >> > > > > > > } >> >> >> > > > > > > serverSocket.close(); >> >> >> > > > > > > } catch (IOException e) { >> >> >> > > > > > > throw new RuntimeException(e); >> >> >> > > > > > > } >> >> >> > > > > > > } >> >> >> > > > > > > } >> >> >> > > > > > > >> >> >> > > > > > > public void testUsingProxy() throws Exception { >> >> >> > > > > > > MockServer server = new MockServer("server"); >> >> >> > > > > > > MockServer proxy = new MockServer("proxy"); >> >> >> > > > > > > >> >> >> > > > > > > URL url = new URL("http://localhost:" + >> >> >server.port()); >> >> >> > > > > > > >> >> >> > > > > > > HttpURLConnection connection = >> (HttpURLConnection) >> >> url >> >> >> > > > > > > .openConnection(new >> Proxy(Proxy.Type.HTTP, >> >> >> > > > > > > new >> InetSocketAddress("localhost", >> >> >> > > > > > > proxy.port()))); >> >> >> > > > > > > >> >> >> > > > > > > // HttpURLConnection connection = >> >> >> > > > > > > (HttpURLConnection)url.openConnection(); >> >> >> > > > > > > >> >> >> > > > > > > connection.setConnectTimeout(2000); >> >> >> > > > > > > connection.setReadTimeout(2000); >> >> >> > > > > > > >> >> >> > > > > > > server.start(); >> >> >> > > > > > > synchronized(bound) { >> >> >> > > > > > > bound.wait(5000); >> >> >> > > > > > > } >> >> >> > > > > > > proxy.start(); >> >> >> > > > > > > synchronized(bound) { >> >> >> > > > > > > bound.wait(5000); >> >> >> > > > > > > } >> >> >> > > > > > > >> >> >> > > > > > > connection.connect(); >> >> >> > > > > > > >> >> >> > > > > > > server.join(); >> >> >> > > > > > > proxy.join(); >> >> >> > > > > > > } >> >> >> > > > > > > >> >> >> > > > > > > } >> >> >> > > > > > > >> >> >> > > > > > > ========= Harmony+drlvm output ============ >> >> >> > > > > > > There was 1 error: >> >> >> > > > > > > 1) >> >> >> > > > > > > >> >> >> >testUsingProxy(org.apache.harmony.tests.internal.net.www.protocol.http. >> >> Simp >> >> >leTest)java.net.ConnectException: >> >> >> > > > > > > >> >> >> > > > > > > localhost/127.0.0.1:57896 - Connection refused >> >> >> > > > > > > at >> >> >> > > > > > > >> >> >> >org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.jav >> >> a:22 >> >> >4) >> >> >> > > > > > > >> >> >> > > > > > > at >> >> >> > > > > > > >> >> >> >org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.jav >> >> a:49 >> >> >6) >> >> >> > > > > > > >> >> >> > > > > > > at java.net.Socket.connect(Socket.java:980) >> >> >> > > > > > > at >> >> >> > > > > > > >> >> >> >org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectio >> >> n.ge >> >> >tHTTPConnection(HttpURLConnection.java:627) >> >> >> > > > > > > >> >> >> > > > > > > at >> >> >> > > > > > > >> >> >> >org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectio >> >> n.co >> >> >nnect(HttpURLConnection.java:608) >> >> >> > > > > > > >> >> >> > > > > > > at >> >> >> > > > > > > >> >> >> >org.apache.harmony.tests.internal.net.www.protocol.http.SimpleTest.test >> >> Usin >> >> >gProxy(SimpleTest.java:78) >> >> >> > > > > > > >> >> >> > > > > > > at >> >> java.lang.reflect.VMReflection.invokeMethod(Native >> >> >Method) >> >> >> > > > > > > >> >> >> > > > > > > FAILURES!!! >> >> >> > > > > > > Tests run: 1, Failures: 0, Errors: 1 >> >> >> > > > > > > >> >> >> > > > > > >> >> >> > > > > > The test passes on Harmony+IBMVME on WindowsXP on my >> >> desktop, >> >> >so you >> >> >> > > > > > mean Harmony+DRLVM here? >> >> >> > > > > Yep, Harmony+DRLVM on SuSE >> >> >> > > > > >> >> >> > > > > > >> >> >> > > > > > But IMHO the VM does not matter in network issues, the >> >> native >> >> >code call >> >> >> > > > > > directly to the system APIs(of course, through >> Port-Lib), >> >> so I >> >> >wonder if >> >> >> > > > > > there's something wrong in thread(handle by VM)? Just a >> >> >thought. >> >> >> > > > > > >> >> >> > > > > > And IMO, that telnet shall not connect to the server is >> due >> >> to >> >> >> > > > > > "serverSocket.setSoTimeout(1000);", which make >> >> >"serverSocket.accept()" >> >> >> > > > > > wait for only one second. >> >> >> > > > > Of course I had changed timeout to 10sec when used telnet >> :) >> >> >> > > > > >> >> >> > > > > > >> >> >> > > > > > I have to download Harmony+DRLVM to debug into, but the >> >> speed >> >> >of network >> >> >> > > > > > is poor here :) >> >> >> > > > > > >> >> >> > > > > > >> >> >> > > > > > -- >> >> >> > > > > > >> >> >> > > > > > Best Regards! >> >> >> > > > > > >> >> >> > > > > > Jimmy, Jing Lv >> >> >> > > > > > China Software Development Lab, IBM >> >> >> > > > > > >> >> >> > > > > >> >> >> > > > > >> >> >> > > > > -- >> >> >> > > > > Denis M. Kishenko >> >> >> > > > > Intel Middleware Products Division >> >> >> > > > > >> >> >> > > > >> >> >> > > >> >> >> > > >> >> >> > > -- >> >> >> > > Denis M. Kishenko >> >> >> > > Intel Middleware Products Division >> >> >> > > >> >> >> > >> >> >> > >> >> >> > -- >> >> >> > Thank you, >> >> >> > Alexei >> >> >> > >> >> >> >> >> >> >> >> >> -- >> >> >> Denis M. Kishenko >> >> >> Intel Middleware Products Division >> >> >> >> >> > >> >> > >> >> >-- >> >> >Denis M. Kishenko >> >> >Intel Middleware Products Division >> >> >> > >> > >> >-- >> >Denis M. Kishenko >> >Intel Middleware Products Division >> > > -- Gregory
-- Thank you, Alexei
