Commit Graph

37 Commits

Author SHA1 Message Date
David Ormsbee
79de77cf95 Optimize grading/progress page to reduce database queries (cache max scores).
The progress page did a number of things that make performance terrible for
courses with large numbers of problems, particularly if those problems are
customresponse CapaModule problems that need to be executed via codejail.

The grading code takes pains to not instantiate student state and execute the
problem code. If a student has answered the question, the max score is stored
in StudentModule. However, if the student hasn't attempted the question yet, we
have to run the problem code just to call .max_score() on it. This is necessary
in grade() if the student has answered other problems in the assignment (so we
can know what to divide by). This is always necessary to know in
progress_summary() because we list out every problem there. Code execution can
be especially slow if the problems need to invoke codejail.

To address this, we create a MaxScoresCache that will cache the max raw score
possible for every problem. We select the cache keys so that it will
automatically become invalidated when a new version of the course is published.

The fundamental assumption here is that a problem cannot have two different
max score values for two unscored students. A problem *can* score two students
differently such that they have different max scores. So Carlos can have 2/3 on
a problem, while Lyla gets 3/4. But if neither Carlos nor Lyla has ever
interacted with the problem (i.e. they're just seeing it on their progress
page), they must both see 0/4 -- it cannot be the case that Carlos sees 0/3 and
Lyla sees 0/4.

We used to load all student state into two separate FieldDataCache instances,
after which we do a bunch of individual queries for scored items. Part of this
split-up was done because of locking problems, but I think we might have gotten
overzealous with our manual transaction hammer.

In this commit, we consolidate all state access in grade() and progress()
to use one shared FieldDataCache. We also use a filter so that we only pull
back StudentModule state for things that might possibly affect the grade --
items that either have scores or have children.

Because some older XModules do work in their __init__() methods (like Video),
instantiating them takes time, particularly on large courses. This commit also
changes the code that fetches the grading_context to filter out children that
can't possibly affect the grade.

Finally, we introduce a ScoresClient that also tries to fetch score
information all at once, instead of in separate queries. Technically, we are
fetching this information redundantly, but that's because the state and score
interfaces are being teased apart as we move forward. Still, this only
amounts to one extra SQL query, and has very little impact on performance
overall.

Much thanks to @adampalay -- his hackathon work in #7168 formed the basis of
this.

https://openedx.atlassian.net/browse/CSM-17
2015-07-09 10:03:58 -04:00
Calen Pennington
122039ac58 Add __len__ to FieldDataCache 2015-05-20 15:33:31 -04:00
Calen Pennington
2e06e592ca Use DjangoXBlockUserStateClient to implement UserStateCache 2015-05-20 15:33:29 -04:00
Calen Pennington
12740fa4ac Make test_model_data test_set_many_failure slightly more robust 2015-05-20 15:07:25 -04:00
Calen Pennington
67d66184a7 Push set_many save() calls into per-type caches 2015-05-20 15:07:25 -04:00
Calen Pennington
0d37ec8099 Change the central cache to store at two levels: first by scope, then by cache key 2015-05-20 15:07:20 -04:00
Christine Lytwynec
ddb1ae667e Split lms unittests into multiple shards 2015-05-07 09:17:26 -04:00
Adam Palay
987ea8551e fix quality violation 2015-04-16 10:13:36 -04:00
Adam Palay
9196817abb Revert "Decrease the number of inserts and updates needed by DjangoKeyValueStore"
This reverts commit 88b9187476.
2015-04-15 17:41:11 -04:00
Calen Pennington
88b9187476 Decrease the number of inserts and updates needed by DjangoKeyValueStore 2015-03-17 10:57:13 -04:00
Calen Pennington
2d51f6435e Add query count tests to DjangoKeyValueStore/FieldDataCache 2015-03-16 14:57:30 -04:00
Calen Pennington
03a05fd9d4 Always call super(..).setUp() from setUp 2015-02-04 09:09:14 -05:00
Calen Pennington
d919d2ae46 Teach LMS how to render XBlockAsides
[PLAT-217]
2014-12-13 08:26:28 -05:00
Sarina Canelake
89b6adadf2 s/pylint: disable=E1102/pylint: disable=not-callable/ 2014-12-01 11:22:10 -05:00
Sarina Canelake
19f1dacab2 s/pylint: disable=E1101/pylint: disable=no-member/ 2014-12-01 11:22:09 -05:00
stv
fb9f324f2f Fix PEP8: E303 too many blank lines 2014-11-10 11:00:14 -08:00
cahrens
08ce09bde7 Display validation messages for any xblock on the container page.
TNL-683
2014-11-06 15:48:55 -05:00
Don Mitchell
7be81341d7 Revert StudentModule.module_state_key to field rather than computed property 2014-05-09 10:41:12 -04:00
Calen Pennington
9811926d97 Make course ids and usage ids opaque to LMS and Studio [partial commit]
This commit updates lms/djangoapps/courseware.

These keys are now objects with a limited interface, and the particular
internal representation is managed by the data storage layer (the
modulestore).

For the LMS, there should be no outward-facing changes to the system.
The keys are, for now, a change to internal representation only. For
Studio, the new serialized form of the keys is used in urls, to allow
for further migration in the future.

Co-Author: Andy Armstrong <andya@edx.org>
Co-Author: Christina Roberts <christina@edx.org>
Co-Author: David Baumgold <db@edx.org>
Co-Author: Diana Huang <dkh@edx.org>
Co-Author: Don Mitchell <dmitchell@edx.org>
Co-Author: Julia Hansbrough <julia@edx.org>
Co-Author: Nimisha Asthagiri <nasthagiri@edx.org>
Co-Author: Sarina Canelake <sarina@edx.org>

[LMS-2370]
2014-05-06 10:08:32 -04:00
Jason Bau
a160428b9b Move FieldDataCache assert to check both get and get_or_create 2014-02-27 20:06:16 -08:00
Calen Pennington
a6a004314a Use block type, rather than class names for StudentPreference field storage in LMS 2014-01-09 15:59:16 -05:00
Calen Pennington
52ab2b1313 Make FieldDataCache use the user from scope_ids, rather than its pre-configured user
Co-author: Ned Batchelder <ned@edx.org>
2013-11-26 16:29:35 -05:00
Calen Pennington
8201b1412e Use XBlock 0.3 2013-09-06 09:45:59 -04:00
Calen Pennington
407b02b358 Centralize startup code, and execute in all contexts
Inspired by: http://eldarion.com/blog/2013/02/14/entry-point-hook-django-projects/
Moves startup code to lms.startup and cms.startup, and calls the startup
methods in wsgi.py and manage.py for both projects.
2013-08-27 12:12:20 -04:00
Diana Huang
3f9431e8cf Provide implicit saves for XBlocks and XModules.
Update existing tests and provide new ones to test new paradigm.
2013-07-18 16:37:34 -04:00
Sarina Canelake
f0c9aa3916 Provide set_many methods for Lms and Mongo KeyValueStores
Refactor new set_many and update XBlock version number.
2013-07-18 15:30:13 -04:00
Felix Sun
c00721bbe6 Fixed the preferences scope of xblock.
Added self to authors.

Conflicts:
	AUTHORS
	CHANGELOG.rst
2013-06-20 10:17:25 -04:00
Calen Pennington
e791e84ea7 Remove the stores_state field from XModule
stores_state is now only used in a single test, in conjunction with
has_score. In practice, it's never the case that stores_state is false
when has_score is true, so we can delete stores_state entirely, and just
use has_score for the grading test.
2013-06-13 14:38:59 -04:00
Jay Zoldak
be76f73107 Consolidate and upgrade factories 2013-04-18 15:11:10 -04:00
Calen Pennington
039ccb83cc Migrate to the open source XBlock repo 2013-04-04 10:55:31 -04:00
Calen Pennington
b7680f3157 Fix tests except for conditional module and open ended grading 2013-03-05 15:04:59 -05:00
Ned Batchelder
9d34767e6a Fix the remaining module storage tests. 2013-02-01 15:45:43 -05:00
Calen Pennington
592d044864 Fix more tests 2013-01-24 14:37:46 -05:00
Calen Pennington
9a3e122a48 Fix a few failing tests 2013-01-24 14:04:03 -05:00
Calen Pennington
993c24b72b WIP: Model data caching work 2013-01-23 14:51:07 -05:00
Calen Pennington
789ac3fc87 Use the XBlock library as the base for XModule, so that we can incrementally rely on more and more of the XBlock api 2013-01-04 16:19:58 -05:00
Calen Pennington
9c5a922eee Create tables for all known scopes, and add tests of the LmsKeyValueStore 2012-12-28 14:55:32 -05:00