Commit 2252ce6a by John Eskew

Ignore IntegrityErrors upon set_many update save().

parent d5c48e55
...@@ -6,7 +6,7 @@ data in a Django ORM model. ...@@ -6,7 +6,7 @@ data in a Django ORM model.
import itertools import itertools
from operator import attrgetter from operator import attrgetter
from time import time from time import time
import logging
try: try:
import simplejson as json import simplejson as json
except ImportError: except ImportError:
...@@ -14,10 +14,14 @@ except ImportError: ...@@ -14,10 +14,14 @@ except ImportError:
import dogstats_wrapper as dog_stats_api import dogstats_wrapper as dog_stats_api
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.db import transaction
from django.db.utils import IntegrityError
from xblock.fields import Scope from xblock.fields import Scope
from courseware.models import StudentModule, BaseStudentModuleHistory from courseware.models import StudentModule, BaseStudentModuleHistory
from edx_user_state_client.interface import XBlockUserStateClient, XBlockUserState from edx_user_state_client.interface import XBlockUserStateClient, XBlockUserState
log = logging.getLogger(__name__)
class DjangoXBlockUserStateClient(XBlockUserStateClient): class DjangoXBlockUserStateClient(XBlockUserStateClient):
""" """
...@@ -222,8 +226,19 @@ class DjangoXBlockUserStateClient(XBlockUserStateClient): ...@@ -222,8 +226,19 @@ class DjangoXBlockUserStateClient(XBlockUserStateClient):
current_state.update(state) current_state.update(state)
num_fields_after = len(current_state) num_fields_after = len(current_state)
student_module.state = json.dumps(current_state) student_module.state = json.dumps(current_state)
# We just read this object, so we know that we can do an update try:
student_module.save(force_update=True) with transaction.atomic():
# Updating the object - force_update guarantees no INSERT will occur.
student_module.save(force_update=True)
except IntegrityError:
# The UPDATE above failed. Log information - but ignore the error.
# See https://openedx.atlassian.net/browse/TNL-5365
log.warning("set_many: IntegrityError for student {} - course_id {} - usage key {}".format(
user, usage_key.course_key, usage_key
))
log.warning("set_many: All {} block keys: {}".format(
len(block_keys_to_state), block_keys_to_state.keys()
))
# The rest of this method exists only to submit DataDog events. # The rest of this method exists only to submit DataDog events.
# Remove it once we're no longer interested in the data. # Remove it once we're no longer interested in the data.
......
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