harmony-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Fedotov, Alexei A" <alexei.a.fedo...@intel.com>
Subject RE: [classlib][net] issue H-1879 HttpURLConnectionTest
Date Wed, 22 Nov 2006 14:12:20 GMT
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:dkishenko@gmail.com]
>Sent: Tuesday, November 21, 2006 8:06 PM
>To: dev@harmony.apache.org
>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 <dkishenko@gmail.com>:
>> 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 <alexei.fedotov@gmail.com>:
>> > 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 <dkishenko@gmail.com> wrote:
>> > > Alexei,
>> > >
>> > > I attached fix to issue, could you try it, please?
>> > >
>> > > 2006/11/21, Alexei Fedotov <alexei.fedotov@gmail.com>:
>> > > > 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 <dkishenko@gmail.com> wrote:
>> > > > > 2006/11/21, Jimmy, Jing Lv <firepure@gmail.com>:
>> > > > > > 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

Mime
View raw message