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

[Tests] Timeout in Windows GUI tests #7132

Closed
drew2a opened this issue Oct 31, 2022 · 4 comments · Fixed by #7141
Closed

[Tests] Timeout in Windows GUI tests #7132

drew2a opened this issue Oct 31, 2022 · 4 comments · Fixed by #7141

Comments

@drew2a
Copy link
Contributor

drew2a commented Oct 31, 2022

https://github.com/Tribler/tribler/actions/runs/3363436019/jobs/5576574735 in #7129

============================= test session starts =============================
platform win32 -- Python 3.8.10, pytest-7.1.2, pluggy-1.0.0 -- c:\users\runneradmin\.virtualenvs\.venv\scripts\python.exe
cachedir: .pytest_cache
Using --randomly-seed=1
rootdir: D:\a\tribler\tribler, configfile: pytest.ini
plugins: anyio-3.3.4, Faker-14.1.0, looptime-0.2, aiohttp-1.0.4, asyncio-0.18.3, freezegun-0.4.2, mock-3.7.0, profiling-1.7.0, randomly-3.11.0, timeout-2.1.0
asyncio: mode=auto
timeout: 300.0s
timeout method: thread
timeout func_only: False
collecting ... collected 47 items

src/tribler/gui/tests/test_core_manager.py::test_on_core_finished_raises_error PASSED [  2%]
src/tribler/gui/tests/test_core_manager.py::test_decode_raw_core_output PASSED [  4%]
src/tribler/gui/tests/test_core_manager.py::test_on_core_read_ready_os_error_suppressed PASSED [  6%]
src/tribler/gui/tests/test_core_manager.py::test_format_error_message PASSED [  8%]
src/tribler/gui/tests/test_core_manager.py::test_on_core_finished_calls_quit_application PASSED [ 10%]
src/tribler/gui/tests/test_core_manager.py::test_on_core_stdout_read_ready PASSED [ 12%]
src/tribler/gui/tests/test_core_manager.py::test_on_core_stderr_read_ready PASSED [ 14%]
src/tribler/gui/tests/test_error_handler.py::test_gui_info_type_in_handled_exceptions PASSED [ 17%]
src/tribler/gui/tests/test_error_handler.py::test_core_should_stop PASSED [ 19%]
src/tribler/gui/tests/test_error_handler.py::test_core_error PASSED      [ 21%]
src/tribler/gui/tests/test_error_handler.py::test_gui_core_connect_timeout_error PASSED [ 23%]
src/tribler/gui/tests/test_error_handler.py::test_gui_error_suppressed PASSED [ 25%]
src/tribler/gui/tests/test_error_handler.py::test_gui_error_tribler_stopped PASSED [ 27%]
src/tribler/gui/tests/test_error_handler.py::test_gui_core_crashed_error PASSED [ 29%]
src/tribler/gui/tests/test_error_handler.py::test_gui_is_not_core_exception PASSED [ 31%]
src/tribler/gui/tests/test_error_handler.py::test_core_info_type_in_handled_exceptions PASSED [ 34%]
src/tribler/gui/tests/test_util.py::test_compose_magnetlink PASSED       [ 36%]
src/tribler/gui/tests/test_util.py::test_quote_plus_unicode_char PASSED  [ 38%]
src/tribler/gui/tests/test_util.py::test_is_dict_has PASSED              [ 40%]
src/tribler/gui/tests/test_util.py::test_create_api_key PASSED           [ 42%]
src/tribler/gui/tests/test_util.py::test_quoter_unichar PASSED           [ 44%]
src/tribler/gui/tests/test_util.py::test_quoter_reserved PASSED          [ 46%]
src/tribler/gui/tests/test_util.py::test_quote_plus_unicode_reserved PASSED [ 48%]
src/tribler/gui/tests/test_util.py::test_format_api_key PASSED           [ 51%]
src/tribler/gui/tests/test_util.py::test_quoter_char PASSED              [ 53%]
src/tribler/gui/tests/test_util.py::test_set_api_key PASSED              [ 55%]
src/tribler/gui/tests/test_util.py::test_quote_plus_unicode_unichar PASSED [ 57%]
src/tribler/gui/tests/test_util.py::test_quote_plus_unicode_compound PASSED [ 59%]

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

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Captured stdout ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
INFO:__main__:Run Tribler: Namespace(allow_code_injection=False, chant_testnet=False, core=True, gui_test_mode=True, testnet=False, torrent='', trace_debug=False, trace_exception=False, trustchain_testnet=False, tunnel_testnet=False)

INFO:__main__:Root state dir: C:\Users\runneradmin\AppData\Local\Temp\pytest-of-runneradmin\pytest-0\tribler_state_dir0
INFO:__main__:Sentry has been initialised in normal mode

INFO:tribler.core.start_core:Running Core in gui_test_mode

INFO:tribler.core.logger.logger:Load logger config: app_mode=tribler-core, config_path=D:\a\tribler\tribler\src\tribler\core\logger\logger.yaml, dir=C:\Users\runneradmin\AppData\Local\Temp\pytest-of-runneradmin\pytest-0\tribler_state_dir0
[PID:6212] 2022-10-31 17:44:05,674 - INFO - tribler.core.logger.logger(64) - Config loaded for app_mode=tribler-core

[PID:6212] 2022-10-31 17:44:05,674 - INFO - ProcessChecker(38) - Lock file: C:\Users\runneradmin\AppData\Local\Temp\pytest-of-runneradmin\pytest-0\tribler_state_dir0\triblerd.lock

[PID:6212] 2022-10-31 17:44:05,674 - INFO - ProcessChecker(42) - Check

[PID:6212] 2022-10-31 17:44:05,674 - INFO - ProcessChecker(85) - Get PID from the lock file

[PID:6212] 2022-10-31 17:44:05,674 - WARNING - ProcessChecker(91) - [Errno 2] No such file or directory: 'C:\\Users\\runneradmin\\AppData\\Local\\Temp\\pytest-of-runneradmin\\pytest-0\\tribler_state_dir0\\triblerd.lock'
[PID:6212] 2022-10-31 17:44:05,830 - INFO - ProcessChecker(98) - Check process cmd: c:\hostedtoolcache\windows\python\3.8.10\x64\python.exed:\a\tribler\tribler\src\run_tribler.py--core--gui-test-mode

[PID:6212] 2022-10-31 17:44:05,830 - INFO - ProcessChecker(110) - Result: False (has_keyword=True, pid_is_exists=True, pid_is_correct=False)

[PID:6212] 2022-10-31 17:44:05,830 - INFO - ProcessChecker(64) - Create the lock file

[PID:6212] 2022-10-31 17:44:05,830 - INFO - Tribler Config(86) - Init. State dir: C:\Users\runneradmin\AppData\Local\Temp\pytest-of-runneradmin\pytest-0\tribler_state_dir0. File: C:\Users\runneradmin\AppData\Local\Temp\pytest-of-runneradmin\pytest-0\tribler_state_dir0\triblerd.conf

[PID:6212] 2022-10-31 17:44:05,830 - INFO - TriblerVersion(111) - Files to copy: ['ec_multichain.pem', 'ecpub_multichain.pem', 'secondary_key.pem', 'ec_trustchain_testnet.pem', 'triblerd.conf', 'lt.state']

[PID:6212] 2022-10-31 17:44:05,830 - INFO - Tribler Config(86) - Init. State dir: C:\Users\runneradmin\AppData\Local\Temp\pytest-of-runneradmin\pytest-0\tribler_state_dir0. File: C:\Users\runneradmin\AppData\Local\Temp\pytest-of-runneradmin\pytest-0\tribler_state_dir0\triblerd.conf

[PID:6212] 2022-10-31 17:44:05,830 - INFO - TriblerVersion(111) - Files to copy: ['ec_multichain.pem', 'ecpub_multichain.pem', 'secondary_key.pem', 'ec_trustchain_testnet.pem', 'triblerd.conf', 'lt.state']

[PID:6212] 2022-10-31 17:44:05,830 - INFO - tribler.core.upgrade.version_manager(247) - No previous version found, current Tribler version is 7.12.1-GIT

[PID:6212] 2022-10-31 17:44:05,830 - INFO - tribler.core.start_core(130) - Start tribler core. API port: "20100". API key: "cd191c6a1d85e36c3684bf8cd0c59fb2". State dir: "C:\Users\runneradmin\AppData\Local\Temp\pytest-of-runneradmin\pytest-0\tribler_state_dir0\7.12". Core test mode: "True"

[PID:6212] 2022-10-31 17:44:05,830 - INFO - Tribler Config(100) - Load: C:\Users\runneradmin\AppData\Local\Temp\pytest-of-runneradmin\pytest-0\tribler_state_dir0\7.12\triblerd.conf. State dir: C:\Users\runneradmin\AppData\Local\Temp\pytest-of-runneradmin\pytest-0\tribler_state_dir0\7.12. Reset config on error: True

[PID:6212] 2022-10-31 17:44:05,830 - INFO - Tribler Config(86) - Init. State dir: None. File: None

[PID:6212] 2022-10-31 17:44:05,830 - INFO - Tribler Config(131) - Write: C:\Users\runneradmin\AppData\Local\Temp\pytest-of-runneradmin\pytest-0\tribler_state_dir0\7.12\triblerd.conf

[PID:6212] 2022-10-31 17:44:05,830 - INFO - Tribler Config(139) - Create folder: C:\Users\runneradmin\AppData\Local\Temp\pytest-of-runneradmin\pytest-0\tribler_state_dir0\7.12

[PID:6212] 2022-10-31 17:44:05,830 - INFO - tribler.core.check_os(109) - Check and enable code tracing. Process name: "core". Log dir: "C:\Users\runneradmin\AppData\Local\Temp\pytest-of-runneradmin\pytest-0\tribler_state_dir0\7.12\log"

[PID:6212] 2022-10-31 17:44:05,830 - INFO - ReporterComponent(47) - __init__

[PID:6212] 2022-10-31 17:44:05,830 - INFO - GuiProcessWatcherComponent(47) - __init__

[PID:6212] 2022-10-31 17:44:05,830 - INFO - RESTComponent(47) - __init__

[PID:6212] 2022-10-31 17:44:05,830 - INFO - MetadataStoreComponent(47) - __init__

[PID:6212] 2022-10-31 17:44:05,830 - INFO - Ipv8Component(47) - __init__

[PID:6212] 2022-10-31 17:44:05,830 - INFO - KeyComponent(47) - __init__

[PID:6212] 2022-10-31 17:44:05,830 - INFO - KnowledgeComponent(47) - __init__

[PID:6212] 2022-10-31 17:44:05,830 - INFO - LibtorrentComponent(47) - __init__

[PID:6212] 2022-10-31 17:44:05,830 - INFO - GigaChannelComponent(47) - __init__

[PID:6212] 2022-10-31 17:44:05,830 - INFO - BandwidthAccountingComponent(47) - __init__

[PID:6212] 2022-10-31 17:44:05,830 - INFO - ResourceMonitorComponent(47) - __init__

[PID:6212] 2022-10-31 17:44:05,830 - INFO - tribler.core.start_core(101) - Start tribler core session...

[PID:6212] 2022-10-31 17:44:05,830 - INFO - Session(77) - Start components...

[PID:6212] 2022-10-31 17:44:05,830 - INFO - Session(78) - State directory: "C:\Users\runneradmin\AppData\Local\Temp\pytest-of-runneradmin\pytest-0\tribler_state_dir0\7.12"

[PID:6212] 2022-10-31 17:44:05,830 - INFO - ReporterComponent(59) - Start: ReporterComponent

[PID:6212] 2022-10-31 17:44:05,830 - INFO - GuiProcessWatcherComponent(59) - Start: GuiProcessWatcherComponent

[PID:6212] 2022-10-31 17:44:05,830 - INFO - GuiProcessWatcherComponent(17) - Watching GUI process with pid 2124

[PID:6212] 2022-10-31 17:44:05,830 - INFO - RESTComponent(59) - Start: RESTComponent

[PID:6212] 2022-10-31 17:44:05,830 - INFO - MetadataStoreComponent(59) - Start: MetadataStoreComponent

[PID:6212] 2022-10-31 17:44:05,830 - INFO - Ipv8Component(59) - Start: Ipv8Component

[PID:6212] 2022-10-31 17:44:05,830 - INFO - Ipv8Component(43) - Starting ipv8

[PID:6212] 2022-10-31 17:44:05,830 - INFO - Ipv8Component(44) - Port: 7759. Address: 0.0.0.0

[PID:6212] 2022-10-31 17:44:05,830 - INFO - KeyComponent(59) - Start: KeyComponent
[PID:6212] 2022-10-31 17:44:05,846 - INFO - KnowledgeComponent(59) - Start: KnowledgeComponent

[PID:6212] 2022-10-31 17:44:05,846 - INFO - LibtorrentComponent(59) - Start: LibtorrentComponent

[PID:6212] 2022-10-31 17:44:05,846 - INFO - DownloadManager(235) - Creating a session

[PID:6212] 2022-10-31 17:44:05,846 - INFO - DownloadManager(247) - Dummy mode: True. Hops: 0.

[PID:6212] 2022-10-31 17:44:05,846 - INFO - NetworkUtils(61) - Looking for random free port in range [49152..65[53](https://github.com/Tribler/tribler/actions/runs/3363436019/jobs/5576574735#step:7:54)5]

[PID:6212] 2022-10-31 17:44:05,846 - INFO - NetworkUtils(66) - 59164 is free

[PID:6212] 2022-10-31 17:44:05,846 - INFO - DownloadManager(262) - Libtorrent port: 59164
[PID:6212] 2022-10-31 17:44:05,861 - INFO - DownloadManager(313) - could not load libtorrent state, got exception: FileNotFoundError(2, 'No such file or directory'). starting from scratch

[PID:6212] 2022-10-31 17:44:05,861 - INFO - GigaChannelComponent(59) - Start: GigaChannelComponent

[PID:6212] 2022-10-31 17:44:05,861 - INFO - BandwidthAccountingComponent(59) - Start: BandwidthAccountingComponent

[PID:6212] 2022-10-31 17:44:05,861 - INFO - ResourceMonitorComponent(59) - Start: ResourceMonitorComponent
[PID:6212] 2022-10-31 17:44:06,502 - INFO - DHTDiscoveryCommunity(183) - DHT community initialized (peer mid b'00dba51973314f84e4e0a9998722ed0ed5ee5f16')

[PID:6212] 2022-10-31 17:44:06,502 - INFO - DownloadManager(853) - Load checkpoints...

[PID:6212] 2022-10-31 17:44:06,502 - INFO - DownloadManager(861) - Checkpoints are loaded
[PID:6212] 2022-10-31 17:44:06,565 - INFO - KnowledgeCommunity(13) - Init. Settings: None.

[PID:6212] 2022-10-31 17:44:06,565 - INFO - KnowledgeCommunity(49) - Knowledge community initialized

[PID:6212] 2022-10-31 17:44:06,565 - INFO - KnowledgeRulesProcessor(46) - Start

~~~~~~~~~~~~~~~~~~~~~~~~~~ Stack of MainThread (5848) ~~~~~~~~~~~~~~~~~~~~~~~~~~
  File "C:\hostedtoolcache\windows\Python\3.8.10\x64\lib\runpy.py", line 194, in _run_module_as_main
    return _run_code(code, main_globals, None,
  File "C:\hostedtoolcache\windows\Python\3.8.10\x64\lib\runpy.py", line 87, in _run_code
    exec(code, run_globals)
  File "C:\Users\runneradmin\.virtualenvs\.venv\Scripts\pytest.exe\__main__.py", line 7, in <module>
    sys.exit(console_main())
  File "c:\users\runneradmin\.virtualenvs\.venv\lib\site-packages\_pytest\config\__init__.py", line 187, in console_main
    code = main()
  File "c:\users\runneradmin\.virtualenvs\.venv\lib\site-packages\_pytest\config\__init__.py", line 164, in main
    ret: Union[ExitCode, int] = config.hook.pytest_cmdline_main(
  File "c:\users\runneradmin\.virtualenvs\.venv\lib\site-packages\pluggy\_hooks.py", line 265, in __call__
    return self._hookexec(self.name, self.get_hookimpls(), kwargs, firstresult)
  File "c:\users\runneradmin\.virtualenvs\.venv\lib\site-packages\pluggy\_manager.py", line 80, in _hookexec
    return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
  File "c:\users\runneradmin\.virtualenvs\.venv\lib\site-packages\pluggy\_callers.py", line 39, in _multicall
    res = hook_impl.function(*args)
  File "c:\users\runneradmin\.virtualenvs\.venv\lib\site-packages\_pytest\main.py", line 315, in pytest_cmdline_main
    return wrap_session(config, _main)
  File "c:\users\runneradmin\.virtualenvs\.venv\lib\site-packages\_pytest\main.py", line 268, in wrap_session
    session.exitstatus = doit(config, session) or 0
  File "c:\users\runneradmin\.virtualenvs\.venv\lib\site-packages\_pytest\main.py", line 322, in _main
    config.hook.pytest_runtestloop(session=session)
  File "c:\users\runneradmin\.virtualenvs\.venv\lib\site-packages\pluggy\_hooks.py", line 265, in __call__
    return self._hookexec(self.name, self.get_hookimpls(), kwargs, firstresult)
  File "c:\users\runneradmin\.virtualenvs\.venv\lib\site-packages\pluggy\_manager.py", line 80, in _hookexec
    return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
  File "c:\users\runneradmin\.virtualenvs\.venv\lib\site-packages\pluggy\_callers.py", line 39, in _multicall
    res = hook_impl.function(*args)
  File "c:\users\runneradmin\.virtualenvs\.venv\lib\site-packages\_pytest\main.py", line 347, in pytest_runtestloop
    item.config.hook.pytest_runtest_protocol(item=item, nextitem=nextitem)
  File "c:\users\runneradmin\.virtualenvs\.venv\lib\site-packages\pluggy\_hooks.py", line 265, in __call__
    return self._hookexec(self.name, self.get_hookimpls(), kwargs, firstresult)
  File "c:\users\runneradmin\.virtualenvs\.venv\lib\site-packages\pluggy\_manager.py", line 80, in _hookexec
    return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
  File "c:\users\runneradmin\.virtualenvs\.venv\lib\site-packages\pluggy\_callers.py", line 39, in _multicall
    res = hook_impl.function(*args)
  File "c:\users\runneradmin\.virtualenvs\.venv\lib\site-packages\_pytest\runner.py", line 111, in pytest_runtest_protocol
    runtestprotocol(item, nextitem=nextitem)
  File "c:\users\runneradmin\.virtualenvs\.venv\lib\site-packages\_pytest\runner.py", line 124, in runtestprotocol
    rep = call_and_report(item, "setup", log)
  File "c:\users\runneradmin\.virtualenvs\.venv\lib\site-packages\_pytest\runner.py", line 219, in call_and_report
    call = call_runtest_hook(item, when, **kwds)
  File "c:\users\runneradmin\.virtualenvs\.venv\lib\site-packages\_pytest\runner.py", line 258, in call_runtest_hook
    return CallInfo.from_call(
  File "c:\users\runneradmin\.virtualenvs\.venv\lib\site-packages\_pytest\runner.py", line 338, in from_call
    result: Optional[TResult] = func()
  File "c:\users\runneradmin\.virtualenvs\.venv\lib\site-packages\_pytest\runner.py", line 259, in <lambda>
    lambda: ihook(item=item, **kwds), when=when, reraise=reraise
  File "c:\users\runneradmin\.virtualenvs\.venv\lib\site-packages\pluggy\_hooks.py", line 265, in __call__
    return self._hookexec(self.name, self.get_hookimpls(), kwargs, firstresult)
  File "c:\users\runneradmin\.virtualenvs\.venv\lib\site-packages\pluggy\_manager.py", line 80, in _hookexec
    return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
  File "c:\users\runneradmin\.virtualenvs\.venv\lib\site-packages\pluggy\_callers.py", line 39, in _multicall
    res = hook_impl.function(*args)
  File "c:\users\runneradmin\.virtualenvs\.venv\lib\site-packages\_pytest\runner.py", line 1[54](https://github.com/Tribler/tribler/actions/runs/3363436019/jobs/5576574735#step:7:55), in pytest_runtest_setup
    item.session._setupstate.setup(item)
  File "c:\users\runneradmin\.virtualenvs\.venv\lib\site-packages\_pytest\runner.py", line 491, in setup
    col.setup()
  File "c:\users\runneradmin\.virtualenvs\.venv\lib\site-packages\_pytest\python.py", line 1764, in setup
    self._request._fillfixtures()
  File "c:\users\runneradmin\.virtualenvs\.venv\lib\site-packages\_pytest\fixtures.py", line 541, in _fillfixtures
    item.funcargs[argname] = self.getfixturevalue(argname)
  File "c:\users\runneradmin\.virtualenvs\.venv\lib\site-packages\_pytest\fixtures.py", line [55](https://github.com/Tribler/tribler/actions/runs/3363436019/jobs/5576574735#step:7:56)4, in getfixturevalue
    fixturedef = self._get_active_fixturedef(argname)
  File "c:\users\runneradmin\.virtualenvs\.venv\lib\site-packages\_pytest\fixtures.py", line [57](https://github.com/Tribler/tribler/actions/runs/3363436019/jobs/5576574735#step:7:58)3, in _get_active_fixturedef
    self._compute_fixture_value(fixturedef)
  File "c:\users\runneradmin\.virtualenvs\.venv\lib\site-packages\_pytest\fixtures.py", line 6[59](https://github.com/Tribler/tribler/actions/runs/3363436019/jobs/5576574735#step:7:60), in _compute_fixture_value
    fixturedef.execute(request=subrequest)
  File "c:\users\runneradmin\.virtualenvs\.venv\lib\site-packages\_pytest\fixtures.py", line 1057, in execute
    result = ihook.pytest_fixture_setup(fixturedef=self, request=request)
  File "c:\users\runneradmin\.virtualenvs\.venv\lib\site-packages\pluggy\_hooks.py", line 265, in __call__
    return self._hookexec(self.name, self.get_hookimpls(), kwargs, firstresult)
  File "c:\users\runneradmin\.virtualenvs\.venv\lib\site-packages\pluggy\_manager.py", line 80, in _hookexec
    return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
  File "c:\users\runneradmin\.virtualenvs\.venv\lib\site-packages\pluggy\_callers.py", line 39, in _multicall
    res = hook_impl.function(*args)
  File "c:\users\runneradmin\.virtualenvs\.venv\lib\site-packages\_pytest\fixtures.py", line 1111, in pytest_fixture_setup
    result = call_fixture_func(fixturefunc, request, kwargs)
  File "c:\users\runneradmin\.virtualenvs\.venv\lib\site-packages\_pytest\fixtures.py", line 883, in call_fixture_func
    fixture_result = next(generator)
  File "D:\a\tribler\tribler\src\tribler\gui\tests\test_gui.py", line [60](https://github.com/Tribler/tribler/actions/runs/3363436019/jobs/5576574735#step:7:61), in fixture_window
    wait_for_signal(
  File "D:\a\tribler\tribler\src\tribler\gui\tests\test_gui.py", line 101, in wait_for_signal
    QTest.qWait([100](https://github.com/Tribler/tribler/actions/runs/3363436019/jobs/5576574735#step:7:101))

+++++++++++++++++++++++++++++++++++ Timeout ++++++++++++++++++++++++++++++++++++
Error: Process completed with exit code 1.
@drew2a
Copy link
Contributor Author

drew2a commented Nov 1, 2022

Profiler info (macOS)

combined

@drew2a
Copy link
Contributor Author

drew2a commented Jun 12, 2023

@drew2a
Copy link
Contributor Author

drew2a commented Jun 12, 2023

The last output shows that there is a potential freeze that happens sometimes: https://github.com/Tribler/tribler/actions/runs/5244870493/jobs/9471485884?pr=7483

@drew2a
Copy link
Contributor Author

drew2a commented Jun 13, 2023

How to deal with flaky tests: https://docs.pytest.org/en/6.2.x/flaky.html

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

Successfully merging a pull request may close this issue.

1 participant