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
Python-Dev@python.org
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com

Reply via email to