Commit 12130c80 by Eric Fischer

Fixing CohortMembership and ATOMIC_REQUESTS issue

What had been happening was related to the fact that ATOMIC_REQUESTS is now on,
preventing writing to the database until a request is completed.

The problem with that was that CohortMemberships, with their explicit
transaction handling, were breaking that rule and touching the database.
The CohortMembership needs to also touch the database to update the
underlying course_user_groups information, to prevent the database from
getting into a strange state.

After this commit, every time a CohortMembership is updated or created, the
corresponding course_user_groups are also updated and explicitly written to
the database. This occurs atomically with the CohortMembership, and does not
wait for the end of the request.
parent fba6b4db
...@@ -98,9 +98,12 @@ class CohortMembership(models.Model): ...@@ -98,9 +98,12 @@ class CohortMembership(models.Model):
success = False success = False
for __ in range(max_retries): for __ in range(max_retries):
# This block will transactionally commit updates to CohortMembership and underlying course_user_groups.
with transaction.atomic(): with transaction.atomic():
try: try:
# This block is atomic in order to make CohortMembership creation a small operation.
# It will commit the creation of the new CohortMembership, if needed.
with transaction.atomic(): with transaction.atomic():
saved_membership, created = CohortMembership.objects.select_for_update().get_or_create( saved_membership, created = CohortMembership.objects.select_for_update().get_or_create(
user__id=self.user.id, user__id=self.user.id,
...@@ -123,9 +126,11 @@ class CohortMembership(models.Model): ...@@ -123,9 +126,11 @@ class CohortMembership(models.Model):
self.previous_cohort_name = saved_membership.course_user_group.name self.previous_cohort_name = saved_membership.course_user_group.name
self.previous_cohort_id = saved_membership.course_user_group.id self.previous_cohort_id = saved_membership.course_user_group.id
self.previous_cohort.users.remove(self.user) self.previous_cohort.users.remove(self.user)
self.previous_cohort.save()
saved_membership.course_user_group = self.course_user_group saved_membership.course_user_group = self.course_user_group
self.course_user_group.users.add(self.user) self.course_user_group.users.add(self.user)
self.course_user_group.save()
super(CohortMembership, saved_membership).save(update_fields=['course_user_group']) super(CohortMembership, saved_membership).save(update_fields=['course_user_group'])
......
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