diff options
author | robot-piglet <[email protected]> | 2025-08-28 12:46:38 +0300 |
---|---|---|
committer | robot-piglet <[email protected]> | 2025-08-28 12:57:28 +0300 |
commit | 20d1c4dc5dd3136b9b4fc6cd3498c1e43a98c83c (patch) | |
tree | aff921e4cbf8098d0a5a45705baa76d66e0c985c /contrib | |
parent | 88a01b8b1632428cb27e6a4d670e4d888e9f1db2 (diff) |
Intermediate changes
commit_hash:44127418196d19ea3d299272a81b83e57cc91b7f
Diffstat (limited to 'contrib')
-rw-r--r-- | contrib/python/multidict/.dist-info/METADATA | 2 | ||||
-rw-r--r-- | contrib/python/multidict/multidict/__init__.py | 2 | ||||
-rw-r--r-- | contrib/python/multidict/multidict/_multilib/hashtable.h | 2 | ||||
-rw-r--r-- | contrib/python/multidict/tests/isolated/multidict_pop.py | 80 | ||||
-rw-r--r-- | contrib/python/multidict/tests/test_leaks.py | 1 | ||||
-rw-r--r-- | contrib/python/multidict/ya.make | 2 |
6 files changed, 85 insertions, 4 deletions
diff --git a/contrib/python/multidict/.dist-info/METADATA b/contrib/python/multidict/.dist-info/METADATA index 3669824ce69..b136b6cf70c 100644 --- a/contrib/python/multidict/.dist-info/METADATA +++ b/contrib/python/multidict/.dist-info/METADATA @@ -1,6 +1,6 @@ Metadata-Version: 2.4 Name: multidict -Version: 6.6.3 +Version: 6.6.4 Summary: multidict implementation Home-page: https://github.com/aio-libs/multidict Author: Andrew Svetlov diff --git a/contrib/python/multidict/multidict/__init__.py b/contrib/python/multidict/multidict/__init__.py index c506324f392..bd03149defc 100644 --- a/contrib/python/multidict/multidict/__init__.py +++ b/contrib/python/multidict/multidict/__init__.py @@ -22,7 +22,7 @@ __all__ = ( "getversion", ) -__version__ = "6.6.3" +__version__ = "6.6.4" if TYPE_CHECKING or not USE_EXTENSIONS: diff --git a/contrib/python/multidict/multidict/_multilib/hashtable.h b/contrib/python/multidict/multidict/_multilib/hashtable.h index 16b82ded1fb..82019f9ebd9 100644 --- a/contrib/python/multidict/multidict/_multilib/hashtable.h +++ b/contrib/python/multidict/multidict/_multilib/hashtable.h @@ -1877,7 +1877,7 @@ md_traverse(MultiDictObject *md, visitproc visit, void *arg) static inline int md_clear(MultiDictObject *md) { - if (md->used == 0) { + if (md->keys == NULL || md->keys == &empty_htkeys) { return 0; } md->version = NEXT_VERSION(md->state); diff --git a/contrib/python/multidict/tests/isolated/multidict_pop.py b/contrib/python/multidict/tests/isolated/multidict_pop.py new file mode 100644 index 00000000000..daced359e65 --- /dev/null +++ b/contrib/python/multidict/tests/isolated/multidict_pop.py @@ -0,0 +1,80 @@ +# Test for memory leaks surrounding deletion of values or +# bad cleanups. +# SEE: https://github.com/aio-libs/multidict/issues/1232 +# We want to make sure that bad predictions or bougus claims +# of memory leaks can be prevented in the future. + +import gc +import psutil +import os +from multidict import MultiDict + + +def trim_ram() -> None: + """Forces python garbage collection.""" + gc.collect() + + +process = psutil.Process(os.getpid()) + + +def get_memory_usage() -> int: + memory_info = process.memory_info() + return memory_info.rss / (1024 * 1024) # type: ignore[no-any-return] + + +keys = [f"X-Any-{i}" for i in range(100)] +headers = {key: key * 2 for key in keys} + + +def check_for_leak() -> None: + trim_ram() + usage = get_memory_usage() + assert usage < 50, f"Memory leaked at: {usage} MB" + + +def _test_pop() -> None: + for _ in range(10): + for _ in range(100): + result = MultiDict(headers) + for k in keys: + result.pop(k) + check_for_leak() + + +def _test_popall() -> None: + for _ in range(10): + for _ in range(100): + result = MultiDict(headers) + for k in keys: + result.popall(k) + check_for_leak() + + +def _test_popone() -> None: + for _ in range(10): + for _ in range(100): + result = MultiDict(headers) + for k in keys: + result.popone(k) + check_for_leak() + + +def _test_del() -> None: + for _ in range(10): + for _ in range(100): + result = MultiDict(headers) + for k in keys: + del result[k] + check_for_leak() + + +def _run_isolated_case() -> None: + _test_pop() + _test_popall() + _test_popone() + _test_del() + + +if __name__ == "__main__": + _run_isolated_case() diff --git a/contrib/python/multidict/tests/test_leaks.py b/contrib/python/multidict/tests/test_leaks.py index ded7cf065b0..56126d4bc80 100644 --- a/contrib/python/multidict/tests/test_leaks.py +++ b/contrib/python/multidict/tests/test_leaks.py @@ -15,6 +15,7 @@ IS_PYPY = platform.python_implementation() == "PyPy" "multidict_extend_multidict.py", "multidict_extend_tuple.py", "multidict_update_multidict.py", + "multidict_pop.py", ), ) @pytest.mark.leaks diff --git a/contrib/python/multidict/ya.make b/contrib/python/multidict/ya.make index 36c4e50ce53..aad90e18cfb 100644 --- a/contrib/python/multidict/ya.make +++ b/contrib/python/multidict/ya.make @@ -2,7 +2,7 @@ PY3_LIBRARY() -VERSION(6.6.3) +VERSION(6.6.4) LICENSE(Apache-2.0) |