Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

python-cachelib-0.13.0 fails to build with Python 3.13: pytest.PytestUnraisableExceptionWarning: Exception ignored in PyMapping_HasKeyString(); consider using PyMapping_HasKeyStringWithError(), PyMapping_GetOptionalItemString() or PyMapping_GetItemString(): None #400

Open
topazus opened this issue Jun 13, 2024 · 1 comment · May be fixed by lericson/pylibmc#292

Comments

@topazus
Copy link

topazus commented Jun 13, 2024

Some pytest output
+ /usr/bin/pytest -v -r s -k 'not Uwsgi and not DynamoDb and not MongoDb'
============================= test session starts ==============================
platform linux -- Python 3.13.0b2, pytest-7.4.3, pluggy-1.3.0 -- /usr/bin/python3
cachedir: .pytest_cache
rootdir: /builddir/build/BUILD/python-cachelib-0.13.0-build/cachelib-0.13.0
configfile: setup.cfg
testpaths: tests
plugins: xprocess-1.0.2
collecting ... collected 160 items / 22 deselected / 1 skipped / 138 selected

tests/test_base_cache.py::TestBaseCache::test_get PASSED                 [  0%]
tests/test_base_cache.py::TestBaseCache::test_delete PASSED              [  1%]
tests/test_base_cache.py::TestBaseCache::test_get_many PASSED            [  2%]
tests/test_base_cache.py::TestBaseCache::test_get_dict PASSED            [  2%]
tests/test_base_cache.py::TestBaseCache::test_set PASSED                 [  3%]
tests/test_base_cache.py::TestBaseCache::test_add PASSED                 [  4%]
tests/test_base_cache.py::TestBaseCache::test_set_many PASSED            [  5%]
tests/test_base_cache.py::TestBaseCache::test_delete_many PASSED         [  5%]
tests/test_base_cache.py::TestBaseCache::test_has PASSED                 [  6%]
tests/test_base_cache.py::TestBaseCache::test_clear PASSED               [  7%]
tests/test_base_cache.py::TestBaseCache::test_inc PASSED                 [  7%]
tests/test_base_cache.py::TestBaseCache::test_dec PASSED                 [  8%]
tests/test_file_system_cache.py::TestFileSystemCache::test_has[FileSystemCache] PASSED [  9%]
tests/test_file_system_cache.py::TestFileSystemCache::test_has[CustomSerializerCache] PASSED [ 10%]
tests/test_file_system_cache.py::TestFileSystemCache::test_has[CustomHashingMethodCache] PASSED [ 10%]
tests/test_file_system_cache.py::TestFileSystemCache::test_has[CustomDefaultHashingMethodCache] PASSED [ 11%]
tests/test_file_system_cache.py::TestFileSystemCache::test_clear[FileSystemCache] PASSED [ 12%]
tests/test_file_system_cache.py::TestFileSystemCache::test_clear[CustomSerializerCache] PASSED [ 13%]
tests/test_file_system_cache.py::TestFileSystemCache::test_clear[CustomHashingMethodCache] PASSED [ 13%]
tests/test_file_system_cache.py::TestFileSystemCache::test_clear[CustomDefaultHashingMethodCache] PASSED [ 14%]
tests/test_file_system_cache.py::TestFileSystemCache::test_set_get[FileSystemCache] PASSED [ 15%]
tests/test_file_system_cache.py::TestFileSystemCache::test_set_get[CustomSerializerCache] PASSED [ 15%]
tests/test_file_system_cache.py::TestFileSystemCache::test_set_get[CustomHashingMethodCache] PASSED [ 16%]
tests/test_file_system_cache.py::TestFileSystemCache::test_set_get[CustomDefaultHashingMethodCache] PASSED [ 17%]
tests/test_file_system_cache.py::TestFileSystemCache::test_set_get_many[FileSystemCache] PASSED [ 18%]
tests/test_file_system_cache.py::TestFileSystemCache::test_set_get_many[CustomSerializerCache] PASSED [ 18%]
tests/test_file_system_cache.py::TestFileSystemCache::test_set_get_many[CustomHashingMethodCache] PASSED [ 19%]
tests/test_file_system_cache.py::TestFileSystemCache::test_set_get_many[CustomDefaultHashingMethodCache] PASSED [ 20%]
tests/test_file_system_cache.py::TestFileSystemCache::test_get_dict[FileSystemCache] PASSED [ 21%]
tests/test_file_system_cache.py::TestFileSystemCache::test_get_dict[CustomSerializerCache] PASSED [ 21%]
tests/test_file_system_cache.py::TestFileSystemCache::test_get_dict[CustomHashingMethodCache] PASSED [ 22%]
tests/test_file_system_cache.py::TestFileSystemCache::test_get_dict[CustomDefaultHashingMethodCache] PASSED [ 23%]
tests/test_file_system_cache.py::TestFileSystemCache::test_delete[FileSystemCache] PASSED [ 23%]
tests/test_file_system_cache.py::TestFileSystemCache::test_delete[CustomSerializerCache] PASSED [ 24%]
tests/test_file_system_cache.py::TestFileSystemCache::test_delete[CustomHashingMethodCache] PASSED [ 25%]
tests/test_file_system_cache.py::TestFileSystemCache::test_delete[CustomDefaultHashingMethodCache] PASSED [ 26%]
tests/test_file_system_cache.py::TestFileSystemCache::test_delete_many[FileSystemCache] PASSED [ 26%]
tests/test_file_system_cache.py::TestFileSystemCache::test_delete_many[CustomSerializerCache] PASSED [ 27%]
tests/test_file_system_cache.py::TestFileSystemCache::test_delete_many[CustomHashingMethodCache] PASSED [ 28%]
tests/test_file_system_cache.py::TestFileSystemCache::test_delete_many[CustomDefaultHashingMethodCache] PASSED [ 28%]
tests/test_file_system_cache.py::TestFileSystemCache::test_delete_many_ignore_errors[FileSystemCache] PASSED [ 29%]
tests/test_file_system_cache.py::TestFileSystemCache::test_delete_many_ignore_errors[CustomSerializerCache] PASSED [ 30%]
tests/test_file_system_cache.py::TestFileSystemCache::test_delete_many_ignore_errors[CustomHashingMethodCache] PASSED [ 31%]
tests/test_file_system_cache.py::TestFileSystemCache::test_delete_many_ignore_errors[CustomDefaultHashingMethodCache] PASSED [ 31%]
tests/test_file_system_cache.py::TestFileSystemCache::test_add[FileSystemCache] PASSED [ 32%]
tests/test_file_system_cache.py::TestFileSystemCache::test_add[CustomSerializerCache] PASSED [ 33%]
tests/test_file_system_cache.py::TestFileSystemCache::test_add[CustomHashingMethodCache] PASSED [ 34%]
tests/test_file_system_cache.py::TestFileSystemCache::test_add[CustomDefaultHashingMethodCache] PASSED [ 34%]
tests/test_file_system_cache.py::TestFileSystemCache::test_inc_dec[FileSystemCache] PASSED [ 35%]
tests/test_file_system_cache.py::TestFileSystemCache::test_inc_dec[CustomSerializerCache] PASSED [ 36%]
tests/test_file_system_cache.py::TestFileSystemCache::test_inc_dec[CustomHashingMethodCache] PASSED [ 36%]
tests/test_file_system_cache.py::TestFileSystemCache::test_inc_dec[CustomDefaultHashingMethodCache] PASSED [ 37%]
tests/test_file_system_cache.py::TestFileSystemCache::test_expiration[FileSystemCache] PASSED [ 38%]
tests/test_file_system_cache.py::TestFileSystemCache::test_expiration[CustomSerializerCache] PASSED [ 39%]
tests/test_file_system_cache.py::TestFileSystemCache::test_expiration[CustomHashingMethodCache] PASSED [ 39%]
tests/test_file_system_cache.py::TestFileSystemCache::test_expiration[CustomDefaultHashingMethodCache] PASSED [ 40%]
tests/test_file_system_cache.py::TestFileSystemCache::test_EOFError[FileSystemCache] PASSED [ 41%]
tests/test_file_system_cache.py::TestFileSystemCache::test_EOFError[CustomSerializerCache] PASSED [ 42%]
tests/test_file_system_cache.py::TestFileSystemCache::test_EOFError[CustomHashingMethodCache] PASSED [ 42%]
tests/test_file_system_cache.py::TestFileSystemCache::test_EOFError[CustomDefaultHashingMethodCache] PASSED [ 43%]
tests/test_file_system_cache.py::TestFileSystemCache::test_threshold[FileSystemCache] PASSED [ 44%]
tests/test_file_system_cache.py::TestFileSystemCache::test_threshold[CustomSerializerCache] PASSED [ 44%]
tests/test_file_system_cache.py::TestFileSystemCache::test_threshold[CustomHashingMethodCache] PASSED [ 45%]
tests/test_file_system_cache.py::TestFileSystemCache::test_threshold[CustomDefaultHashingMethodCache] PASSED [ 46%]
tests/test_file_system_cache.py::TestFileSystemCache::test_file_counting[FileSystemCache] PASSED [ 47%]
tests/test_file_system_cache.py::TestFileSystemCache::test_file_counting[CustomSerializerCache] PASSED [ 47%]
tests/test_file_system_cache.py::TestFileSystemCache::test_file_counting[CustomHashingMethodCache] PASSED [ 48%]
tests/test_file_system_cache.py::TestFileSystemCache::test_file_counting[CustomDefaultHashingMethodCache] PASSED [ 49%]
tests/test_file_system_cache.py::TestFileSystemCache::test_file_counting_on_override[FileSystemCache] PASSED [ 50%]
tests/test_file_system_cache.py::TestFileSystemCache::test_file_counting_on_override[CustomSerializerCache] PASSED [ 50%]
tests/test_file_system_cache.py::TestFileSystemCache::test_file_counting_on_override[CustomHashingMethodCache] PASSED [ 51%]
tests/test_file_system_cache.py::TestFileSystemCache::test_file_counting_on_override[CustomDefaultHashingMethodCache] PASSED [ 52%]
tests/test_file_system_cache.py::TestFileSystemCache::test_prune_old_entries[FileSystemCache] PASSED [ 52%]
tests/test_file_system_cache.py::TestFileSystemCache::test_prune_old_entries[CustomSerializerCache] PASSED [ 53%]
tests/test_file_system_cache.py::TestFileSystemCache::test_prune_old_entries[CustomHashingMethodCache] PASSED [ 54%]
tests/test_file_system_cache.py::TestFileSystemCache::test_prune_old_entries[CustomDefaultHashingMethodCache] PASSED [ 55%]
tests/test_interface_uniformity.py::TestInterfaceUniformity::test_types_have_all_base_methods ERROR [ 55%]
tests/test_memcached_cache.py::TestMemcachedCache::test_has FAILED       [ 56%]
tests/test_memcached_cache.py::TestMemcachedCache::test_clear FAILED     [ 57%]
tests/test_memcached_cache.py::TestMemcachedCache::test_set_get FAILED   [ 57%]
tests/test_memcached_cache.py::TestMemcachedCache::test_set_get_many FAILED [ 58%]
tests/test_memcached_cache.py::TestMemcachedCache::test_get_dict FAILED  [ 59%]
tests/test_memcached_cache.py::TestMemcachedCache::test_delete FAILED    [ 60%]
tests/test_memcached_cache.py::TestMemcachedCache::test_delete_many FAILED [ 60%]
tests/test_memcached_cache.py::TestMemcachedCache::test_delete_many_ignore_errors FAILED [ 61%]
tests/test_memcached_cache.py::TestMemcachedCache::test_add FAILED       [ 62%]
tests/test_memcached_cache.py::TestMemcachedCache::test_inc_dec FAILED   [ 63%]
tests/test_memcached_cache.py::TestMemcachedCache::test_expiration FAILED [ 63%]
tests/test_redis_cache.py::TestRedisCache::test_has[RedisCache] PASSED   [ 64%]
tests/test_redis_cache.py::TestRedisCache::test_has[CustomCache] PASSED  [ 65%]
tests/test_redis_cache.py::TestRedisCache::test_clear[RedisCache] PASSED [ 65%]
tests/test_redis_cache.py::TestRedisCache::test_clear[CustomCache] PASSED [ 66%]
tests/test_redis_cache.py::TestRedisCache::test_set_get[RedisCache] PASSED [ 67%]
tests/test_redis_cache.py::TestRedisCache::test_set_get[CustomCache] PASSED [ 68%]
tests/test_redis_cache.py::TestRedisCache::test_set_get_many[RedisCache] PASSED [ 68%]
tests/test_redis_cache.py::TestRedisCache::test_set_get_many[CustomCache] PASSED [ 69%]
tests/test_redis_cache.py::TestRedisCache::test_get_dict[RedisCache] PASSED [ 70%]
tests/test_redis_cache.py::TestRedisCache::test_get_dict[CustomCache] PASSED [ 71%]
tests/test_redis_cache.py::TestRedisCache::test_delete[RedisCache] PASSED [ 71%]
tests/test_redis_cache.py::TestRedisCache::test_delete[CustomCache] PASSED [ 72%]
tests/test_redis_cache.py::TestRedisCache::test_delete_many[RedisCache] PASSED [ 73%]
tests/test_redis_cache.py::TestRedisCache::test_delete_many[CustomCache] PASSED [ 73%]
tests/test_redis_cache.py::TestRedisCache::test_delete_many_ignore_errors[RedisCache] PASSED [ 74%]
tests/test_redis_cache.py::TestRedisCache::test_delete_many_ignore_errors[CustomCache] PASSED [ 75%]
tests/test_redis_cache.py::TestRedisCache::test_add[RedisCache] PASSED   [ 76%]
tests/test_redis_cache.py::TestRedisCache::test_add[CustomCache] PASSED  [ 76%]
tests/test_redis_cache.py::TestRedisCache::test_inc_dec[RedisCache] PASSED [ 77%]
tests/test_redis_cache.py::TestRedisCache::test_inc_dec[CustomCache] PASSED [ 78%]
tests/test_redis_cache.py::TestRedisCache::test_expiration[RedisCache] PASSED [ 78%]
tests/test_redis_cache.py::TestRedisCache::test_expiration[CustomCache] PASSED [ 79%]
tests/test_redis_cache.py::TestRedisCache::test_callable_key[RedisCache] PASSED [ 80%]
tests/test_redis_cache.py::TestRedisCache::test_callable_key[CustomCache] PASSED [ 81%]
tests/test_simple_cache.py::TestSimpleCache::test_clear[SimpleCache] PASSED [ 81%]
tests/test_simple_cache.py::TestSimpleCache::test_clear[CustomCache] PASSED [ 82%]
tests/test_simple_cache.py::TestSimpleCache::test_has[SimpleCache] PASSED [ 83%]
tests/test_simple_cache.py::TestSimpleCache::test_has[CustomCache] PASSED [ 84%]
tests/test_simple_cache.py::TestSimpleCache::test_set_get[SimpleCache] PASSED [ 84%]
tests/test_simple_cache.py::TestSimpleCache::test_set_get[CustomCache] PASSED [ 85%]
tests/test_simple_cache.py::TestSimpleCache::test_set_get_many[SimpleCache] PASSED [ 86%]
tests/test_simple_cache.py::TestSimpleCache::test_set_get_many[CustomCache] PASSED [ 86%]
tests/test_simple_cache.py::TestSimpleCache::test_get_dict[SimpleCache] PASSED [ 87%]
tests/test_simple_cache.py::TestSimpleCache::test_get_dict[CustomCache] PASSED [ 88%]
tests/test_simple_cache.py::TestSimpleCache::test_delete[SimpleCache] PASSED [ 89%]
tests/test_simple_cache.py::TestSimpleCache::test_delete[CustomCache] PASSED [ 89%]
tests/test_simple_cache.py::TestSimpleCache::test_delete_many[SimpleCache] PASSED [ 90%]
tests/test_simple_cache.py::TestSimpleCache::test_delete_many[CustomCache] PASSED [ 91%]
tests/test_simple_cache.py::TestSimpleCache::test_delete_many_ignore_errors[SimpleCache] PASSED [ 92%]
tests/test_simple_cache.py::TestSimpleCache::test_delete_many_ignore_errors[CustomCache] PASSED [ 92%]
tests/test_simple_cache.py::TestSimpleCache::test_add[SimpleCache] PASSED [ 93%]
tests/test_simple_cache.py::TestSimpleCache::test_add[CustomCache] PASSED [ 94%]
tests/test_simple_cache.py::TestSimpleCache::test_inc_dec[SimpleCache] PASSED [ 94%]
tests/test_simple_cache.py::TestSimpleCache::test_inc_dec[CustomCache] PASSED [ 95%]
tests/test_simple_cache.py::TestSimpleCache::test_expiration[SimpleCache] PASSED [ 96%]
tests/test_simple_cache.py::TestSimpleCache::test_expiration[CustomCache] PASSED [ 97%]
tests/test_simple_cache.py::TestSimpleCache::test_threshold[SimpleCache] PASSED [ 97%]
tests/test_simple_cache.py::TestSimpleCache::test_threshold[CustomCache] PASSED [ 98%]
tests/test_simple_cache.py::TestSimpleCache::test_prune_old_entries[SimpleCache] PASSED [ 99%]
tests/test_simple_cache.py::TestSimpleCache::test_prune_old_entries[CustomCache] PASSED [100%]

==================================== ERRORS ====================================
__ ERROR at setup of TestInterfaceUniformity.test_types_have_all_base_methods __

cls = <class '_pytest.runner.CallInfo'>
func = <function call_runtest_hook.<locals>.<lambda> at 0x7fb3569d1e40>
when = 'setup'
reraise = (<class '_pytest.outcomes.Exit'>, <class 'KeyboardInterrupt'>)

    @classmethod
    def from_call(
        cls,
        func: "Callable[[], TResult]",
        when: "Literal['collect', 'setup', 'call', 'teardown']",
        reraise: Optional[
            Union[Type[BaseException], Tuple[Type[BaseException], ...]]
        ] = None,
    ) -> "CallInfo[TResult]":
        """Call func, wrapping the result in a CallInfo.
    
        :param func:
            The function to call. Called without arguments.
        :param when:
            The phase in which the function is called.
        :param reraise:
            Exception or exceptions that shall propagate if raised by the
            function, instead of being wrapped in the CallInfo.
        """
        excinfo = None
        start = timing.time()
        precise_start = timing.perf_counter()
        try:
>           result: Optional[TResult] = func()

/usr/lib/python3.13/site-packages/_pytest/runner.py:341: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
/usr/lib/python3.13/site-packages/_pytest/runner.py:262: in <lambda>
    lambda: ihook(item=item, **kwds), when=when, reraise=reraise
/usr/lib/python3.13/site-packages/pluggy/_hooks.py:493: in __call__
    return self._hookexec(self.name, self._hookimpls, kwargs, firstresult)
/usr/lib/python3.13/site-packages/pluggy/_manager.py:115: in _hookexec
    return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
/usr/lib/python3.13/site-packages/_pytest/unraisableexception.py:83: in pytest_runtest_setup
    yield from unraisable_exception_runtest_hook()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    def unraisable_exception_runtest_hook() -> Generator[None, None, None]:
        with catch_unraisable_exception() as cm:
            yield
            if cm.unraisable:
                if cm.unraisable.err_msg is not None:
                    err_msg = cm.unraisable.err_msg
                else:
                    err_msg = "Exception ignored in"
                msg = f"{err_msg}: {cm.unraisable.object!r}\n\n"
                msg += "".join(
                    traceback.format_exception(
                        cm.unraisable.exc_type,
                        cm.unraisable.exc_value,
                        cm.unraisable.exc_traceback,
                    )
                )
>               warnings.warn(pytest.PytestUnraisableExceptionWarning(msg))
E               pytest.PytestUnraisableExceptionWarning: Exception ignored in PyMapping_HasKeyString(); consider using PyMapping_HasKeyStringWithError(), PyMapping_GetOptionalItemString() or PyMapping_GetItemString(): None
E               
E               Traceback (most recent call last):
E                 File "/usr/lib64/python3.13/site-packages/pylibmc/client.py", line 142, in __init__
E                   super().__init__(servers=translate_server_specs(servers),
E                   ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
E                                    binary=binary,
E                                    ^^^^^^^^^^^^^^
E                                    username=username, password=password,
E                                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
E                                    behaviors=_behaviors_numeric(behaviors))
E                                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
E               TypeError: 'NoneType' object is not subscriptable

/usr/lib/python3.13/site-packages/_pytest/unraisableexception.py:78: PytestUnraisableExceptionWarning
---------------------------- Captured stdout setup -----------------------------
/builddir/build/BUILD/python-cachelib-0.13.0-build/cachelib-0.13.0/.pytest_cache/d/.xprocess/redis$ redis-server --port 6360
process 'redis' started pid=292
292:C 06 Jun 2024 21:25:21.994 # WARNING Memory overcommit must be enabled! Without it, a background save or replication may fail under low memory condition. Being disabled, it can also cause failures without low memory condition, see https://github.com/jemalloc/jemalloc/issues/1328. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.

292:C 06 Jun 2024 21:25:21.994 * oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo

292:C 06 Jun 2024 21:25:21.994 * Redis version=7.2.5, bits=64, commit=00000000, modified=0, pid=292, just started

292:C 06 Jun 2024 21:25:21.994 * Configuration loaded

292:M 06 Jun 2024 21:25:21.995 * monotonic clock: POSIX clock_gettime

292:M 06 Jun 2024 21:25:21.995 * Running mode=standalone, port=6360.

292:M 06 Jun 2024 21:25:21.995 * Server initialized

292:M 06 Jun 2024 21:25:21.995 * Ready to accept connections tcp

redis process startup detected
/builddir/build/BUILD/python-cachelib-0.13.0-build/cachelib-0.13.0/.pytest_cache/d/.xprocess/pylibmc$ memcached -vv
process 'pylibmc' started pid=298
slab class   1: chunk size        96 perslab   10922

slab class   2: chunk size       120 perslab    8738

slab class   3: chunk size       152 perslab    6898

slab class   4: chunk size       192 perslab    5461

slab class   5: chunk size       240 perslab    4369

slab class   6: chunk size       304 perslab    3449

slab class   7: chunk size       384 perslab    2730

slab class   8: chunk size       480 perslab    2184

slab class   9: chunk size       600 perslab    1747

slab class  10: chunk size       752 perslab    1394

slab class  11: chunk size       944 perslab    1110

slab class  12: chunk size      1184 perslab     885

slab class  13: chunk size      1480 perslab     708

slab class  14: chunk size      1856 perslab     564

slab class  15: chunk size      2320 perslab     451

slab class  16: chunk size      2904 perslab     361

slab class  17: chunk size      3632 perslab     288

slab class  18: chunk size      4544 perslab     230

slab class  19: chunk size      5680 perslab     184

slab class  20: chunk size      7104 perslab     147

slab class  21: chunk size      8880 perslab     118

slab class  22: chunk size     11104 perslab      94

slab class  23: chunk size     13880 perslab      75

slab class  24: chunk size     17352 perslab      60

slab class  25: chunk size     21696 perslab      48

slab class  26: chunk size     27120 perslab      38

slab class  27: chunk size     33904 perslab      30

slab class  28: chunk size     42384 perslab      24

slab class  29: chunk size     52984 perslab      19

slab class  30: chunk size     66232 perslab      15

slab class  31: chunk size     82792 perslab      12

slab class  32: chunk size    103496 perslab      10

slab class  33: chunk size    129376 perslab       8

slab class  34: chunk size    161720 perslab       6

slab class  35: chunk size    202152 perslab       5

slab class  36: chunk size    252696 perslab       4

slab class  37: chunk size    315872 perslab       3

slab class  38: chunk size    394840 perslab       2

slab class  39: chunk size    524288 perslab       2

<26 server listening (auto-negotiate)

pylibmc process startup detected
=================================== FAILURES ===================================
_________________________ TestMemcachedCache.test_has __________________________

cls = <class '_pytest.runner.CallInfo'>
func = <function call_runtest_hook.<locals>.<lambda> at 0x7fb35634b920>
when = 'call'
reraise = (<class '_pytest.outcomes.Exit'>, <class 'KeyboardInterrupt'>)

    @classmethod
    def from_call(
        cls,
        func: "Callable[[], TResult]",
        when: "Literal['collect', 'setup', 'call', 'teardown']",
        reraise: Optional[
            Union[Type[BaseException], Tuple[Type[BaseException], ...]]
        ] = None,
    ) -> "CallInfo[TResult]":
        """Call func, wrapping the result in a CallInfo.
    
        :param func:
            The function to call. Called without arguments.
        :param when:
            The phase in which the function is called.
        :param reraise:
            Exception or exceptions that shall propagate if raised by the
            function, instead of being wrapped in the CallInfo.
        """
        excinfo = None
        start = timing.time()
        precise_start = timing.perf_counter()
        try:
>           result: Optional[TResult] = func()

/usr/lib/python3.13/site-packages/_pytest/runner.py:341: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
/usr/lib/python3.13/site-packages/_pytest/runner.py:262: in <lambda>
    lambda: ihook(item=item, **kwds), when=when, reraise=reraise
/usr/lib/python3.13/site-packages/pluggy/_hooks.py:493: in __call__
    return self._hookexec(self.name, self._hookimpls, kwargs, firstresult)
/usr/lib/python3.13/site-packages/pluggy/_manager.py:115: in _hookexec
    return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
/usr/lib/python3.13/site-packages/_pytest/unraisableexception.py:88: in pytest_runtest_call
    yield from unraisable_exception_runtest_hook()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    def unraisable_exception_runtest_hook() -> Generator[None, None, None]:
        with catch_unraisable_exception() as cm:
            yield
            if cm.unraisable:
                if cm.unraisable.err_msg is not None:
                    err_msg = cm.unraisable.err_msg
                else:
                    err_msg = "Exception ignored in"
                msg = f"{err_msg}: {cm.unraisable.object!r}\n\n"
                msg += "".join(
                    traceback.format_exception(
                        cm.unraisable.exc_type,
                        cm.unraisable.exc_value,
                        cm.unraisable.exc_traceback,
                    )
                )
>               warnings.warn(pytest.PytestUnraisableExceptionWarning(msg))
E               pytest.PytestUnraisableExceptionWarning: Exception ignored in PyMapping_HasKeyString(); consider using PyMapping_HasKeyStringWithError(), PyMapping_GetOptionalItemString() or PyMapping_GetItemString(): None
E               
E               Traceback (most recent call last):
E                 File "/usr/lib64/python3.13/site-packages/pylibmc/client.py", line 142, in __init__
E                   super().__init__(servers=translate_server_specs(servers),
E                   ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
E                                    binary=binary,
E                                    ^^^^^^^^^^^^^^
E                                    username=username, password=password,
E                                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
E                                    behaviors=_behaviors_numeric(behaviors))
E                                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
E               TypeError: 'NoneType' object is not subscriptable

/usr/lib/python3.13/site-packages/_pytest/unraisableexception.py:78: PytestUnraisableExceptionWarning
---------------------------- Captured stdout setup -----------------------------
/builddir/build/BUILD/python-cachelib-0.13.0-build/cachelib-0.13.0/.pytest_cache/d/.xprocess/pylibmc$ memcached -vv
process 'pylibmc' started pid=318
slab class   1: chunk size        96 perslab   10922

slab class   2: chunk size       120 perslab    8738

slab class   3: chunk size       152 perslab    6898

slab class   4: chunk size       192 perslab    5461

slab class   5: chunk size       240 perslab    4369

slab class   6: chunk size       304 perslab    3449

slab class   7: chunk size       384 perslab    2730

slab class   8: chunk size       480 perslab    2184

slab class   9: chunk size       600 perslab    1747

slab class  10: chunk size       752 perslab    1394

slab class  11: chunk size       944 perslab    1110

slab class  12: chunk size      1184 perslab     885

slab class  13: chunk size      1480 perslab     708

slab class  14: chunk size      1856 perslab     564

slab class  15: chunk size      2320 perslab     451

slab class  16: chunk size      2904 perslab     361

slab class  17: chunk size      3632 perslab     288

slab class  18: chunk size      4544 perslab     230

slab class  19: chunk size      5680 perslab     184

slab class  20: chunk size      7104 perslab     147

slab class  21: chunk size      8880 perslab     118

slab class  22: chunk size     11104 perslab      94

slab class  23: chunk size     13880 perslab      75

slab class  24: chunk size     17352 perslab      60

slab class  25: chunk size     21696 perslab      48

slab class  26: chunk size     27120 perslab      38

slab class  27: chunk size     33904 perslab      30

slab class  28: chunk size     42384 perslab      24

slab class  29: chunk size     52984 perslab      19

slab class  30: chunk size     66232 perslab      15

slab class  31: chunk size     82792 perslab      12

slab class  32: chunk size    103496 perslab      10

slab class  33: chunk size    129376 perslab       8

slab class  34: chunk size    161720 perslab       6

slab class  35: chunk size    202152 perslab       5

slab class  36: chunk size    252696 perslab       4

slab class  37: chunk size    315872 perslab       3

slab class  38: chunk size    394840 perslab       2

slab class  39: chunk size    524288 perslab       2

<26 server listening (auto-negotiate)

pylibmc process startup detected

detailed build log: https://copr-be.cloud.fedoraproject.org/results/%40python/python3.13/fedora-rawhide-x86_64/07545359-python-cachelib/builder-live.log.gz

https://bugzilla.redhat.com/show_bug.cgi?id=2251780

Environment:

  • Python version: Python 3.13
  • CacheLib version: 0.13.0
hroncok added a commit to hroncok/pylibmc that referenced this issue Jul 3, 2024
PyMapping_HasKeyString does not work on None
Accidentally, it used to return false result on silent errors.

Since Python 3.13, this is what happens instead:

    >>> import pylibmc
    >>> m = pylibmc.Client(["10.0.0.1"], binary=True)
    Exception ignored in PyMapping_HasKeyString(); consider using PyMapping_HasKeyStringWithError(), PyMapping_GetOptionalItemString() or PyMapping_GetItemString():
    Traceback (most recent call last):
      File "/usr/lib64/python3.13/site-packages/pylibmc/client.py", line 142, in __init__
        super().__init__(servers=translate_server_specs(servers),
    TypeError: 'NoneType' object is not subscriptable
    ...
    Exception ignored in PyMapping_HasKeyString(); consider using PyMapping_HasKeyStringWithError(), PyMapping_GetOptionalItemString() or PyMapping_GetItemString():
    Traceback (most recent call last):
      File "/usr/lib64/python3.13/site-packages/pylibmc/client.py", line 142, in __init__
        super().__init__(servers=translate_server_specs(servers),
    TypeError: 'NoneType' object is not subscriptable

When this is run via pytest, it leads to:

    pytest.PytestUnraisableExceptionWarning: Exception ignored in PyMapping_HasKeyString(); consider using PyMapping_HasKeyStringWithError(), PyMapping_GetOptionalItemString() or PyMapping_GetItemString(): None

Fixes pallets-eco/cachelib#400
@hroncok hroncok linked a pull request Jul 3, 2024 that will close this issue
@hroncok
Copy link

hroncok commented Jul 3, 2024

I belive this should fix it: lericson/pylibmc#292

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Development

Successfully merging a pull request may close this issue.

2 participants