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

test_stress_different_keys_threadsafe hangs when run on a single core #107

Closed
bdrung opened this issue Sep 1, 2023 · 1 comment · Fixed by #108
Closed

test_stress_different_keys_threadsafe hangs when run on a single core #107

bdrung opened this issue Sep 1, 2023 · 1 comment · Fixed by #108
Assignees

Comments

@bdrung
Copy link

bdrung commented Sep 1, 2023

Running the test case test_stress_different_keys_threadsafe on just one core causes the test case to hang:

$ taskset -c 0 python3 -m pytest --pyargs zict
============================= test session starts ==============================
platform linux -- Python 3.11.5, pytest-7.4.0, pluggy-1.2.0 -- /usr/bin/python3.11
cachedir: .pytest_cache
rootdir: /tmp/autopkgtest.r5brBZ/autopkgtest_tmp
configfile: setup.cfg
plugins: timeout-2.1.0
timeout: 180.0s
timeout method: thread
timeout func_only: False
collecting ... collected 539 items

[...]
tests/test_lru.py::test_stress_different_keys_threadsafe 
+++++++++++++++++++++++++++++++++++ Timeout ++++++++++++++++++++++++++++++++++++

~~~~~~~~~~~~~ Stack of ThreadPoolExecutor-174_1 (140600758003392) ~~~~~~~~~~~~~~
  File "/usr/lib/python3.11/threading.py", line 995, in _bootstrap
    self._bootstrap_inner()
  File "/usr/lib/python3.11/threading.py", line 1038, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.11/threading.py", line 975, in run
    self._target(*self._args, **self._kwargs)
  File "/usr/lib/python3.11/concurrent/futures/thread.py", line 83, in _worker
    work_item.run()
  File "/usr/lib/python3.11/concurrent/futures/thread.py", line 58, in run
    result = self.fn(*self.args, **self.kwargs)
  File "/usr/lib/python3/dist-packages/zict/tests/utils_test.py", line 173, in worker
    z[key] = value
  File "/usr/lib/python3/dist-packages/zict/lru.py", line 138, in __setitem__
    self.evict_until_below_target()
  File "/usr/lib/python3/dist-packages/zict/lru.py", line 180, in evict_until_below_target
    self.evict()
  File "/usr/lib/python3/dist-packages/zict/common.py", line 127, in wrapper
    return func(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/zict/lru.py", line 224, in evict
    with self.unlock():
  File "/usr/lib/python3.11/contextlib.py", line 144, in __exit__
    next(self.gen)
  File "/usr/lib/python3/dist-packages/zict/common.py", line 91, in unlock
    self.lock.acquire()

~~~~~~~~~~~~~ Stack of ThreadPoolExecutor-174_0 (140600766428864) ~~~~~~~~~~~~~~
  File "/usr/lib/python3.11/threading.py", line 995, in _bootstrap
    self._bootstrap_inner()
  File "/usr/lib/python3.11/threading.py", line 1038, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.11/threading.py", line 975, in run
    self._target(*self._args, **self._kwargs)
  File "/usr/lib/python3.11/concurrent/futures/thread.py", line 83, in _worker
    work_item.run()
  File "/usr/lib/python3.11/concurrent/futures/thread.py", line 58, in run
    result = self.fn(*self.args, **self.kwargs)
  File "/usr/lib/python3/dist-packages/zict/tests/utils_test.py", line 173, in worker
    z[key] = value
  File "/usr/lib/python3/dist-packages/zict/lru.py", line 138, in __setitem__
    self.evict_until_below_target()
  File "/usr/lib/python3/dist-packages/zict/lru.py", line 180, in evict_until_below_target
    self.evict()
  File "/usr/lib/python3/dist-packages/zict/common.py", line 127, in wrapper
    return func(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/zict/lru.py", line 184, in evict
    @locked

~~~~~~~~~~~~~~~~~~~~ Stack of MainThread (140600811225152) ~~~~~~~~~~~~~~~~~~~~~
  File "<frozen runpy>", line 198, in _run_module_as_main
  File "<frozen runpy>", line 88, in _run_code
  File "/usr/lib/python3/dist-packages/pytest/__main__.py", line 5, in <module>
    raise SystemExit(pytest.console_main())
  File "/usr/lib/python3/dist-packages/_pytest/config/__init__.py", line 189, in console_main
    code = main()
  File "/usr/lib/python3/dist-packages/_pytest/config/__init__.py", line 166, in main
    ret: Union[ExitCode, int] = config.hook.pytest_cmdline_main(
  File "/usr/lib/python3/dist-packages/pluggy/_hooks.py", line 433, in __call__
    return self._hookexec(self.name, self._hookimpls, kwargs, firstresult)
  File "/usr/lib/python3/dist-packages/pluggy/_manager.py", line 112, in _hookexec
    return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
  File "/usr/lib/python3/dist-packages/pluggy/_callers.py", line 80, in _multicall
    res = hook_impl.function(*args)
  File "/usr/lib/python3/dist-packages/_pytest/main.py", line 317, in pytest_cmdline_main
    return wrap_session(config, _main)
  File "/usr/lib/python3/dist-packages/_pytest/main.py", line 270, in wrap_session
    session.exitstatus = doit(config, session) or 0
  File "/usr/lib/python3/dist-packages/_pytest/main.py", line 324, in _main
    config.hook.pytest_runtestloop(session=session)
  File "/usr/lib/python3/dist-packages/pluggy/_hooks.py", line 433, in __call__
    return self._hookexec(self.name, self._hookimpls, kwargs, firstresult)
  File "/usr/lib/python3/dist-packages/pluggy/_manager.py", line 112, in _hookexec
    return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
  File "/usr/lib/python3/dist-packages/pluggy/_callers.py", line 80, in _multicall
    res = hook_impl.function(*args)
  File "/usr/lib/python3/dist-packages/_pytest/main.py", line 349, in pytest_runtestloop
    item.config.hook.pytest_runtest_protocol(item=item, nextitem=nextitem)
  File "/usr/lib/python3/dist-packages/pluggy/_hooks.py", line 433, in __call__
    return self._hookexec(self.name, self._hookimpls, kwargs, firstresult)
  File "/usr/lib/python3/dist-packages/pluggy/_manager.py", line 112, in _hookexec
    return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
  File "/usr/lib/python3/dist-packages/pluggy/_callers.py", line 80, in _multicall
    res = hook_impl.function(*args)
  File "/usr/lib/python3/dist-packages/_pytest/runner.py", line 114, in pytest_runtest_protocol
    runtestprotocol(item, nextitem=nextitem)
  File "/usr/lib/python3/dist-packages/_pytest/runner.py", line 133, in runtestprotocol
    reports.append(call_and_report(item, "call", log))
  File "/usr/lib/python3/dist-packages/_pytest/runner.py", line 222, in call_and_report
    call = call_runtest_hook(item, when, **kwds)
  File "/usr/lib/python3/dist-packages/_pytest/runner.py", line 261, in call_runtest_hook
    return CallInfo.from_call(
  File "/usr/lib/python3/dist-packages/_pytest/runner.py", line 341, in from_call
    result: Optional[TResult] = func()
  File "/usr/lib/python3/dist-packages/_pytest/runner.py", line 262, in <lambda>
    lambda: ihook(item=item, **kwds), when=when, reraise=reraise
  File "/usr/lib/python3/dist-packages/pluggy/_hooks.py", line 433, in __call__
    return self._hookexec(self.name, self._hookimpls, kwargs, firstresult)
  File "/usr/lib/python3/dist-packages/pluggy/_manager.py", line 112, in _hookexec
    return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
  File "/usr/lib/python3/dist-packages/pluggy/_callers.py", line 80, in _multicall
    res = hook_impl.function(*args)
  File "/usr/lib/python3/dist-packages/_pytest/runner.py", line 169, in pytest_runtest_call
    item.runtest()
  File "/usr/lib/python3/dist-packages/_pytest/python.py", line 1788, in runtest
    self.ihook.pytest_pyfunc_call(pyfuncitem=self)
  File "/usr/lib/python3/dist-packages/pluggy/_hooks.py", line 433, in __call__
    return self._hookexec(self.name, self._hookimpls, kwargs, firstresult)
  File "/usr/lib/python3/dist-packages/pluggy/_manager.py", line 112, in _hookexec
    return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
  File "/usr/lib/python3/dist-packages/pluggy/_callers.py", line 80, in _multicall
    res = hook_impl.function(*args)
  File "/usr/lib/python3/dist-packages/_pytest/python.py", line 194, in pytest_pyfunc_call
    result = testfunction(**testargs)
  File "/usr/lib/python3/dist-packages/zict/tests/test_lru.py", line 440, in test_stress_different_keys_threadsafe
    utils_test.check_different_keys_threadsafe(lru, allow_keyerror=True)
  File "/usr/lib/python3/dist-packages/zict/tests/utils_test.py", line 193, in check_different_keys_threadsafe
    f1.result()
  File "/usr/lib/python3.11/concurrent/futures/_base.py", line 451, in result
    self._condition.wait(timeout)
  File "/usr/lib/python3.11/threading.py", line 320, in wait
    waiter.acquire()

+++++++++++++++++++++++++++++++++++ Timeout ++++++++++++++++++++++++++++++++++++

Ubuntu bug: https://bugs.launchpad.net/ubuntu/+source/zict/+bug/2033759

Environment:

  • Zict version: 3.0.0-2
  • Python version: 3.11.5
  • Operating System: Ubuntu 23.10 (mantic)
  • Install method (conda, pip, source): Debian package
@jrbourbeau
Copy link
Member

cc @crusaderky

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

Successfully merging a pull request may close this issue.

3 participants