Commit 4474b20b by Nimisha Asthagiri Committed by GitHub

Merge pull request #15815 from edx/neem/course-overviews-memory

Prevent high mem usage in generate_course_overview
parents fb66af5c 987ef9dc
...@@ -54,4 +54,4 @@ class Command(BaseCommand): ...@@ -54,4 +54,4 @@ class Command(BaseCommand):
except InvalidKeyError: except InvalidKeyError:
raise CommandError('Invalid key specified.') raise CommandError('Invalid key specified.')
CourseOverview.get_select_courses(course_keys, force_update=options.get('force_update')) CourseOverview.update_select_courses(course_keys, force_update=options.get('force_update'))
...@@ -487,9 +487,10 @@ class CourseOverview(TimeStampedModel): ...@@ -487,9 +487,10 @@ class CourseOverview(TimeStampedModel):
return json.loads(self._pre_requisite_courses_json) return json.loads(self._pre_requisite_courses_json)
@classmethod @classmethod
def get_select_courses(cls, course_keys, force_update=False): def update_select_courses(cls, course_keys, force_update=False):
""" """
Returns CourseOverview objects for the given course_keys. A side-effecting method that updates CourseOverview objects for
the given course_keys.
Arguments: Arguments:
course_keys (list[CourseKey]): Identifies for which courses to course_keys (list[CourseKey]): Identifies for which courses to
...@@ -498,8 +499,6 @@ class CourseOverview(TimeStampedModel): ...@@ -498,8 +499,6 @@ class CourseOverview(TimeStampedModel):
whether the requested CourseOverview objects should be whether the requested CourseOverview objects should be
forcefully updated (i.e., re-synched with the modulestore). forcefully updated (i.e., re-synched with the modulestore).
""" """
course_overviews = []
log.info('Generating course overview for %d courses.', len(course_keys)) log.info('Generating course overview for %d courses.', len(course_keys))
log.debug('Generating course overview(s) for the following courses: %s', course_keys) log.debug('Generating course overview(s) for the following courses: %s', course_keys)
...@@ -507,7 +506,7 @@ class CourseOverview(TimeStampedModel): ...@@ -507,7 +506,7 @@ class CourseOverview(TimeStampedModel):
for course_key in course_keys: for course_key in course_keys:
try: try:
course_overviews.append(action(course_key)) action(course_key)
except Exception as ex: # pylint: disable=broad-except except Exception as ex: # pylint: disable=broad-except
log.exception( log.exception(
'An error occurred while generating course overview for %s: %s', 'An error occurred while generating course overview for %s: %s',
...@@ -517,8 +516,6 @@ class CourseOverview(TimeStampedModel): ...@@ -517,8 +516,6 @@ class CourseOverview(TimeStampedModel):
log.info('Finished generating course overviews.') log.info('Finished generating course overviews.')
return course_overviews
@classmethod @classmethod
def get_all_courses(cls, orgs=None, filter_=None): def get_all_courses(cls, orgs=None, filter_=None):
""" """
......
...@@ -450,13 +450,14 @@ class CourseOverviewTestCase(ModuleStoreTestCase): ...@@ -450,13 +450,14 @@ class CourseOverviewTestCase(ModuleStoreTestCase):
unmodified_overview = CourseOverview.get_from_id(course.id) unmodified_overview = CourseOverview.get_from_id(course.id)
self.assertEqual(unmodified_overview.version, 11) self.assertEqual(unmodified_overview.version, 11)
def test_get_select_courses(self): def test_update_select_courses(self):
course_ids = [CourseFactory.create().id for __ in range(3)] course_ids = [CourseFactory.create().id for __ in range(3)]
select_course_ids = course_ids[:len(course_ids) - 1] # all items except the last select_course_ids = course_ids[:len(course_ids) - 1] # all items except the last
self.assertEqual( with mock.patch(
{course_overview.id for course_overview in CourseOverview.get_select_courses(select_course_ids)}, 'openedx.core.djangoapps.content.course_overviews.models.CourseOverview.get_from_id'
set(select_course_ids), ) as mock_get_from_id:
) CourseOverview.update_select_courses(select_course_ids)
self.assertEquals(mock_get_from_id.call_count, len(select_course_ids))
def test_get_all_courses(self): def test_get_all_courses(self):
course_ids = [CourseFactory.create(emit_signals=True).id for __ in range(3)] course_ids = [CourseFactory.create(emit_signals=True).id for __ in range(3)]
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment