Преглед на файлове

Bulk request which try and fail to create multiple indices may never return

This is caused by an NPE in the error handling code. All is well if only 1 index creation fails (or none).

Closes #6436
Boaz Leskes преди 11 години
родител
ревизия
b454f64c57
променени са 2 файла, в които са добавени 13 реда и са изтрити 2 реда
  1. 1 1
      src/main/java/org/elasticsearch/action/bulk/TransportBulkAction.java
  2. 12 1
      src/test/java/org/elasticsearch/document/BulkTests.java

+ 1 - 1
src/main/java/org/elasticsearch/action/bulk/TransportBulkAction.java

@@ -134,7 +134,7 @@ public class TransportBulkAction extends TransportAction<BulkRequest, BulkRespon
                                 // fail all requests involving this index, if create didnt work
                                 for (int i = 0; i < bulkRequest.requests.size(); i++) {
                                     ActionRequest request = bulkRequest.requests.get(i);
-                                    if (setResponseFailureIfIndexMatches(responses, i, request, index, e)) {
+                                    if (request != null && setResponseFailureIfIndexMatches(responses, i, request, index, e)) {
                                         bulkRequest.requests.set(i, null);
                                     }
                                 }

+ 12 - 1
src/test/java/org/elasticsearch/document/BulkTests.java

@@ -40,6 +40,7 @@ import org.elasticsearch.index.query.QueryBuilders;
 import org.elasticsearch.test.ElasticsearchIntegrationTest;
 import org.junit.Test;
 
+import java.util.ArrayList;
 import java.util.Map;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.CyclicBarrier;
@@ -624,10 +625,20 @@ public class BulkTests extends ElasticsearchIntegrationTest {
         int bulkEntryCount = randomIntBetween(10, 50);
         BulkRequestBuilder builder = client().prepareBulk();
         boolean[] expectedFailures = new boolean[bulkEntryCount];
+        ArrayList<String> badIndexNames = new ArrayList<>();
+        for (int i = randomIntBetween(1, 5); i > 0; i--) {
+            badIndexNames.add("INVALID.NAME" + i);
+        }
         boolean expectFailure = false;
         for (int i = 0; i < bulkEntryCount; i++) {
             expectFailure |= expectedFailures[i] = randomBoolean();
-            builder.add(client().prepareIndex().setIndex(expectedFailures[i] ? "INVALID.NAME" : "test").setType("type1").setId("1").setSource("field", 1));
+            String name;
+            if (expectedFailures[i]) {
+                name = randomFrom(badIndexNames);
+            } else {
+                name = "test";
+            }
+            builder.add(client().prepareIndex().setIndex(name).setType("type1").setId("1").setSource("field", 1));
         }
         BulkResponse bulkResponse = builder.get();
         assertThat(bulkResponse.hasFailures(), is(expectFailure));