В некоторых автоматизированных тестах я пытаюсь удалить и сразу же заново создать индекс в начале каждого теста, используя высокоуровневый клиент ElasticSearch (версия 6.4), следующим образом:
DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest(indexName);
deleteIndexRequest.indicesOptions(IndicesOptions.lenientExpandOpen());
client.indices().delete(deleteIndexRequest, RequestOptions.DEFAULT);
CreateIndexRequest createIndexRequest = new CreateIndexRequest(indexName);
request.mapping("_doc", "{...}", XContentType.JSON);
client.indices().create(request, RequestOptions.DEFAULT);
у меня проблема в том, что периодически мои тесты терпят неудачу в момент создания индекса с ошибкой:
{"error": {"root_cause":[{"type":"resource_already_exists_exception","reason":"index [(index-name)/(UUID)] already exists, ...,}] "status":400}
Чем больше тестов я запускаю, тем больше вероятность появления ошибки, которая кажетсячтобы быть сильным показателем того, что это состояние гонки - возможно, когда я пытаюсь воссоздать индекс, предыдущая операция удаления не всегда завершается.
Это подтверждается тем фактом, что если я поставлю точку остановасразу после операции удаления и вручную запустив запрос curl
для просмотра индекса, который я пытался удалить, я обнаружил, что он все еще существует некоторое время;в этих случаях появляется ошибка выше, если я продолжу тестирование.
Я пытался установить метод isAcknowledged()
ответа на операцию удаления, но он всегда возвращает true
, даже в тех случаях, когдавозникает ошибка.
Я также пытался выполнить проверку exists()
перед операцией создания.Интересно, что в этом случае, если я запускаю тесты без точек останова, проверка exists()
всегда возвращает false
(то есть, что индекс не существует) даже в тех случаях, когда в этом случае произойдет ошибка, , но , еслиЯ ставлю точку останова перед операцией создания, затем проверка exists()
возвращает true
в случаях, когда произойдет ошибка.
Я немного растерялся.Насколько я понимаю, мои запросы должны быть синхронными, и из комментария к к этому вопросу это должно означать, что операция delete()
возвращается только тогда, когда индекс определенно был удален.
Я подозреваю, что ключевой частью проблемы может быть то, что эти тесты выполняются на кластере из 3 узлов.При настройке клиента я обращаюсь только к одному из узлов:
client = new RestHighLevelClient(RestClient.builder(new HttpHost("example.com", 9200, "https")));
, но вижу, что каждая операция реплицируется на два других узла.
Когда я останавливаюсьТочка останова перед операцией создания, в случаях, когда индекс не удаляется, я вижу, что он не удаляется ни на одном из узлов, и, кажется, не имеет значения, как долго я жду, он никогда не удаляется.
Можно ли как-нибудь надежно определить, был ли индекс удален перед его созданием?Или, может быть, мне нужно что-то сделать до Я пытаюсь выполнить операцию удаления, чтобы гарантировать ее успешность?