Maybe it would be better considering Windows CE systems too:
- if os.name == 'nt'
+ if os.name in ('nt', 'ce')
Moreover if the method is called "try_reuse_address" I'd expect that
"self._sock.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)" would be placed
inside a try/except block.
On 29 Apr, 15:58, Trent Nelson <[EMAIL PROTECTED]> wrote:
> Since the recent changes to networking-oriented tests (issue 2550, r62234 and
> r62237), I think it's safe to say stability of the test suite on all the
> non-Windows platforms has improved significantly in this area (I don't recall
> seeing any socket errors in *nix buildbot logs since those commits).
>
> However, Windows buildbots are still periodically failing. More
> specifically, my Windows buildbots are still failing. One thing that's
> different about my buildbots is that two are being run at the same time for
> both trunk and py3k -- one doing an x86 build, the other doing x64 build.
>
> Since the changes in the aforementioned revisions, the behaviour of my
> buildbots has definitely improved -- they no longer completely wedge on
> test_async(chat|core), mainly due to abolishing all use of SO_REUSEADDR as a
> socket option in any network-oriented tests.
>
> However, periodically, they're still dying/failing in a variety of ways --
> see relevant log snippets at the end of this e-mail for examples. I
> attribute this to the fact that SO_REUSEADDR is still set as a socket option
> in asyncore.py and SocketServer.py. Basically, SO_REUSEADDR should *never*
> be set on Windows for TCP/IP sockets. Using asyncore.py as an example, here
> are two ways we could handle this:
>
> 1. Hard code the Windows opt-out:
> --- asyncore.py (revision 62509)
> +++ asyncore.py (working copy)
> @@ -267,6 +267,8 @@
>
> def set_reuse_addr(self):
> # try to re-use a server port if possible
> + if os.name == 'nt' and self.socket.socket_type != socket.SOCK_DGRAM:
> + return
> try:
> self.socket.setsockopt(
> socket.SOL_SOCKET, socket.SO_REUSEADDR,
>
> 2. Introduce socket.try_reuse_address():
> --- asyncore.py (revision 62509)
> +++ asyncore.py (working copy)
> @@ -266,15 +266,7 @@
> self.add_channel(map)
>
> def set_reuse_addr(self):
> - # try to re-use a server port if possible
> - try:
> - self.socket.setsockopt(
> - socket.SOL_SOCKET, socket.SO_REUSEADDR,
> - self.socket.getsockopt(socket.SOL_SOCKET,
> - socket.SO_REUSEADDR) | 1
> - )
> - except socket.error:
> - pass
> + self.socket.try_reuse_address()
>
> With try_use_address implemented as follows:
>
> --- socket.py (revision 62509)
> +++ socket.py (working copy)
> @@ -197,6 +197,10 @@
> Return a new socket object connected to the same system resource."""
> return _socketobject(_sock=self._sock)
>
> + def try_reuse_address(self):
> + if not (os.name == 'nt' and self._sock.type != SOCK_DGRAM):
> + self._sock.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
> +
> def makefile(self, mode='r', bufsize=-1):
> """makefile([mode[, bufsize]]) -> file object
>
> I prefer the latter as it's cleaner, easier to document and encapsulates what
> we're trying to do relatively well. The affected modules would be
> asyncore.py, SocketServer.py and idlelib/rpc.py. Thoughts?
>
> Regards,
>
> Trent.
>
> <eg1>
> test_ftplib
>
> remoteFailed: [Failure instance: Traceback (failure with no frames):
> twisted.internet.error.ConnectionLost: Connection to the other side was lost
> in a non-clean fashion.
> ]
> </eg1>
>
> <eg2>
> test_asynchat
> test test_asynchat failed -- errors occurred; run in verbose mode for details
> [snip to bottom of log where test_asynchat is re-run]
> 1 test failed:
> test_asynchat
> 33 tests skipped:
> test__locale test_aepack test_applesingle test_cProfile
> test_commands test_crypt test_curses test_dbm test_epoll
> test_fcntl test_fork1 test_gdbm test_grp test_ioctl test_kqueue
> test_macostools test_mhlib test_nis test_openpty test_ossaudiodev
> test_pipes test_poll test_posix test_pty test_pwd test_resource
> test_scriptpackages test_signal test_syslog test_threadsignals
> test_wait3 test_wait4 test_zipfile64
> Those skips are all expected on win32.
> Re-running failed tests in verbose mode
> Re-running test 'test_asynchat' in verbose mode
> test_close_when_done (test.test_asynchat.TestAsynchat) ... ok
> test_empty_line (test.test_asynchat.TestAsynchat) ... ok
> test_line_terminator1 (test.test_asynchat.TestAsynchat) ... ok
> test_line_terminator2 (test.test_asynchat.TestAsynchat) ... ok
> test_line_terminator3 (test.test_asynchat.TestAsynchat) ... ok
> test_none_terminator (test.test_asynchat.TestAsynchat) ... ok
> test_numeric_terminator1 (test.test_asynchat.TestAsynchat) ... ok
> test_numeric_terminator2 (test.test_asynchat.TestAsynchat) ... ok
> test_simple_producer (test.test_asynchat.TestAsynchat) ... ok
> test_string_producer (test.test_asynchat.TestAsynchat) ... ok
> test_close_when_done (test.test_asynchat.TestAsynchat_WithPoll) ... ok
> test_empty_line (test.test_asynchat.TestAsynchat_WithPoll) ... ok
> test_line_terminator1 (test.test_asynchat.TestAsynchat_WithPoll) ... ok
> test_line_terminator2 (test.test_asynchat.TestAsynchat_WithPoll) ... ok
> test_line_terminator3 (test.test_asynchat.TestAsynchat_WithPoll) ... ok
> test_none_terminator (test.test_asynchat.TestAsynchat_WithPoll) ... ok
> test_numeric_terminator1 (test.test_asynchat.TestAsynchat_WithPoll) ... ok
> test_numeric_terminator2 (test.test_asynchat.TestAsynchat_WithPoll) ... ok
> test_simple_producer (test.test_asynchat.TestAsynchat_WithPoll) ... ok
> test_string_producer (test.test_asynchat.TestAsynchat_WithPoll) ... ok
> test_find_prefix_at_end (test.test_asynchat.TestHelperFunctions) ... ok
> test_basic (test.test_asynchat.TestFifo) ... ok
> test_given_list (test.test_asynchat.TestFifo) ... ok
>
> ----------------------------------------------------------------------
> Ran 23 tests in 11.812s
>
> OK
> </eg2>
> (Note that re-running the test here didn't result in the test failing again.)
>
> <eg3>
> 1 test failed:
> test_smtplib
>
> Traceback (most recent call last):
> File "S:\buildbots\python\3.0.nelson-windows\build\lib\threading.py", line
> 493, in _bootstrap_inner
> self.run()
> File "S:\buildbots\python\3.0.nelson-windows\build\lib\threading.py", line
> 449, in run
> self._target(*self._args, **self._kwargs)
> File
> "S:\buildbots\python\3.0.nelson-windows\build\lib\test\test_smtplib.py", line
> 106, in debugging_server
> poll_fun(0.01, asyncore.socket_map)
> File "S:\buildbots\python\3.0.nelson-windows\build\lib\asyncore.py", line
> 132, in poll
> read(obj)
> File "S:\buildbots\python\3.0.nelson-windows\build\lib\asyncore.py", line
> 72, in read
> obj.handle_error()
> File "S:\buildbots\python\3.0.nelson-windows\build\lib\asyncore.py", line
> 68, in read
> obj.handle_read_event()
> File "S:\buildbots\python\3.0.nelson-windows\build\lib\asyncore.py", line
> 390, in handle_read_event
> self.handle_read()
> File "S:\buildbots\python\3.0.nelson-windows\build\lib\test\test_ssl.py",
> line 524, in handle_read
> data = self.recv(1024)
> File "S:\buildbots\python\3.0.nelson-windows\build\lib\asyncore.py", line
> 342, in recv
> data = self.socket.recv(buffer_size)
> File "S:\buildbots\python\3.0.nelson-windows\build\lib\ssl.py", line 247,
> in recv
> return self.read(buflen)
> File "S:\buildbots\python\3.0.nelson-windows\build\lib\ssl.py", line 162,
> in read
> v = self._sslobj.read(len or 1024)
> socket.error: [Errno 10053] An established connection was aborted by the
> software in your host machine
> </eg3>
>
> _______________________________________________
> Python-Dev mailing list
> [EMAIL PROTECTED]://mail.python.org/mailman/listinfo/python-dev
> Unsubscribe:http://mail.python.org/mailman/options/python-dev/python-dev2-garchiv...
_______________________________________________
Python-Dev mailing list
[email protected]
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe:
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com