summaryrefslogtreecommitdiffstats
path: root/contrib
diff options
context:
space:
mode:
authorrobot-piglet <[email protected]>2025-08-28 12:46:38 +0300
committerrobot-piglet <[email protected]>2025-08-28 12:57:28 +0300
commit20d1c4dc5dd3136b9b4fc6cd3498c1e43a98c83c (patch)
treeaff921e4cbf8098d0a5a45705baa76d66e0c985c /contrib
parent88a01b8b1632428cb27e6a4d670e4d888e9f1db2 (diff)
Intermediate changes
commit_hash:44127418196d19ea3d299272a81b83e57cc91b7f
Diffstat (limited to 'contrib')
-rw-r--r--contrib/python/multidict/.dist-info/METADATA2
-rw-r--r--contrib/python/multidict/multidict/__init__.py2
-rw-r--r--contrib/python/multidict/multidict/_multilib/hashtable.h2
-rw-r--r--contrib/python/multidict/tests/isolated/multidict_pop.py80
-rw-r--r--contrib/python/multidict/tests/test_leaks.py1
-rw-r--r--contrib/python/multidict/ya.make2
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)