From 10821128cb8b272856d1df04fdf102f1dda1b3f2 Mon Sep 17 00:00:00 2001 From: "ukai@chromium.org" Date: Wed, 21 Apr 2010 06:50:53 +0000 Subject: Don't process the same address for websocket throttling. Host resolver might return address list that contains the same address twice or more. In this case, we should not process the address for websocket throttling multiple times. If we don't have duplicate check of address, it would put the job throttle by the job itself (deadlock). I think this is cause of failure in Linux perf (webkit.org) bot and websocket fail to connect localhost on ubuntu (crbug.com/36652) BUG=36652,41319,40995 TEST=none Review URL: http://codereview.chromium.org/1750001 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@45156 0039d316-1c4b-4281-b951-d872f2087c98 --- net/websockets/websocket_throttle_unittest.cc | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) (limited to 'net/websockets/websocket_throttle_unittest.cc') diff --git a/net/websockets/websocket_throttle_unittest.cc b/net/websockets/websocket_throttle_unittest.cc index 91d588f..6c0dfbb 100644 --- a/net/websockets/websocket_throttle_unittest.cc +++ b/net/websockets/websocket_throttle_unittest.cc @@ -279,4 +279,29 @@ TEST_F(WebSocketThrottleTest, Throttle) { MessageLoopForIO::current()->RunAllPending(); } +TEST_F(WebSocketThrottleTest, NoThrottleForDuplicateAddress) { + DummySocketStreamDelegate delegate; + + // For localhost: 127.0.0.1, 127.0.0.1 + struct addrinfo* addr = AddAddr(127, 0, 0, 1, NULL); + addr = AddAddr(127, 0, 0, 1, addr); + scoped_refptr w1 = new WebSocketJob(&delegate); + scoped_refptr s1 = + new SocketStream(GURL("ws://localhost/"), w1.get()); + w1->InitSocketStream(s1.get()); + WebSocketThrottleTest::MockSocketStreamConnect(s1, addr); + DeleteAddrInfo(addr); + + DLOG(INFO) << "socket1"; + TestCompletionCallback callback_s1; + // Trying to open connection to localhost will start without wait. + EXPECT_EQ(OK, w1->OnStartOpenConnection(s1, &callback_s1)); + + DLOG(INFO) << "socket1 close"; + w1->OnClose(s1.get()); + s1->DetachDelegate(); + DLOG(INFO) << "Done"; + MessageLoopForIO::current()->RunAllPending(); +} + } -- cgit v1.1