2013-10-04 61 views
1

我們使用ElasticSearch和Rails應用程序中的Tire gem。對於我們的集成測試,我們刪除並重新創建沿ElasticSearch異步刪除? 200在刪除Rails應用程序中的索引之後

Foo.index.delete 
Foo.create_elasticsearch_index 

Foo包括Tire::Model::Persistence行,每例前的指數,一些東西。但是當我們在CI上運行我們的測試套件時,我們開始時常缺少索引錯誤。我繼續啓用調試,然後我發現在日誌中以下內容:

# 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] 

正如你所看到的,我得到了刪除請求200 OK響應,但後來當輪胎做一個HEAD請求,看是否該索引在創建之前就已經存在,它仍然會返回200而不是404.這種情況是隨機發生的,大多數時候它的工作正常,但是在測試套件中的某個時刻它會失敗。

我試圖等待刪除和創建操作之間的黃色狀態,但它沒有奏效。所以我的問題在於,刪除索引操作是否以某種方式異步? (在ES文檔上找不到任何關於這個的東西)。有什麼方法可以等待索引被刪除嗎? (由於黃色狀態不起作用)。

編輯:謝謝@PinnyM的澄清。所以所有的操作都通過HTTP API are indeed asynchronous。所以現在仍然存在的問題是,我如何等待索引被刪除,以便我可以再次創建它?

+1

所有到ES的HTTP操作都是異步的,請參閱http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/modules-http.html – PinnyM

+0

@PinnyM謝謝!編輯問題 – julioolvr

回答

1

在每個示例之前,您將刪除並重新創建索引。作爲這一過程的一部分,然後你可以確保在刪除過程完成時(異步)通過輪詢爲exists函數返回false ...在蹩腳的僞代碼...

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

exist的輪胎文檔在這裏 - 基本上是他們在做你在調試代碼中發現了相同的索引查詢: http://rubydoc.info/github/karmi/tire/master/Tire/Index#exists?-instance_method和這裏的電話:http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/indices-exists.html

就個人而言,我會調整使用的ES比如你的測試......如果你把不 - 在測試開始時存在循環並在測試結束時將索引拆下,然後您可以獲得兩個益處TS。您可以:

  • 斷言測試開始時索引不存在 - 非常乾淨。
  • 在測試結束時要求索引拆除,並運行可能不需要ES的下一個測試 - 根據您的App和CI實施測試訂購,可能會有輕微的加速。
+1

好主意!我按照你的建議,在'Tire :: Index'中添加了一個小的'ensure_deleted'方法,如果索引仍然存在,它會嘗試5次並拋出異常。這足夠了,因爲在我看到的所有情況中,索引已被第二個請求刪除。另外,我按照你的建議改變了它(檢查'before(:each)'前創建索引缺失並在'after(:each)'後刪除它)。謝謝! – julioolvr

+0

感謝您的反饋@ julio.olvr - 很高興我的psuedo代碼很有幫助(我不是Ruby開發者)。 – jamesc