|
31 | 31 | import org.elasticsearch.action.support.BaseAction;
|
32 | 32 | import org.elasticsearch.cluster.ClusterService;
|
33 | 33 | import org.elasticsearch.cluster.ClusterState;
|
| 34 | +import org.elasticsearch.cluster.metadata.MappingMetaData; |
| 35 | +import org.elasticsearch.cluster.routing.GroupShardsIterator; |
| 36 | +import org.elasticsearch.cluster.routing.ShardsIterator; |
34 | 37 | import org.elasticsearch.common.UUID;
|
35 | 38 | import org.elasticsearch.common.collect.Lists;
|
36 | 39 | import org.elasticsearch.common.collect.Maps;
|
@@ -154,20 +157,39 @@ private void executeBulk(final BulkRequest bulkRequest, final ActionListener<Bul
|
154 | 157 | Map<ShardId, List<BulkItemRequest>> requestsByShard = Maps.newHashMap();
|
155 | 158 | for (int i = 0; i < bulkRequest.requests.size(); i++) {
|
156 | 159 | ActionRequest request = bulkRequest.requests.get(i);
|
157 |
| - ShardId shardId = null; |
158 | 160 | if (request instanceof IndexRequest) {
|
159 | 161 | IndexRequest indexRequest = (IndexRequest) request;
|
160 |
| - shardId = clusterService.operationRouting().indexShards(clusterState, indexRequest.index(), indexRequest.type(), indexRequest.id(), indexRequest.routing()).shardId(); |
| 162 | + ShardId shardId = clusterService.operationRouting().indexShards(clusterState, indexRequest.index(), indexRequest.type(), indexRequest.id(), indexRequest.routing()).shardId(); |
| 163 | + List<BulkItemRequest> list = requestsByShard.get(shardId); |
| 164 | + if (list == null) { |
| 165 | + list = Lists.newArrayList(); |
| 166 | + requestsByShard.put(shardId, list); |
| 167 | + } |
| 168 | + list.add(new BulkItemRequest(i, request)); |
161 | 169 | } else if (request instanceof DeleteRequest) {
|
162 | 170 | DeleteRequest deleteRequest = (DeleteRequest) request;
|
163 |
| - shardId = clusterService.operationRouting().deleteShards(clusterState, deleteRequest.index(), deleteRequest.type(), deleteRequest.id(), deleteRequest.routing()).shardId(); |
164 |
| - } |
165 |
| - List<BulkItemRequest> list = requestsByShard.get(shardId); |
166 |
| - if (list == null) { |
167 |
| - list = Lists.newArrayList(); |
168 |
| - requestsByShard.put(shardId, list); |
| 171 | + MappingMetaData mappingMd = clusterState.metaData().index(deleteRequest.index()).mapping(deleteRequest.type()); |
| 172 | + if (mappingMd != null && mappingMd.routing().required() && deleteRequest.routing() == null) { |
| 173 | + // if routing is required, and no routing on the delete request, we need to broadcast it.... |
| 174 | + GroupShardsIterator groupShards = clusterService.operationRouting().broadcastDeleteShards(clusterState, deleteRequest.index()); |
| 175 | + for (ShardsIterator shardsId : groupShards) { |
| 176 | + List<BulkItemRequest> list = requestsByShard.get(shardsId.shardId()); |
| 177 | + if (list == null) { |
| 178 | + list = Lists.newArrayList(); |
| 179 | + requestsByShard.put(shardsId.shardId(), list); |
| 180 | + } |
| 181 | + list.add(new BulkItemRequest(i, request)); |
| 182 | + } |
| 183 | + } else { |
| 184 | + ShardId shardId = clusterService.operationRouting().deleteShards(clusterState, deleteRequest.index(), deleteRequest.type(), deleteRequest.id(), deleteRequest.routing()).shardId(); |
| 185 | + List<BulkItemRequest> list = requestsByShard.get(shardId); |
| 186 | + if (list == null) { |
| 187 | + list = Lists.newArrayList(); |
| 188 | + requestsByShard.put(shardId, list); |
| 189 | + } |
| 190 | + list.add(new BulkItemRequest(i, request)); |
| 191 | + } |
169 | 192 | }
|
170 |
| - list.add(new BulkItemRequest(i, request)); |
171 | 193 | }
|
172 | 194 |
|
173 | 195 | final AtomicInteger counter = new AtomicInteger(requestsByShard.size());
|
|
0 commit comments