bihealth / sodar-core

SODAR Core: A Django-based framework for building scientific data management web apps
MIT License
9 stars 1 forks source link

Potential crash in Project.get_parents() with related object query #1427

Open mikkonie opened 3 months ago

mikkonie commented 3 months ago

While debugging another issue in SODAR, I ran across a previously caught exception raised by Project.get_parents(). While I haven't observed this to cause any unexpected issues, it should not be raised of course.

It seems to happen on the lain if not self.parent, but I'm having trouble replicating this, let alone identifying the root cause.

Dump of the crash as seen in SODAR can be found in the comments.

mikkonie commented 3 months ago

Dump:

ERROR:django.request:Internal Server Error: /irodsbackend/ajax/stats/8b1274c0-2d82-4af7-ad44-fec26c060083
Traceback (most recent call last):
  File "/home/mikkopen/.virtualenvs/sodar14/lib/python3.8/site-packages/django/db/models/fields/related_descriptors.py", line 173, in __get__
    rel_obj = self.field.get_cached_value(instance)
  File "/home/mikkopen/.virtualenvs/sodar14/lib/python3.8/site-packages/django/db/models/fields/mixins.py", line 15, in get_cached_value
    return instance._state.fields_cache[cache_name]
KeyError: 'parent'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/mikkopen/.virtualenvs/sodar14/lib/python3.8/site-packages/django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "/home/mikkopen/.virtualenvs/sodar14/lib/python3.8/site-packages/django/core/handlers/base.py", line 181, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/home/mikkopen/.virtualenvs/sodar14/lib/python3.8/site-packages/django/views/decorators/csrf.py", line 54, in wrapped_view
    return view_func(*args, **kwargs)
  File "/home/mikkopen/.virtualenvs/sodar14/lib/python3.8/site-packages/django/views/generic/base.py", line 70, in view
    return self.dispatch(request, *args, **kwargs)
  File "/home/mikkopen/code/sodar/irodsbackend/views.py", line 122, in dispatch
    return super().dispatch(request, *args, **kwargs)
  File "/home/mikkopen/.virtualenvs/sodar14/lib/python3.8/site-packages/rest_framework/views.py", line 509, in dispatch
    response = self.handle_exception(exc)
  File "/home/mikkopen/.virtualenvs/sodar14/lib/python3.8/site-packages/rest_framework/views.py", line 469, in handle_exception
    self.raise_uncaught_exception(exc)
  File "/home/mikkopen/.virtualenvs/sodar14/lib/python3.8/site-packages/rest_framework/views.py", line 480, in raise_uncaught_exception
    raise exc
  File "/home/mikkopen/.virtualenvs/sodar14/lib/python3.8/site-packages/rest_framework/views.py", line 506, in dispatch
    response = handler(request, *args, **kwargs)
  File "/home/mikkopen/code/sodar/irodsbackend/views.py", line 174, in post
    elif not self._check_collection_perm(p, request.user, irods):
  File "/home/mikkopen/code/sodar/irodsbackend/views.py", line 69, in _check_collection_perm
    user.is_superuser or self.project.is_owner_or_delegate(user)
  File "/home/mikkopen/.virtualenvs/sodar14/lib/python3.8/site-packages/projectroles/models.py", line 541, in is_owner_or_delegate
    role_as = self.get_role(user)
  File "/home/mikkopen/.virtualenvs/sodar14/lib/python3.8/site-packages/projectroles/models.py", line 358, in get_role
    projects += list(self.get_parents())
  File "/home/mikkopen/.virtualenvs/sodar14/lib/python3.8/site-packages/projectroles/models.py", line 315, in get_parents
    if not self.parent:
  File "/home/mikkopen/.virtualenvs/sodar14/lib/python3.8/site-packages/django/db/models/fields/related_descriptors.py", line 187, in __get__
    rel_obj = self.get_object(instance)
  File "/home/mikkopen/.virtualenvs/sodar14/lib/python3.8/site-packages/django/db/models/fields/related_descriptors.py", line 154, in get_object
    return qs.get(self.field.get_reverse_related_filter(instance))
  File "/home/mikkopen/.virtualenvs/sodar14/lib/python3.8/site-packages/django/db/models/query.py", line 435, in get
    raise self.model.DoesNotExist(
projectroles.models.Project.DoesNotExist: Project matching query does not exist.
ERROR:django.request:Internal Server Error: /irodsbackend/ajax/stats/8b1274c0-2d82-4af7-ad44-fec26c060083
Traceback (most recent call last):
  File "/home/mikkopen/.virtualenvs/sodar14/lib/python3.8/site-packages/django/db/models/fields/related_descriptors.py", line 173, in __get__
    rel_obj = self.field.get_cached_value(instance)
  File "/home/mikkopen/.virtualenvs/sodar14/lib/python3.8/site-packages/django/db/models/fields/mixins.py", line 15, in get_cached_value
    return instance._state.fields_cache[cache_name]
KeyError: 'parent'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/mikkopen/.virtualenvs/sodar14/lib/python3.8/site-packages/django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "/home/mikkopen/.virtualenvs/sodar14/lib/python3.8/site-packages/django/core/handlers/base.py", line 181, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/home/mikkopen/.virtualenvs/sodar14/lib/python3.8/site-packages/django/views/decorators/csrf.py", line 54, in wrapped_view
    return view_func(*args, **kwargs)
  File "/home/mikkopen/.virtualenvs/sodar14/lib/python3.8/site-packages/django/views/generic/base.py", line 70, in view
    return self.dispatch(request, *args, **kwargs)
  File "/home/mikkopen/code/sodar/irodsbackend/views.py", line 122, in dispatch
    return super().dispatch(request, *args, **kwargs)
  File "/home/mikkopen/.virtualenvs/sodar14/lib/python3.8/site-packages/rest_framework/views.py", line 509, in dispatch
    response = self.handle_exception(exc)
  File "/home/mikkopen/.virtualenvs/sodar14/lib/python3.8/site-packages/rest_framework/views.py", line 469, in handle_exception
    self.raise_uncaught_exception(exc)
  File "/home/mikkopen/.virtualenvs/sodar14/lib/python3.8/site-packages/rest_framework/views.py", line 480, in raise_uncaught_exception
    raise exc
  File "/home/mikkopen/.virtualenvs/sodar14/lib/python3.8/site-packages/rest_framework/views.py", line 506, in dispatch
    response = handler(request, *args, **kwargs)
  File "/home/mikkopen/code/sodar/irodsbackend/views.py", line 174, in post
    elif not self._check_collection_perm(p, request.user, irods):
  File "/home/mikkopen/code/sodar/irodsbackend/views.py", line 69, in _check_collection_perm
    user.is_superuser or self.project.is_owner_or_delegate(user)
  File "/home/mikkopen/.virtualenvs/sodar14/lib/python3.8/site-packages/projectroles/models.py", line 541, in is_owner_or_delegate
    role_as = self.get_role(user)
  File "/home/mikkopen/.virtualenvs/sodar14/lib/python3.8/site-packages/projectroles/models.py", line 358, in get_role
    projects += list(self.get_parents())
  File "/home/mikkopen/.virtualenvs/sodar14/lib/python3.8/site-packages/projectroles/models.py", line 315, in get_parents
    if not self.parent:
  File "/home/mikkopen/.virtualenvs/sodar14/lib/python3.8/site-packages/django/db/models/fields/related_descriptors.py", line 187, in __get__
    rel_obj = self.get_object(instance)
  File "/home/mikkopen/.virtualenvs/sodar14/lib/python3.8/site-packages/django/db/models/fields/related_descriptors.py", line 154, in get_object
    return qs.get(self.field.get_reverse_related_filter(instance))
  File "/home/mikkopen/.virtualenvs/sodar14/lib/python3.8/site-packages/django/db/models/query.py", line 435, in get
    raise self.model.DoesNotExist(
projectroles.models.Project.DoesNotExist: Project matching query does not exist.