Page MenuHomeSoftware Heritage

Jenkins > .tox.py3.lib.python3.7.site-packages.swh.indexer.tests.storage.test_api_client.TestIndexerStorageOriginIntrinsicMetadata::test_origin_intrinsic_metadata_add__deadlock
Failed

TEST RESULT

Run At
Aug 3 2022, 4:17 PM
Details
self = <contextlib.ExitStack object at 0x7fc332072048> exc_details = (<class 'ValueError'>, ValueError("<Token var=<ContextVar name='flask.request_ctx' at 0x7fc345038eb8> at 0x7fc3317b6c18> was created in a different Context"), <traceback object at 0x7fc331910fc8>) received_exc = False _fix_exception_context = <function ExitStack.__exit__.<locals>._fix_exception_context at 0x7fc3321c9950> suppressed_exc = False def __exit__(self, *exc_details): received_exc = exc_details[0] is not None # We manipulate the exception state so it behaves as though # we were actually nesting multiple with statements frame_exc = sys.exc_info()[1] def _fix_exception_context(new_exc, old_exc): # Context may not be correct, so find the end of the chain while 1: exc_context = new_exc.__context__ if exc_context is old_exc: # Context is already set correctly (see issue 20317) return if exc_context is None or exc_context is frame_exc: break new_exc = exc_context # Change the end of the chain to point to the exception # we expect it to reference new_exc.__context__ = old_exc # Callbacks are invoked in LIFO order to match the behaviour of # nested context managers suppressed_exc = False pending_raise = False while self._exit_callbacks: is_sync, cb = self._exit_callbacks.pop() assert is_sync try: > if cb(*exc_details): /usr/lib/python3.7/contextlib.py:496: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ exc_type = None, exc = None, tb = None def _exit_wrapper(exc_type, exc, tb): > return cm_exit(cm, exc_type, exc, tb) /usr/lib/python3.7/contextlib.py:377: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <flask.ctx.AppContext object at 0x7fc3317b44e0>, exc_type = None exc_value = None, tb = None def __exit__( self, exc_type: t.Optional[type], exc_value: t.Optional[BaseException], tb: t.Optional[TracebackType], ) -> None: > self.pop(exc_value) .tox/py3/lib/python3.7/site-packages/flask/ctx.py:275: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <flask.ctx.AppContext object at 0x7fc3317b44e0>, exc = None def pop(self, exc: t.Optional[BaseException] = _sentinel) -> None: # type: ignore """Pops the app context.""" try: if len(self._cv_tokens) == 1: if exc is _sentinel: exc = sys.exc_info()[1] self.app.do_teardown_appcontext(exc) finally: ctx = _cv_app.get() > _cv_app.reset(self._cv_tokens.pop()) E ValueError: <Token var=<ContextVar name='flask.app_ctx' at 0x7fc345038e60> at 0x7fc3317b6cf0> was created in a different Context .tox/py3/lib/python3.7/site-packages/flask/ctx.py:256: ValueError During handling of the above exception, another exception occurred: self = <swh.indexer.tests.storage.test_storage.TestIndexerStorageOriginIntrinsicMetadata object at 0x7fc342a85978> swh_indexer_storage_with_data = (<RemoteStorage url=mock://example.com/>, {'tools': {'swh-metadata-translator': {'id': 1, 'name': 'swh-metadata-transl...uration_id=7, tool=None, id=b'\x05\xea[X\xb2\x8a\x83\x83o:\xa1\xf7\x02\xc9\xa4\xe4\xbf\xa7\x0e\xf3', license=b'MIT')]}) def test_origin_intrinsic_metadata_add__deadlock( self, swh_indexer_storage_with_data: Tuple[IndexerStorageInterface, Any] ) -> None: storage, data = swh_indexer_storage_with_data # given tool_id = data.tools["swh-metadata-detector"]["id"] origins = ["file:///tmp/origin{:02d}".format(i) for i in range(100)] example_data1: Dict[str, Any] = { "metadata": { "version": None, "name": None, }, "mappings": [], } example_data2: Dict[str, Any] = { "metadata": { "version": "v1.1.1", "name": "foo", }, "mappings": [], } metadata_dir_v1 = DirectoryIntrinsicMetadataRow( id=data.directory_id_2, metadata={ "version": None, "name": None, }, mappings=[], indexer_configuration_id=tool_id, ) data_v1 = [ OriginIntrinsicMetadataRow( id=origin, from_directory=data.directory_id_2, indexer_configuration_id=tool_id, **example_data1, ) for origin in origins ] data_v2 = [ OriginIntrinsicMetadataRow( id=origin, from_directory=data.directory_id_2, indexer_configuration_id=tool_id, **example_data2, ) for origin in origins ] # Remove one item from each, so that both queries have to succeed for # all items to be in the DB. data_v2a = data_v2[1:] data_v2b = list(reversed(data_v2[0:-1])) # given storage.directory_intrinsic_metadata_add([metadata_dir_v1]) storage.origin_intrinsic_metadata_add(data_v1) # when actual_data = list(storage.origin_intrinsic_metadata_get(origins)) expected_data_v1 = [ OriginIntrinsicMetadataRow( id=origin, from_directory=data.directory_id_2, tool=data.tools["swh-metadata-detector"], **example_data1, ) for origin in origins ] # then assert actual_data == expected_data_v1 # given def f1() -> None: storage.origin_intrinsic_metadata_add(data_v2a) def f2() -> None: storage.origin_intrinsic_metadata_add(data_v2b) t1 = threading.Thread(target=f1) t2 = threading.Thread(target=f2) t2.start() t1.start() t1.join() t2.join() > actual_data = list(storage.origin_intrinsic_metadata_get(origins)) .tox/py3/lib/python3.7/site-packages/swh/indexer/tests/storage/test_storage.py:1045: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ .tox/py3/lib/python3.7/site-packages/swh/core/api/__init__.py:183: in meth_ return self._post(meth._endpoint_path, post_data) .tox/py3/lib/python3.7/site-packages/swh/core/api/__init__.py:272: in _post **opts, .tox/py3/lib/python3.7/site-packages/swh/core/api/__init__.py:254: in raw_verb return getattr(self.session, verb)(self._url(endpoint), **opts) .tox/py3/lib/python3.7/site-packages/requests/sessions.py:635: in post return self.request("POST", url, data=data, json=json, **kwargs) .tox/py3/lib/python3.7/site-packages/requests/sessions.py:587: in request resp = self.send(prep, **send_kwargs) .tox/py3/lib/python3.7/site-packages/requests/sessions.py:701: in send r = adapter.send(request, **kwargs) .tox/py3/lib/python3.7/site-packages/swh/core/pytest_plugin.py:300: in send data=request.body, .tox/py3/lib/python3.7/site-packages/flask/testing.py:221: in open self._context_stack.close() /usr/lib/python3.7/contextlib.py:519: in close self.__exit__(None, None, None) /usr/lib/python3.7/contextlib.py:511: in __exit__ raise exc_details[1] /usr/lib/python3.7/contextlib.py:496: in __exit__ if cb(*exc_details): /usr/lib/python3.7/contextlib.py:377: in _exit_wrapper return cm_exit(cm, exc_type, exc, tb) .tox/py3/lib/python3.7/site-packages/flask/ctx.py:432: in __exit__ self.pop(exc_value) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <RequestContext 'mock://example.com/origin_intrinsic_metadata/add' [POST] of swh.indexer.storage.api.server> exc = ValueError("<Token var=<ContextVar name='flask.app_ctx' at 0x7fc345038e60> at 0x7fc3317b6cf0> was created in a different Context") def pop(self, exc: t.Optional[BaseException] = _sentinel) -> None: # type: ignore """Pops the request context and unbinds it by doing that. This will also trigger the execution of functions registered by the :meth:`~flask.Flask.teardown_request` decorator. .. versionchanged:: 0.9 Added the `exc` argument. """ clear_request = len(self._cv_tokens) == 1 try: if clear_request: if exc is _sentinel: exc = sys.exc_info()[1] self.app.do_teardown_request(exc) request_close = getattr(self.request, "close", None) if request_close is not None: request_close() finally: ctx = _cv_request.get() token, app_ctx = self._cv_tokens.pop() > _cv_request.reset(token) E ValueError: <Token var=<ContextVar name='flask.request_ctx' at 0x7fc345038eb8> at 0x7fc3317b6c18> was created in a different Context .tox/py3/lib/python3.7/site-packages/flask/ctx.py:407: ValueError