Есть ли у кого-нибудь параллельные тесты для работы в Django с Elasticsearch? Если да, то не могли бы вы рассказать, какие изменения конфигурации потребовались, чтобы это произошло?
Я перепробовал практически все, что мог придумать, чтобы заставить его работать, включая решение , описанное здесь . Вдохновленный тем, как Django сам выполняет параллельную базу данных, я в настоящее время создал новый пользовательский ParallelTestSuite
, который переопределяет init_worker, чтобы перебирать каждый индекс / тип документа и изменять имена индексов примерно следующим образом:
_worker_id = 0
def _elastic_search_init_worker(counter):
global _worker_id
with counter.get_lock():
counter.value += 1
_worker_id = counter.value
for alias in connections:
connection = connections[alias]
settings_dict = connection.creation.get_test_db_clone_settings(_worker_id)
# connection.settings_dict must be updated in place for changes to be
# reflected in django.db.connections. If the following line assigned
# connection.settings_dict = settings_dict, new threads would connect
# to the default database instead of the appropriate clone.
connection.settings_dict.update(settings_dict)
connection.close()
### Everything above this is from the Django version of this function ###
# Update index names in doctypes
for doc in registry.get_documents():
doc._doc_type.index += f"_{_worker_id}"
# Update index names for indexes and create new indexes
for index in registry.get_indices():
index._name += f"_{_worker_id}"
index.delete(ignore=[404])
index.create()
print(f"Started thread # {_worker_id}")
Похоже, что в целом это работает, однако есть некоторая странность, которая случается, казалось бы, случайным образом (например, повторный запуск набора тестов не дает надежного воспроизведения проблемы и / или изменения сообщений об ошибках). Ниже приведены различные ошибки, которые я получил, и кажется, что при каждом тестовом запуске одна из них случайным образом терпит неудачу:
- Поднимите 404 при попытке создать индекс в приведенной выше функции (я подтвердил, что это 404 возвращается из запроса PUT, однако в журналах сервера Elasticsearch говорится, что он создал индекс без проблем)
- 500 при попытке создать индекс, хотя этого не произошло через некоторое время, поэтому я думаю, что это было исправлено чем-то другим.
- ответы на запросы иногда не имеют значения словаря
items
внутри функции _process_bulk_chunk
из библиотеки elasticsearch
I Я думаю, что на уровне соединения происходит что-то странное (например, каким-то образом соединения между процессами Django test runner смешивают ответы?), но я не понимаю, как это вообще возможно, поскольку Django использует многопроцессорность для распараллеливания тестов, поэтому каждый из них выполняется в своем собственном процессе. Возможно ли, что выделенные процессы все еще пытаются использовать пул соединений исходного процесса или что-то в этом роде? У меня нет других вещей, которые можно попробовать отсюда, и я был бы очень признателен за некоторые подсказки или даже просто подтверждение того, что это действительно возможно.