diff --git a/common/djangoapps/django_comment_common/models.py b/common/djangoapps/django_comment_common/models.py index 0d27aa9a07efe8c49386dd2128733adf19683f15..cbe7c38e0875df29b2ad664faa6024dfbdeeb0af 100644 --- a/common/djangoapps/django_comment_common/models.py +++ b/common/djangoapps/django_comment_common/models.py @@ -145,15 +145,19 @@ def all_permissions_for_user_in_course(user, course_id): # pylint: disable=inva if course is None: raise ItemNotFoundError(course_id) - all_roles = {role.name for role in Role.objects.filter(users=user, course_id=course_id)} - - permissions = { - permission.name - for permission - in Permission.objects.filter(roles__users=user, roles__course_id=course_id) - if not permission_blacked_out(course, all_roles, permission.name) - } - return permissions + roles = Role.objects.filter(users=user, course_id=course_id) + role_names = {role.name for role in roles} + + permission_names = set() + for role in roles: + # Intentional n+1 query pattern to get permissions for each role because + # Aurora's query optimizer can't handle the join proplerly on 30M+ row + # tables (EDUCATOR-3374). Fortunately, there are very few forum roles. + for permission in role.permissions.all(): + if not permission_blacked_out(course, role_names, permission.name): + permission_names.add(permission.name) + + return permission_names class ForumsConfig(ConfigurationModel): diff --git a/lms/djangoapps/courseware/tests/test_discussion_xblock.py b/lms/djangoapps/courseware/tests/test_discussion_xblock.py index 10b8bbacd5a8244052fead02e6a2090df252d4a3..45cde8ef83c578875ed5d4893c03e55a9ec35f01 100644 --- a/lms/djangoapps/courseware/tests/test_discussion_xblock.py +++ b/lms/djangoapps/courseware/tests/test_discussion_xblock.py @@ -406,7 +406,7 @@ class TestXBlockQueryLoad(SharedModuleStoreTestCase): # * django_comment_client_role # * django_comment_client_permission # * lms_xblock_xblockasidesconfig - num_queries = 3 + num_queries = 2 for discussion in discussions: discussion_xblock = get_module_for_descriptor_internal( user=user,