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

Sync opencraft-release/redwood.1 with Upstream 20241014-1728865275 #696

Open
wants to merge 20 commits into
base: opencraft-release/redwood.1
Choose a base branch
from
Open
Changes from 1 commit
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
aa70fea
feat: hide the survey report banner for a month after clicking the di…
Asespinel Jun 19, 2024
e5f074b
chore: upgrade Django to 4.2.14
magajh Jul 15, 2024
932e504
Merge pull request #35120 from magajh/open-release/redwood.master
Jul 15, 2024
4744ea1
chore!: uprgade social-auth-app-django to version 5.4.1
iamsobanjaved Jun 10, 2024
670772b
chore: add migration from social_django
iamsobanjaved Jun 27, 2024
2165da0
chore: Re-compile requirements.
feanil Jul 23, 2024
b4a1e01
Merge pull request #35166 from openedx/feanil/backport_django_social_…
Jul 23, 2024
ed72248
fix: libraries across orgs
connorhaugh Feb 15, 2024
d23b41e
docs: imporved comment
connorhaugh Feb 15, 2024
d757cfa
fix: cohorts data can be private
connorhaugh Oct 4, 2023
62269f8
fix: Remove errant pluses from a bad merge.
feanil Jul 25, 2024
8813e8b
style: Fix a pylint and style violations.
feanil Jul 25, 2024
3160ff6
Merge pull request #35180 from openedx/feanil/backporting
Jul 25, 2024
1e0d575
fix: course progress url returned based on course_home_mfe_progress_t…
FatemeKhodayari Jul 30, 2024
c5d7507
chore: upgrade Django to 4.2.15 (#35240)
magajh Aug 6, 2024
d5c84e9
backport fix: disable submit button for archived courses (#34920) to …
Anas12091101 Aug 8, 2024
fa97f13
fix: Prevent error page recursion (#35209)
timmc-edx Jul 31, 2024
3d50dd8
Merge pull request #35259 from raccoongang/max/backport-error-page-re…
cmltaWt0 Aug 8, 2024
5ea3b98
feat: course about page markup and styles improvements (#34892)
ihor-romaniuk Sep 9, 2024
9c8059b
fix: backport: hide new library button for ineligible users in split …
kaustavb12 Sep 19, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
fix: Prevent error page recursion (openedx#35209)
We sometimes see rendering errors in the error page itself, which then
cause another attempt at rendering the error page. I'm not sure _exactly_
how the loop is occurring, but it looks something like this:

1. An error is raised in a view or middleware and is not caught by
   application code
2. Django catches the error and calls the registered uncaught error
   handler
3. Our handler tries to render an error page
4. The rendering code raises an error
5. GOTO 2 (until some sort of server limit is reached)

By catching all errors raised during error-page render and substituting in
a hardcoded string, we can reduce server resources, avoid logging massive
sequences of recursive stack traces, and still give the user *some*
indication that yes, there was a problem.

This should help address openedx#35151

At least one of these rendering errors is known to be due to a translation
error. There's a separate issue for restoring translation quality so that
we avoid those issues in the future (openedx/openedx-translations#549)
but in general we should catch all rendering errors, including unknown
ones.

Testing:

- In `lms/envs/devstack.py` change `DEBUG` to `False` to ensure that the
  usual error page is displayed (rather than the debug error page).
- Add line `1/0` to the top of the `student_dashboard` function in
 `common/djangoapps/student/views/dashboard.py` to make that view error.
- In `lms/templates/static_templates/server-error.html` replace
  `static.get_platform_name()` with `None * 7` to make the error template
  itself produce an error.
- Visit <http://localhost:18000/dashboard>.

Without the fix, the response takes 10 seconds and produces a 6 MB, 85k
line set of stack traces and the page displays "A server error occurred.
Please contact the administrator."

With the fix, the response takes less than a second and produces three
stack traces (one of which contains the error page's rendering error).
  • Loading branch information
timmc-edx authored and cmltaWt0 committed Aug 8, 2024
commit fa97f13196bf920286c1122f71c726c31427099d
23 changes: 21 additions & 2 deletions lms/djangoapps/static_template_view/views.py
Original file line number Diff line number Diff line change
@@ -5,7 +5,7 @@
# List of valid templates is explicitly managed for (short-term)
# security reasons.


import logging
import mimetypes

from django.conf import settings
@@ -23,6 +23,8 @@
from common.djangoapps.util.views import fix_crum_request
from openedx.core.djangoapps.site_configuration import helpers as configuration_helpers

log = logging.getLogger(__name__)

valid_templates = []

if settings.STATIC_GRAB:
@@ -122,4 +124,21 @@ def render_429(request, exception=None): # lint-amnesty, pylint: disable=unused

@fix_crum_request
def render_500(request):
return HttpResponseServerError(render_to_string('static_templates/server-error.html', {}, request=request))
"""
Render the generic error page when we have an uncaught error.
"""
try:
return HttpResponseServerError(render_to_string('static_templates/server-error.html', {}, request=request))
except BaseException as e:
# If we can't render the error page, ensure we don't raise another
# exception -- because if we do, we'll probably just end up back
# at the same rendering error.
#
# This is an attempt at working around the recursive error handling issues
# observed in <https://github.com/openedx/edx-platform/issues/35151>, which
# were triggered by Mako and translation errors.

log.error("Encountered error while rendering error page.", exc_info=True)
# This message is intentionally hardcoded and does not involve
# any translation, templating, etc. Do not translate.
return HttpResponseServerError("Encountered error while rendering error page.")