diff --git a/0001_create_a_thread_to_reap_death_process.patch b/0001_create_a_thread_to_reap_death_process.patch new file mode 100644 index 0000000..8a74e84 --- /dev/null +++ b/0001_create_a_thread_to_reap_death_process.patch @@ -0,0 +1,65 @@ +From 676bc5fa4b6aa9d153c9805cdbad0ff0450bade6 Mon Sep 17 00:00:00 2001 +From: Alberto Planas +Date: Wed, 3 Feb 2016 11:56:23 +0100 +Subject: [PATCH] Create a thread to reap death process + +ForkingWSGIServer use `SocketServer.ForkingMixIn` to implement a +multiprocess server. This class provides a workflow that collect +death process (process in Zombie status) before the +`process_request`. This means that this process itself will be +in Zombie status at the end of the request, that will be eventually +collected during the next `process_request`. + +To minimize transient Zombie process, `ForkingWSGIServer` is +creating a daemon thread (via `threading.Timer`) to call the +collector every (by default) 5 seconds. + +Fixes #810 +--- + werkzeug/serving.py | 21 ++++++++++++++++++++- + 1 file changed, 20 insertions(+), 1 deletion(-) + +Index: Werkzeug-0.16.0/src/werkzeug/serving.py +=================================================================== +--- Werkzeug-0.16.0.orig/src/werkzeug/serving.py ++++ Werkzeug-0.16.0/src/werkzeug/serving.py +@@ -40,6 +40,7 @@ import os + import signal + import socket + import sys ++import threading + + from ._compat import PY2 + from ._compat import reraise +@@ -776,6 +777,7 @@ class ForkingWSGIServer(ForkingMixIn, Ba + passthrough_errors=False, + ssl_context=None, + fd=None, ++ frequency=5, + ): + if not can_fork: + raise ValueError("Your platform does not support forking.") +@@ -784,6 +786,23 @@ class ForkingWSGIServer(ForkingMixIn, Ba + ) + self.max_children = processes + ++ if frequency: ++ self.frequency = frequency ++ self.setup_reap_children() ++ ++ def setup_reap_children(self): ++ """Create a thread to collect death children.""" ++ t = threading.Timer(self.frequency, self.reap_children) ++ # Set daemon mode to provide a clean termination of the thread ++ # when the system ends ++ t.daemon = True ++ t.start() ++ ++ def reap_children(self): ++ """Reap or collect death children.""" ++ self.collect_children() ++ self.setup_reap_children() ++ + + def make_server( + host=None, diff --git a/Werkzeug-0.16.0.tar.gz b/Werkzeug-0.16.0.tar.gz new file mode 100644 index 0000000..8ad3bfc --- /dev/null +++ b/Werkzeug-0.16.0.tar.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7280924747b5733b246fe23972186c6b348f9ae29724135a6dfc1e53cea433e7 +size 925717 diff --git a/Werkzeug-1.0.0.tar.gz b/Werkzeug-1.0.0.tar.gz deleted file mode 100644 index a29b704..0000000 --- a/Werkzeug-1.0.0.tar.gz +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:169ba8a33788476292d04186ab33b01d6add475033dfc07215e6d219cc077096 -size 904176 diff --git a/python-Werkzeug.changes b/python-Werkzeug.changes index 9a7ca2f..4fec1cc 100644 --- a/python-Werkzeug.changes +++ b/python-Werkzeug.changes @@ -1,49 +1,3 @@ -------------------------------------------------------------------- -Fri Feb 21 04:58:05 UTC 2020 - Steve Kowalik - -- Update to 1.0.0: - * Drop support for Python 3.4. (#1478) - * Remove code that issued deprecation warnings in version 0.15. (#1477) - * Remove most top-level attributes provided by the werkzeug module in favor of direct imports. For example, instead of import werkzeug; werkzeug.url_quote, do from werkzeug.urls import url_quote. Install version 0.16 first to see deprecation warnings while upgrading. #2, #1640 - * Added utils.invalidate_cached_property() to invalidate cached properties. (#1474) - * Directive keys for the Set-Cookie response header are not ignored when parsing the Cookie request header. This allows cookies with names such as “expires” and “version”. (#1495) - * Request cookies are parsed into a MultiDict to capture all values for cookies with the same key. cookies[key] returns the first value rather than the last. Use cookies.getlist(key) to get all values. parse_cookie also defaults to a MultiDict. #1562, #1458 - * Add charset=utf-8 to an HTTP exception response’s CONTENT_TYPE header. (#1526) - * The interactive debugger handles outer variables in nested scopes such as lambdas and comprehensions. #913, #1037, #1532 - * The user agent for Opera 60 on Mac is correctly reported as “opera” instead of “chrome”. #1556 - * The platform for Crosswalk on Android is correctly reported as “android” instead of “chromeos”. (#1572) - * Issue a warning when the current server name does not match the configured server name. #760 - * A configured server name with the default port for a scheme will match the current server name without the port if the current scheme matches. #1584 - * InternalServerError has a original_exception attribute that frameworks can use to track the original cause of the error. #1590 - * Headers are tested for equality independent of the header key case, such that X-Foo is the same as x-foo. #1605 - * http.dump_cookie() accepts 'None' as a value for samesite. #1549 - * set_cookie() accepts a samesite argument. #1705 - * Support the Content Security Policy header through the Response.content_security_policy data structure. #1617 - * LanguageAccept will fall back to matching “en” for “en-US” or “en-US” for “en” to better support clients or translations that only match at the primary language tag. #450, #1507 - * MIMEAccept uses MIME parameters for specificity when matching. #458, #1574 - * If the development server is started with an SSLContext configured to verify client certificates, the certificate in PEM format will be available as environ["SSL_CLIENT_CERT"]. #1469 - * is_resource_modified will run for methods other than GET and HEAD, rather than always returning False. #409 - * SharedDataMiddleware returns 404 rather than 500 when trying to access a directory instead of a file with the package loader. The dependency on setuptools and pkg_resources is removed. #1599 - * Add a response.cache_control.immutable flag. Keep in mind that browser support for this Cache-Control header option is still experimental and may not be implemented. #1185 - * Optional request log highlighting with the development server is handled by Click instead of termcolor. #1235 - * Optional ad-hoc TLS support for the development server is handled by cryptography instead of pyOpenSSL. #1555 - * FileStorage.save() supports pathlib and PEP 519 PathLike objects. #1653 - * The debugger security pin is unique in containers managed by Podman. #1661 - * Building a URL when host_matching is enabled takes into account the current host when there are duplicate endpoints with different hosts. #488 - * The 429 TooManyRequests and 503 ServiceUnavailable HTTP exceptions takes a retry_after parameter to set the Retry-After header. #1657 - * Map and Rule have a merge_slashes option to collapse multiple slashes into one, similar to how many HTTP servers behave. This is enabled by default. #1286, #1694 - * Add HTTP 103, 208, 306, 425, 506, 508, and 511 to the list of status codes. #1678 - * Add update, setlist, and setlistdefault methods to the Headers data structure. extend method can take MultiDict and kwargs. #1687, #1697 - * The development server accepts paths that start with two slashes, rather than stripping off the first path segment. #491 - * Add access control (Cross Origin Request Sharing, CORS) header properties to the Request and Response wrappers. #1699 - * Accept values are no longer ordered alphabetically for equal quality tags. Instead the initial order is preserved. #1686 - * Added Map.lock_class attribute for alternative implementations. #1702 - * Support matching and building WebSocket rules in the routing system, for use by async frameworks. #1709 - * Range requests that span an entire file respond with 206 instead of 200, to be more compliant with RFC 7233. This may help serving media to older browsers. #410, #1704 - * The SharedDataMiddleware default fallback_mimetype is application/octet-stream. If a filename looks like a text mimetype, the utf-8 charset is added to it. This matches the behavior of BaseResponse and Flask’s send_file(). #1689 -- Remove patch 0001_create_a_thread_to_reap_death_process.patch, not required -- Add pytest-timeout to BuildRequires - ------------------------------------------------------------------- Tue Sep 24 10:15:31 UTC 2019 - Tomáš Chvátal diff --git a/python-Werkzeug.spec b/python-Werkzeug.spec index 5a4b01c..5220c38 100644 --- a/python-Werkzeug.spec +++ b/python-Werkzeug.spec @@ -1,7 +1,7 @@ # # spec file for package python-Werkzeug # -# Copyright (c) 2020 SUSE LLC +# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -19,15 +19,16 @@ %define oldpython python %{?!python_module:%define python_module() python-%{**} python3-%{**}} Name: python-Werkzeug -Version: 1.0.0 +Version: 0.16.0 Release: 0 Summary: The Swiss Army knife of Python web development License: BSD-3-Clause Group: Development/Languages/Python URL: http://werkzeug.pocoo.org/ Source: https://files.pythonhosted.org/packages/source/W/Werkzeug/Werkzeug-%{version}.tar.gz +# PATCH-FIX-UPSTREAM 0001_create_a_thread_to_reap_death_process.patch bsc#954591 +Patch0: 0001_create_a_thread_to_reap_death_process.patch BuildRequires: %{python_module hypothesis} -BuildRequires: %{python_module pytest-timeout} BuildRequires: %{python_module pytest} BuildRequires: %{python_module requests} BuildRequires: %{python_module setuptools} @@ -65,6 +66,7 @@ bulletin boards, etc.). %prep %setup -q -n Werkzeug-%{version} sed -i "1d" examples/manage-{i18nurls,simplewiki,shorty,couchy,cupoftee,webpylike,plnt,coolmagic}.py # Fix non-executable scripts +%patch0 -p1 %build %python_build