2013-10-04 7 views
1

우리는 레일 앱에서 타이어 보석과 함께 ElasticSearch를 사용하고 있습니다. 우리의 통합 테스트를 위해, 우리는 삭제하고 FooTire::Model::Persistence을 포함ElasticSearch 비동기 삭제? 200 레일스 앱에서 색인 삭제 직후

Foo.index.delete 
Foo.create_elasticsearch_index 

의 라인을 따라 각각의 예를하기 전에 인덱스, 뭔가를 다시 작성하십시오. 그러나 우리는 CI에서 테스트 스위트를 실행할 때 색인 오류가 누락되기 시작했습니다. 당신이 볼 수 있듯이, 나는 DELETE 요청에 대한 200 OK 응답을, 그러나 타이어가하는 경우 HEAD 요청이 있는지 확인하기 위해

# 2013-10-04 09:25:05:839 [DELETE] ("test_index") 
# 
curl -X DELETE http://some-server:9200/test_index 

# 2013-10-04 09:25:05:840 [200] 
# 
# { 
# "ok": true, 
# "acknowledged": true 
# } 

# 2013-10-04 09:25:05:852 [HEAD] ("test_index") 
# 
curl -I "http://some-server:9200/test_index" 

# 2013-10-04 09:25:05:852 [200] 

: 내가 나서서 디버깅을 활성화하고 나는 로그에 다음과 같은 발견 인덱스를 생성하기 전에 존재하지만, 여전히 404 대신에 200을 리턴합니다. 이것은 무작위로 발생합니다. 대부분의 경우에는 정상적으로 작동하지만 테스트 스위트의 어느 시점에서는 실패 할 것입니다.

삭제와 생성 작업 사이에 노란색 상태가 표시 될 때까지 기다렸지만 작동하지 않았습니다. 그래서 여기에 내 질문은, 인덱스 인덱스 작업을 비동기 방식으로 무엇입니까? (그것에 대해 ES 문서에서 아무 것도 찾을 수 없습니다). 색인을 삭제할 때까지 기다리는 방법이 있습니까? (노란색 상태가 작동하지 않기 때문에).

편집 : 해명을위한 @PinnyM. 그래서 모든 작업은 HTTP API are indeed asynchronous을 통해 이루어집니다. 그래서 남은 질문은 인덱스를 삭제할 때까지 기다려야 인덱스를 다시 만들 수 있다는 것입니다.

+1

모든 HTTP 작업은 비동기, http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/modules-http.html – PinnyM

+0

@PinnyM 감사를 참조하십시오! 질문을 수정했습니다 – julioolvr

답변

1

각 예 전에 색인을 삭제하고 다시 작성하십시오. 이 과정의 일환으로 당신은 ... exists 기능이 엉터리 의사 코드에서 ... false을 반환 할 삭제 프로세스가 폴링 (비동기) 완료했다고 exist에 대한

max_wait = 5 
while wait < max_wait and Tire.index("test_index").exists: 
    wait some more 
    if wait > max_wait: 
     throw WaitedTooLongException() 

타이어 문서를 확인 할 수 현재 위치 - 기본적으로 그들은 당신이 디버그 코드에서 발견 된 같은 인덱스 폴링하고있다 : 당신이하지 넣으면 ... 나는 ES 인스턴스를 사용하여 테스트를 조정할 것, 개인적으로 http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/indices-exists.html

: 여기 http://rubydoc.info/github/karmi/tire/master/Tire/Index#exists?-instance_method 및 전화입니다 -exists는 테스트가 시작될 때 루프를 반복하고 테스트가 끝나면 인덱스를 해체합니다. 그러면 두 가지 이점을 얻을 수 있습니다 ts. 당신은 할 수 : - 친절하고 깨끗한 시작 테스트 할 때 인덱스가 존재하지 않았다

  • 어설 것이다.
  • 테스트가 끝날 때 인덱스를 해체하고 ES가 필요하지 않은 다음 테스트를 실행합니다. 테스트 순서의 App 및 CI 구현에 따라 약간의 속도 향상이 가능합니다. ES에
+1

좋은 생각! 나는 당신의 제안에 따라,'tight_deleted' 메쏘드를'Tire :: Index'에 추가했습니다.이 메쏘드는 5 번 시도 할 것이고 인덱스가 여전히 존재한다면 예외를 던질 것입니다. 그걸로 충분했다. 왜냐하면 내가 본 모든 경우에, 색인은 두 번째 요청에 의해 이미 삭제 되었기 때문이다. 또한 제안 된 방식대로 변경했습니다 (만들기 전의 색인 부재에 대한 확인은'before (: each) '및'after (: each)'에 대한 삭제). 감사! – julioolvr

+0

feedback @ julio.olvr을 보내 주셔서 감사합니다. - 내 psuedo-code가 도움이 되었기 때문에 기쁩니다 (저는 Ruby 개발자가 아닙니다). – jamesc