Повторная запись с txnNumber 4 запрещена на сессии | Django и MongoDB
Как сделать атомарное обновление в приведенном ниже коде
следующая строка кода выдает ошибку:
self._large_results.replace(json_result, encoding='utf-8', content_type='application/json')
Код приложения:
class MyWrapper(EmbeddedDocument):
# Set the maximum size to 12 MB
MAXIMUM_MONGO_DOCUMENT_SIZE = 12582912
# Lock object to lock while updating the _large_result
lock = threading.Lock()
# The default location to save results
results = DictField()
# When the results are very large (> 16M mongo will not save it in
# a single document. We will use a file field to store these)
_large_results = FileField(required=True)
def large_results(self):
try:
self._large_results.seek(0)
return json.load(self._large_results)
except:
return {}
# Whether we are using the _large_results field
using_large_results = BooleanField(default=False)
def __get_true_result(self):
if self.using_large_results:
self._large_results.seek(0)
try:
return json.loads(self._large_results.read() or '{}')
except:
logger.exception("Error while json converting from _large_result")
raise InvalidResultError
else:
return self.results
def __set_true_result(self, result, result_class, update=False):
class_name = result_class.__name__
valid_result = self.__get_true_result()
with self.lock:
try:
current = valid_result[class_name] if update else {}
except:
current = {}
if update:
current.update(result)
else:
current = result
valid_result.update({class_name: current})
json_result = json.dumps(valid_result)
self.using_large_results = len(json_result) >= self.MAXIMUM_MONGO_DOCUMENT_SIZE
if self.using_large_results:
self._large_results.replace(json_result, encoding='utf-8', content_type='application/json')
self.results = {}
self._large_results.seek(0)
else:
self.results = valid_result
self._large_results.replace('{}', encoding='utf-8', content_type='application/json')
Используем Django с Mongo, развернутым в кластере, и Celery для выполнения этих утверждений.
получаем следующую ошибку -
mongoengine.errors.OperationError: Could not save document (Retryable write with txnNumber 4 is prohibited on session e6d643cc-8f77-4589-b754-3fddb332b1b9 - 47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU= - - because a newer retryable write with txnNumber 6 has already started on this session.).
Любая информация/помощь приветствуется