Hello community, here is the log from the commit of package python-eventlet for openSUSE:Factory checked in at 2020-12-12 20:29:53 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-eventlet (Old) and /work/SRC/openSUSE:Factory/.python-eventlet.new.2328 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-eventlet" Sat Dec 12 20:29:53 2020 rev:36 rq:854888 version:0.29.1 Changes: -------- --- /work/SRC/openSUSE:Factory/python-eventlet/python-eventlet.changes 2020-08-25 12:38:29.925411431 +0200 +++ /work/SRC/openSUSE:Factory/.python-eventlet.new.2328/python-eventlet.changes 2020-12-12 20:32:16.005845931 +0100 @@ -1,0 +2,32 @@ +Thu Dec 10 22:43:44 UTC 2020 - Benjamin Greiner <c...@bnavigator.de> + +- Add pr_672-remove-OpenSSL-tsafe.patch to support pyopenssl 20 +- skip some tests which are flaky inside OBS environment +- fix python2 build requirement for Leap + +------------------------------------------------------------------- +Mon Dec 7 00:14:23 UTC 2020 - Benjamin Greiner <c...@bnavigator.de> + +- Update to 0.29.1 + * patcher: [py27] recursion error in pytest/python2.7 installing + register_at_fork + * patcher: monkey_patch(builtins=True) failed on py3 because + `file` class is gone + * don't crash on PyPy 7.0.0 + * Only install monotonic on python2 +- Changes for 0.29.0 + * ssl: context wrapped listener fails accept() +- Changes for 0.28.1 + * Clean up TypeError in __del__ +- Changes for 0.28.0 + * Always remove the right listener from the hub + gh#enventlet/eventlet#645 +- Changes for 0.27.0 + * patcher: Clean up threading book-keeping at fork when + monkey-patched + * backdoor: handle disconnects better +- Fix test skips for non-default python 3.6 flavor + gh#openSUSE/python-rpm-macros#66 +- refresh newdnspython.patch + +------------------------------------------------------------------- Old: ---- eventlet-0.26.1.tar.gz New: ---- eventlet-0.29.1.tar.gz pr_672-remove-OpenSSL-tsafe.patch ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-eventlet.spec ++++++ --- /var/tmp/diff_new_pack.Vh9rHN/_old 2020-12-12 20:32:16.781846741 +0100 +++ /var/tmp/diff_new_pack.Vh9rHN/_new 2020-12-12 20:32:16.785846745 +0100 @@ -18,7 +18,7 @@ %{?!python_module:%define python_module() python-%{**} python3-%{**}} Name: python-eventlet -Version: 0.26.1 +Version: 0.29.1 Release: 0 Summary: Concurrent networking library for Python License: MIT @@ -35,15 +35,19 @@ Patch2: pr_639.patch # Really remove the dependency on nose Patch3: remove_nose_part_2.patch +# PATCH-FIX-UPSTREAM -- gh#eventlet/eventlet#672 remove OpenSSL.tsafe +Patch4: pr_672-remove-OpenSSL-tsafe.patch BuildRequires: %{python_module dnspython >= 1.15.0} BuildRequires: %{python_module greenlet >= 0.3} -BuildRequires: %{python_module monotonic >= 1.4} BuildRequires: %{python_module pyOpenSSL} BuildRequires: %{python_module pytest} BuildRequires: %{python_module pyzmq} BuildRequires: %{python_module setuptools} BuildRequires: %{python_module six >= 1.10.0} BuildRequires: %{python_module testsuite} +%if 0%{?suse_version} < 1550 +BuildRequires: python2-monotonic >= 1.4 +%endif BuildRequires: fdupes BuildRequires: netcfg BuildRequires: python-rpm-macros @@ -53,7 +57,9 @@ Requires: netcfg Requires: python-dnspython >= 1.15.0 Requires: python-greenlet >= 0.3 +%ifpython2 Requires: python-monotonic >= 1.4 +%endif Requires: python-six >= 1.10.0 BuildArch: noarch %python_subpackages @@ -85,25 +91,29 @@ %check # python2 is required to build for Leap, but tests fail (even upstream) -python2_skipall='--collect-only' +python2_pytest_param='--collect-only' # dnspython 1 and 2: backdoor tests fail with "take too long" skiptests="(BackdoorTest and test_server)" # fail only with dnspython 2: skiptests+=" or test_dns_methods_are_green or test_noraise_dns_tcp" +# These are flaky inside the OBS environment +skiptests+=" or test_fork_after_monkey_patch or test_send_1k_req_rep or test_cpu_usage_after_bind" -# Unknown openSUSE 15.x specific errors +# Unknown Python 3.6 specific errors # TypeError: _wrap_socket() argument 1 must be _socket.socket, not SSLSocket # https://github.com/rthalley/dnspython/issues/559#issuecomment-675274960 +python36_skiptests+=" or test_connect_ssl or test_ssl_sending_messages or test_wrap_ssl" +python36_skiptests+=" or ssl_test or wsgi_test" %if %python3_version_nodots == 36 - skiptests+=" or test_connect_ssl or test_ssl_sending_messages or test_wrap_ssl" - skiptests+=" or ssl_test or wsgi_test" +python3_skiptests+="$python36_skiptests" %endif # no subdir recursion https://github.com/eventlet/eventlet/issues/638#issuecomment-676085599 -%pytest -o norecursedirs="tests/*" -k "not ($skiptests)" ${$python_skipall} +%pytest -o norecursedirs="tests/*" -k "not ($skiptests ${$python_skiptests})" ${$python_pytest_param} %files %{python_files} %license LICENSE %doc AUTHORS NEWS README.rst -%{python_sitelib}/* +%{python_sitelib}/eventlet +%{python_sitelib}/eventlet-%{version}*-info %changelog ++++++ eventlet-0.26.1.tar.gz -> eventlet-0.29.1.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/eventlet-0.26.1/NEWS new/eventlet-0.29.1/NEWS --- old/eventlet-0.26.1/NEWS 2020-07-30 23:48:00.000000000 +0200 +++ new/eventlet-0.29.1/NEWS 2020-10-22 09:16:46.000000000 +0200 @@ -1,3 +1,29 @@ +0.29.1 +====== +patcher: [py27] recursion error in pytest/python2.7 installing register_at_fork https://github.com/eventlet/eventlet/issues/660 +patcher: monkey_patch(builtins=True) failed on py3 because `file` class is gone https://github.com/eventlet/eventlet/issues/541 +don't crash on PyPy 7.0.0 https://github.com/eventlet/eventlet/pull/547 +Only install monotonic on python2 https://github.com/eventlet/eventlet/pull/583 + +0.29.0 +====== +* ssl: context wrapped listener fails accept() https://github.com/eventlet/eventlet/issues/651 + +0.28.1 +====== +* Sorry, Eventlet was broken on Windows for versions 0.27-0.28 + patcher: no os.register_at_fork on Windows (#654) +* Clean up TypeError in __del__ + +0.28.0 +====== +* Always remove the right listener from the hub https://github.com/eventlet/eventlet/pull/645 + +0.27.0 +====== +* patcher: Clean up threading book-keeping at fork when monkey-patched +* backdoor: handle disconnects better + 0.26.1 ====== * pin dnspython <2.0.0 https://github.com/eventlet/eventlet/issues/619 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/eventlet-0.26.1/PKG-INFO new/eventlet-0.29.1/PKG-INFO --- old/eventlet-0.26.1/PKG-INFO 2020-07-30 23:48:27.000000000 +0200 +++ new/eventlet-0.29.1/PKG-INFO 2020-10-22 09:17:28.000000000 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 1.1 Name: eventlet -Version: 0.26.1 +Version: 0.29.1 Summary: Highly concurrent networking library Home-page: http://eventlet.net Author: Linden Lab diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/eventlet-0.26.1/eventlet/__init__.py new/eventlet-0.29.1/eventlet/__init__.py --- old/eventlet-0.26.1/eventlet/__init__.py 2020-07-30 23:46:33.000000000 +0200 +++ new/eventlet-0.29.1/eventlet/__init__.py 2020-10-22 09:14:16.000000000 +0200 @@ -1,7 +1,7 @@ import os -version_info = (0, 26, 1) +version_info = (0, 29, 1) __version__ = '.'.join(map(str, version_info)) # This is to make Debian packaging easier, it ignores import # errors of greenlet so that the packager can still at least @@ -21,8 +21,11 @@ # Helpful when CPython < 3.5 on Linux blocked in `os.waitpid(-1)` before first use of hub. # Example: gunicorn # https://github.com/eventlet/eventlet/issues/401#issuecomment-327500352 - import monotonic - del monotonic + try: + import monotonic + del monotonic + except ImportError: + pass connect = convenience.connect listen = convenience.listen diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/eventlet-0.26.1/eventlet/backdoor.py new/eventlet-0.29.1/eventlet/backdoor.py --- old/eventlet-0.26.1/eventlet/backdoor.py 2020-07-30 18:25:18.000000000 +0200 +++ new/eventlet-0.29.1/eventlet/backdoor.py 2020-10-22 04:46:21.000000000 +0200 @@ -32,8 +32,12 @@ pass def write(self, data, *a, **kw): - self.f.write(data, *a, **kw) - self.f.flush() + try: + self.f.write(data, *a, **kw) + self.f.flush() + except socket.error as e: + if get_errno(e) != errno.EPIPE: + raise def readline(self, *a): return self.f.readline(*a).replace('\r\n', '\n') @@ -99,14 +103,18 @@ print("backdoor server listening on %s" % (listening_on,)) try: - try: - while True: + while True: + socketpair = None + try: socketpair = sock.accept() backdoor(socketpair, locals) - except socket.error as e: - # Broken pipe means it was shutdown - if get_errno(e) != errno.EPIPE: - raise + except socket.error as e: + # Broken pipe means it was shutdown + if get_errno(e) != errno.EPIPE: + raise + finally: + if socketpair: + socketpair[0].close() finally: sock.close() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/eventlet-0.26.1/eventlet/green/builtin.py new/eventlet-0.29.1/eventlet/green/builtin.py --- old/eventlet-0.26.1/eventlet/green/builtin.py 2020-07-30 18:25:18.000000000 +0200 +++ new/eventlet-0.29.1/eventlet/green/builtin.py 2020-10-22 08:30:23.000000000 +0200 @@ -13,22 +13,26 @@ from eventlet.hubs import hub from eventlet.patcher import slurp_properties import sys +import six __all__ = dir(builtins_orig) -__patched__ = ['file', 'open'] +__patched__ = ['open'] +if six.PY2: + __patched__ += ['file'] slurp_properties(builtins_orig, globals(), ignore=__patched__, srckeys=dir(builtins_orig)) hubs.get_hub() -__original_file = file +if six.PY2: + __original_file = file + class file(__original_file): + def __init__(self, *args, **kwargs): + super(file, self).__init__(*args, **kwargs) + hubs.notify_opened(self.fileno()) -class file(__original_file): - def __init__(self, *args, **kwargs): - super(file, self).__init__(*args, **kwargs) - hubs.notify_opened(self.fileno()) __original_open = open __opening = False diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/eventlet-0.26.1/eventlet/green/ssl.py new/eventlet-0.29.1/eventlet/green/ssl.py --- old/eventlet-0.26.1/eventlet/green/ssl.py 2020-07-30 18:25:18.000000000 +0200 +++ new/eventlet-0.29.1/eventlet/green/ssl.py 2020-10-22 04:46:21.000000000 +0200 @@ -404,14 +404,11 @@ new_ssl = type(self)( newsock, - keyfile=self.keyfile, - certfile=self.certfile, server_side=True, - cert_reqs=self.cert_reqs, - ssl_version=self.ssl_version, - ca_certs=self.ca_certs, do_handshake_on_connect=False, - suppress_ragged_eofs=self.suppress_ragged_eofs) + suppress_ragged_eofs=self.suppress_ragged_eofs, + _context=self._context, + ) return (new_ssl, addr) def dup(self): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/eventlet-0.26.1/eventlet/greenio/py2.py new/eventlet-0.29.1/eventlet/greenio/py2.py --- old/eventlet-0.26.1/eventlet/greenio/py2.py 2020-07-30 18:25:18.000000000 +0200 +++ new/eventlet-0.29.1/eventlet/greenio/py2.py 2020-10-22 04:46:21.000000000 +0200 @@ -207,7 +207,10 @@ was_closed = self._mark_as_closed() if was_closed: return - notify_close(self._fileno) + if notify_close: + # If closing from __del__, notify_close may have + # already been cleaned up and set to None + notify_close(self._fileno) try: os.close(self._fileno) except: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/eventlet-0.26.1/eventlet/hubs/hub.py new/eventlet-0.29.1/eventlet/hubs/hub.py --- old/eventlet-0.26.1/eventlet/hubs/hub.py 2020-07-30 18:25:18.000000000 +0200 +++ new/eventlet-0.29.1/eventlet/hubs/hub.py 2020-10-22 08:30:23.000000000 +0200 @@ -22,7 +22,11 @@ import eventlet.hubs from eventlet.hubs import timer from eventlet.support import greenlets as greenlet, clear_sys_exc_info -import monotonic +try: + from monotonic import monotonic +except ImportError: + from time import monotonic + import six g_prevent_multiple_readers = True @@ -120,7 +124,7 @@ self.closed = [] if clock is None: - clock = monotonic.monotonic + clock = monotonic self.clock = clock self.greenlet = greenlet.greenlet(self.run) @@ -225,14 +229,18 @@ fileno = listener.fileno evtype = listener.evtype - self.listeners[evtype].pop(fileno, None) - # migrate a secondary listener to be the primary listener - if fileno in self.secondaries[evtype]: - sec = self.secondaries[evtype].get(fileno, None) - if not sec: - return - self.listeners[evtype][fileno] = sec.pop(0) - if not sec: + if listener is self.listeners[evtype][fileno]: + del self.listeners[evtype][fileno] + # migrate a secondary listener to be the primary listener + if fileno in self.secondaries[evtype]: + sec = self.secondaries[evtype][fileno] + if sec: + self.listeners[evtype][fileno] = sec.pop(0) + if not sec: + del self.secondaries[evtype][fileno] + else: + self.secondaries[evtype][fileno].remove(listener) + if not self.secondaries[evtype][fileno]: del self.secondaries[evtype][fileno] def mark_as_reopened(self, fileno): @@ -247,16 +255,23 @@ def remove_descriptor(self, fileno): """ Completely remove all listeners for this fileno. For internal use only.""" + # gather any listeners we have listeners = [] - listeners.append(self.listeners[READ].pop(fileno, noop)) - listeners.append(self.listeners[WRITE].pop(fileno, noop)) - listeners.extend(self.secondaries[READ].pop(fileno, ())) - listeners.extend(self.secondaries[WRITE].pop(fileno, ())) + listeners.append(self.listeners[READ].get(fileno, noop)) + listeners.append(self.listeners[WRITE].get(fileno, noop)) + listeners.extend(self.secondaries[READ].get(fileno, ())) + listeners.extend(self.secondaries[WRITE].get(fileno, ())) for listener in listeners: try: + # listener.cb may want to remove(listener) listener.cb(fileno) except Exception: self.squelch_generic_exception(sys.exc_info()) + # NOW this fileno is now dead to all + self.listeners[READ].pop(fileno, None) + self.listeners[WRITE].pop(fileno, None) + self.secondaries[READ].pop(fileno, None) + self.secondaries[WRITE].pop(fileno, None) def close_one(self): """ Triggered from the main run loop. If a listener's underlying FD was diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/eventlet-0.26.1/eventlet/patcher.py new/eventlet-0.29.1/eventlet/patcher.py --- old/eventlet-0.26.1/eventlet/patcher.py 2020-07-30 18:25:18.000000000 +0200 +++ new/eventlet-0.29.1/eventlet/patcher.py 2020-10-22 08:31:17.000000000 +0200 @@ -1,5 +1,11 @@ import imp import sys +try: + # Only for this purpose, it's irrelevant if `os` was already patched. + # https://github.com/eventlet/eventlet/pull/661 + from os import register_at_fork +except ImportError: + register_at_fork = None import eventlet import six @@ -298,6 +304,7 @@ # tell us whether or not we succeeded pass + _threading = original('threading') imp.acquire_lock() try: for name, mod in modules_to_patch: @@ -312,6 +319,28 @@ for attr_name in deleted: if hasattr(orig_mod, attr_name): delattr(orig_mod, attr_name) + + # https://github.com/eventlet/eventlet/issues/592 + if name == 'threading' and register_at_fork: + def fix_threading_active( + _global_dict=_threading.current_thread.__globals__, + # alias orig_mod as patched to reflect its new state + # https://github.com/eventlet/eventlet/pull/661#discussion_r509877481 + _patched=orig_mod, + ): + _prefork_active = [None] + + def before_fork(): + _prefork_active[0] = _global_dict['_active'] + _global_dict['_active'] = _patched._active + + def after_fork(): + _global_dict['_active'] = _prefork_active[0] + + register_at_fork( + before=before_fork, + after_in_parent=after_fork) + fix_threading_active() finally: imp.release_lock() @@ -359,18 +388,25 @@ import eventlet.green.thread lock_type = type(threading.Lock()) rlock_type = type(threading.RLock()) - if sys.version_info[0] >= 3: + if hasattr(threading, '_PyRLock'): + # this happens on CPython3 and PyPy >= 7.0.0: "py3-style" rlocks, they + # are implemented natively in C and RPython respectively + py3_style = True pyrlock_type = type(threading._PyRLock()) + else: + # this happens on CPython2.7 and PyPy < 7.0.0: "py2-style" rlocks, + # they are implemented in pure-python + py3_style = False + pyrlock_type = None + # We're monkey-patching so there can't be any greenlets yet, ergo our thread # ID is the only valid owner possible. tid = eventlet.green.thread.get_ident() for obj in gc.get_objects(): if isinstance(obj, rlock_type): - if (sys.version_info[0] == 2 and - isinstance(obj._RLock__block, lock_type)): + if not py3_style and isinstance(obj._RLock__block, lock_type): _fix_py2_rlock(obj, tid) - elif (sys.version_info[0] >= 3 and - not isinstance(obj, pyrlock_type)): + elif py3_style and not isinstance(obj, pyrlock_type): _fix_py3_rlock(obj) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/eventlet-0.26.1/eventlet.egg-info/PKG-INFO new/eventlet-0.29.1/eventlet.egg-info/PKG-INFO --- old/eventlet-0.26.1/eventlet.egg-info/PKG-INFO 2020-07-30 23:48:26.000000000 +0200 +++ new/eventlet-0.29.1/eventlet.egg-info/PKG-INFO 2020-10-22 09:17:28.000000000 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 1.1 Name: eventlet -Version: 0.26.1 +Version: 0.29.1 Summary: Highly concurrent networking library Home-page: http://eventlet.net Author: Linden Lab diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/eventlet-0.26.1/eventlet.egg-info/SOURCES.txt new/eventlet-0.29.1/eventlet.egg-info/SOURCES.txt --- old/eventlet-0.26.1/eventlet.egg-info/SOURCES.txt 2020-07-30 23:48:26.000000000 +0200 +++ new/eventlet-0.29.1/eventlet.egg-info/SOURCES.txt 2020-10-22 09:17:28.000000000 +0200 @@ -217,10 +217,12 @@ tests/isolated/hub_use_hub_class.py tests/isolated/mysqldb_monkey_patch.py tests/isolated/patcher_blocking_select_methods_are_deleted.py +tests/isolated/patcher_builtin.py tests/isolated/patcher_existing_locks_early.py tests/isolated/patcher_existing_locks_late.py tests/isolated/patcher_existing_locks_locked.py tests/isolated/patcher_existing_locks_unlocked.py +tests/isolated/patcher_fork_after_monkey_patch.py tests/isolated/patcher_import_patched_defaults.py tests/isolated/patcher_importlib_lock.py tests/isolated/patcher_socketserver_selectors.py diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/eventlet-0.26.1/eventlet.egg-info/requires.txt new/eventlet-0.29.1/eventlet.egg-info/requires.txt --- old/eventlet-0.26.1/eventlet.egg-info/requires.txt 2020-07-30 23:48:26.000000000 +0200 +++ new/eventlet-0.29.1/eventlet.egg-info/requires.txt 2020-10-22 09:17:28.000000000 +0200 @@ -1,4 +1,6 @@ dnspython<2.0.0,>=1.15.0 greenlet>=0.3 -monotonic>=1.4 six>=1.10.0 + +[:python_version < "3.5"] +monotonic>=1.4 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/eventlet-0.26.1/setup.py new/eventlet-0.29.1/setup.py --- old/eventlet-0.26.1/setup.py 2020-07-30 23:42:21.000000000 +0200 +++ new/eventlet-0.29.1/setup.py 2020-10-22 08:30:23.000000000 +0200 @@ -17,7 +17,7 @@ install_requires=( 'dnspython >= 1.15.0, < 2.0.0', 'greenlet >= 0.3', - 'monotonic >= 1.4', + 'monotonic >= 1.4;python_version<"3.5"', 'six >= 1.10.0', ), zip_safe=False, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/eventlet-0.26.1/tests/__init__.py new/eventlet-0.29.1/tests/__init__.py --- old/eventlet-0.26.1/tests/__init__.py 2020-07-30 18:25:18.000000000 +0200 +++ new/eventlet-0.29.1/tests/__init__.py 2020-10-22 04:46:21.000000000 +0200 @@ -323,8 +323,8 @@ def run_python(path, env=None, args=None, timeout=None, pythonpath_extend=None, expect_pass=False): new_argv = [sys.executable] - if sys.version_info[:2] <= (2, 6): - new_argv += ['-W', 'ignore::DeprecationWarning'] + if sys.version_info[:2] <= (2, 7): + new_argv += ['-W', 'ignore:Python 2 is no longer supported'] new_env = os.environ.copy() new_env.setdefault('eventlet_test_in_progress', 'yes') src_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/eventlet-0.26.1/tests/backdoor_test.py new/eventlet-0.29.1/tests/backdoor_test.py --- old/eventlet-0.26.1/tests/backdoor_test.py 2020-07-30 18:25:18.000000000 +0200 +++ new/eventlet-0.29.1/tests/backdoor_test.py 2020-10-22 04:46:21.000000000 +0200 @@ -57,3 +57,19 @@ client = socket.socket(socket.AF_UNIX) client.connect(SOCKET_PATH) self._run_test_on_client_and_server(client, serv) + + def test_quick_client_disconnect(self): + listener = socket.socket() + listener.bind(('localhost', 0)) + listener.listen(50) + serv = eventlet.spawn(backdoor.backdoor_server, listener) + client = socket.socket() + client.connect(('localhost', listener.getsockname()[1])) + client.close() + # can still reconnect; server is running + client = socket.socket() + client.connect(('localhost', listener.getsockname()[1])) + client.close() + serv.kill() + # wait for the console to discover that it's dead + eventlet.sleep(0.1) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/eventlet-0.26.1/tests/hub_test.py new/eventlet-0.29.1/tests/hub_test.py --- old/eventlet-0.26.1/tests/hub_test.py 2020-07-30 18:25:18.000000000 +0200 +++ new/eventlet-0.29.1/tests/hub_test.py 2020-10-22 04:46:21.000000000 +0200 @@ -1,11 +1,14 @@ from __future__ import with_statement +import errno +import fcntl +import os import sys import time import tests from tests import skip_with_pyevent, skip_if_no_itimer, skip_unless import eventlet -from eventlet import hubs +from eventlet import debug, hubs from eventlet.support import greenlets import six @@ -83,6 +86,48 @@ eventlet.sleep() +class TestMultipleListenersCleanup(tests.LimitedTestCase): + def setUp(self): + super(TestMultipleListenersCleanup, self).setUp() + debug.hub_prevent_multiple_readers(False) + debug.hub_exceptions(False) + + def tearDown(self): + super(TestMultipleListenersCleanup, self).tearDown() + debug.hub_prevent_multiple_readers(True) + debug.hub_exceptions(True) + + def test_cleanup(self): + r, w = os.pipe() + self.addCleanup(os.close, r) + self.addCleanup(os.close, w) + + fcntl.fcntl(r, fcntl.F_SETFL, + fcntl.fcntl(r, fcntl.F_GETFL) | os.O_NONBLOCK) + + def readfd(fd): + while True: + try: + return os.read(fd, 1) + except OSError as e: + if e.errno != errno.EAGAIN: + raise + hubs.trampoline(fd, read=True) + + first_listener = eventlet.spawn(readfd, r) + eventlet.sleep() + + second_listener = eventlet.spawn(readfd, r) + eventlet.sleep() + + hubs.get_hub().schedule_call_global(0, second_listener.throw, + eventlet.Timeout(None)) + eventlet.sleep() + + os.write(w, b'.') + self.assertEqual(first_listener.wait(), b'.') + + class TestScheduleCall(tests.LimitedTestCase): def test_local(self): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/eventlet-0.26.1/tests/isolated/patcher_builtin.py new/eventlet-0.29.1/tests/isolated/patcher_builtin.py --- old/eventlet-0.26.1/tests/isolated/patcher_builtin.py 1970-01-01 01:00:00.000000000 +0100 +++ new/eventlet-0.29.1/tests/isolated/patcher_builtin.py 2020-10-22 08:30:23.000000000 +0200 @@ -0,0 +1,14 @@ +if __name__ == '__main__': + from tests.mock import patch + + import sys + import eventlet + from eventlet import hubs + with patch.object(hubs, 'notify_opened') as mock_func: + eventlet.monkey_patch(builtins=True) + with open(__file__, 'r') as f: + mock_func.assert_called_with(f.fileno()) + if sys.version_info.major == 2: + with file(__file__, 'r') as f: + mock_func.assert_called_with(f.fileno()) + print('pass') diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/eventlet-0.26.1/tests/isolated/patcher_fork_after_monkey_patch.py new/eventlet-0.29.1/tests/isolated/patcher_fork_after_monkey_patch.py --- old/eventlet-0.26.1/tests/isolated/patcher_fork_after_monkey_patch.py 1970-01-01 01:00:00.000000000 +0100 +++ new/eventlet-0.29.1/tests/isolated/patcher_fork_after_monkey_patch.py 2020-10-22 04:46:21.000000000 +0200 @@ -0,0 +1,59 @@ +# Monkey patching interferes with threading in Python 3.7 +# https://github.com/eventlet/eventlet/issues/592 +__test__ = False + + +def check(n, mod, tag): + assert len(mod._active) == n, 'Expected {} {} threads, got {}'.format(n, tag, mod._active) + + +if __name__ == '__main__': + import eventlet + import eventlet.patcher + eventlet.monkey_patch() + import os + import sys + import threading + _threading = eventlet.patcher.original('threading') + import eventlet.green.threading + + def target(): + eventlet.sleep(0.1) + + threads = [ + threading.Thread(target=target, name='patched'), + _threading.Thread(target=target, name='original-1'), + _threading.Thread(target=target, name='original-2'), + eventlet.green.threading.Thread(target=target, name='green-1'), + eventlet.green.threading.Thread(target=target, name='green-2'), + eventlet.green.threading.Thread(target=target, name='green-3'), + ] + for t in threads: + t.start() + + check(2, threading, 'pre-fork patched') + check(3, _threading, 'pre-fork original') + check(4, eventlet.green.threading, 'pre-fork green') + + if os.fork() == 0: + # Inside the child, we should only have a main thread, + # but old pythons make it difficult to ensure + if sys.version_info >= (3, 7): + check(1, threading, 'child post-fork patched') + check(1, _threading, 'child post-fork original') + check(1, eventlet.green.threading, 'child post-fork green') + sys.exit() + else: + os.wait() + + check(2, threading, 'post-fork patched') + check(3, _threading, 'post-fork original') + check(4, eventlet.green.threading, 'post-fork green') + + for t in threads: + t.join() + + check(1, threading, 'post-join patched') + check(1, _threading, 'post-join original') + check(1, eventlet.green.threading, 'post-join green') + print('pass') diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/eventlet-0.26.1/tests/patcher_test.py new/eventlet-0.29.1/tests/patcher_test.py --- old/eventlet-0.26.1/tests/patcher_test.py 2020-07-30 18:25:18.000000000 +0200 +++ new/eventlet-0.29.1/tests/patcher_test.py 2020-10-22 08:30:23.000000000 +0200 @@ -515,3 +515,11 @@ def test_threadpoolexecutor(): tests.run_isolated('patcher_threadpoolexecutor.py') + + +def test_fork_after_monkey_patch(): + tests.run_isolated('patcher_fork_after_monkey_patch.py') + + +def test_builtin(): + tests.run_isolated('patcher_builtin.py') diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/eventlet-0.26.1/tests/ssl_test.py new/eventlet-0.29.1/tests/ssl_test.py --- old/eventlet-0.26.1/tests/ssl_test.py 2020-07-30 18:25:18.000000000 +0200 +++ new/eventlet-0.29.1/tests/ssl_test.py 2020-10-22 04:46:21.000000000 +0200 @@ -1,4 +1,5 @@ import contextlib +import random import socket import warnings @@ -325,3 +326,48 @@ server_to_client.close() listener.close() + + def test_context_wrapped_accept(self): + context = ssl.SSLContext(ssl.PROTOCOL_SSLv23) + context.load_cert_chain(tests.certificate_file, tests.private_key_file) + expected = "success:{}".format(random.random()).encode() + + def client(addr): + client_tls = ssl.wrap_socket( + eventlet.connect(addr), + cert_reqs=ssl.CERT_REQUIRED, + ca_certs=tests.certificate_file, + ) + client_tls.send(expected) + + server_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + server_sock.bind(('localhost', 0)) + server_sock.listen(1) + eventlet.spawn(client, server_sock.getsockname()) + server_tls = context.wrap_socket(server_sock, server_side=True) + peer, _ = server_tls.accept() + assert peer.recv(64) == expected + peer.close() + + def test_explicit_keys_accept(self): + expected = "success:{}".format(random.random()).encode() + + def client(addr): + client_tls = ssl.wrap_socket( + eventlet.connect(addr), + cert_reqs=ssl.CERT_REQUIRED, + ca_certs=tests.certificate_file, + ) + client_tls.send(expected) + + server_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + server_sock.bind(('localhost', 0)) + server_sock.listen(1) + eventlet.spawn(client, server_sock.getsockname()) + server_tls = ssl.wrap_socket( + server_sock, server_side=True, + keyfile=tests.private_key_file, certfile=tests.certificate_file, + ) + peer, _ = server_tls.accept() + assert peer.recv(64) == expected + peer.close() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/eventlet-0.26.1/tests/test__socket_errors.py new/eventlet-0.29.1/tests/test__socket_errors.py --- old/eventlet-0.26.1/tests/test__socket_errors.py 2020-07-30 18:25:18.000000000 +0200 +++ new/eventlet-0.29.1/tests/test__socket_errors.py 2020-10-22 08:30:23.000000000 +0200 @@ -1,3 +1,4 @@ +import errno import unittest import socket as _original_sock from eventlet.green import socket @@ -18,7 +19,7 @@ self.fail("Shouldn't have connected") except socket.error as ex: code, text = ex.args - assert code in [111, 61, 10061], (code, text) + assert code == errno.ECONNREFUSED, 'Expected ECONNREFUSED, got {0} ({1})'.format(code, text) assert 'refused' in text.lower(), (code, text) def test_timeout_real_socket(self): @@ -54,9 +55,9 @@ def test_create_connection_refused(): - errno = None try: socket.create_connection(('127.0.0.1', 1)) + assert False, "Shouldn't have connected" except socket.error as ex: - errno = ex.errno - assert errno in [111, 61, 10061], 'Expected socket.error ECONNREFUSED, got {0}'.format(errno) + code, text = ex.args + assert code == errno.ECONNREFUSED, 'Expected ECONNREFUSED, got {0} ({1})'.format(code, text) ++++++ newdnspython.patch ++++++ --- /var/tmp/diff_new_pack.Vh9rHN/_old 2020-12-12 20:32:16.949846916 +0100 +++ /var/tmp/diff_new_pack.Vh9rHN/_new 2020-12-12 20:32:16.953846920 +0100 @@ -1,5 +1,7 @@ ---- a/eventlet/support/greendns.py -+++ b/eventlet/support/greendns.py +Index: eventlet-0.29.1/eventlet/support/greendns.py +=================================================================== +--- eventlet-0.29.1.orig/eventlet/support/greendns.py ++++ eventlet-0.29.1/eventlet/support/greendns.py @@ -313,7 +313,7 @@ class ResolverProxy(object): self.clear() @@ -9,8 +11,10 @@ self._resolver.cache = dns.resolver.LRUCache() def query(self, qname, rdtype=dns.rdatatype.A, rdclass=dns.rdataclass.IN, ---- a/tests/greendns_test.py -+++ b/tests/greendns_test.py +Index: eventlet-0.29.1/tests/greendns_test.py +=================================================================== +--- eventlet-0.29.1.orig/tests/greendns_test.py ++++ eventlet-0.29.1/tests/greendns_test.py @@ -885,7 +885,7 @@ class TinyDNSTests(tests.LimitedTestCase # https://github.com/eventlet/eventlet/issues/499 # None means we don't want the server to find the IP @@ -29,8 +33,10 @@ resolver.nameservers = [dnsaddr[0]] resolver.nameserver_ports[dnsaddr[0]] = dnsaddr[1] response = resolver.query('host.example.com', 'a', tcp=True) ---- a/setup.py -+++ b/setup.py +Index: eventlet-0.29.1/setup.py +=================================================================== +--- eventlet-0.29.1.orig/setup.py ++++ eventlet-0.29.1/setup.py @@ -15,7 +15,7 @@ setuptools.setup( url='http://eventlet.net', packages=setuptools.find_packages(exclude=['benchmarks', 'tests', 'tests.*']), @@ -38,5 +44,5 @@ - 'dnspython >= 1.15.0, < 2.0.0', + 'dnspython >= 1.15.0', 'greenlet >= 0.3', - 'monotonic >= 1.4', + 'monotonic >= 1.4;python_version<"3.5"', 'six >= 1.10.0', ++++++ pr_672-remove-OpenSSL-tsafe.patch ++++++ From be0d520c9bc9e3b3959f84d80c65e418e6081887 Mon Sep 17 00:00:00 2001 From: Sergey Shepelev <temo...@gmail.com> Date: Wed, 2 Dec 2020 01:10:02 +0300 Subject: [PATCH] pyopenssl tsafe module was deprecated and removed in v20.0.0 https://github.com/eventlet/eventlet/issues/671 https://github.com/pyca/pyopenssl/pull/913 --- eventlet/green/OpenSSL/__init__.py | 7 ++++++- tests/openssl_test.py | 1 - 4 files changed, 9 insertions(+), 3 deletions(-) diff --git a/eventlet/green/OpenSSL/__init__.py b/eventlet/green/OpenSSL/__init__.py index d86147645..1b2500971 100644 --- a/eventlet/green/OpenSSL/__init__.py +++ b/eventlet/green/OpenSSL/__init__.py @@ -1,4 +1,9 @@ from . import crypto from . import SSL -from . import tsafe +try: + # pyopenssl tsafe module was deprecated and removed in v20.0.0 + # https://github.com/pyca/pyopenssl/pull/913 + from . import tsafe +except ImportError: + pass from .version import __version__ diff --git a/tests/openssl_test.py b/tests/openssl_test.py index a127408b8..1108adaf6 100644 --- a/tests/openssl_test.py +++ b/tests/openssl_test.py @@ -12,5 +12,4 @@ def test_import(): import eventlet.green.OpenSSL.SSL import eventlet.green.OpenSSL.crypto - import eventlet.green.OpenSSL.tsafe import eventlet.green.OpenSSL.version _______________________________________________ openSUSE Commits mailing list -- commit@lists.opensuse.org To unsubscribe, email commit-le...@lists.opensuse.org List Netiquette: https://en.opensuse.org/openSUSE:Mailing_list_netiquette List Archives: https://lists.opensuse.org/archives/list/commit@lists.opensuse.org