Skip to content

Commit 1661c33

Browse files
committed
Percolate: Failure to percolate with specific query (when creating the _percolate index before the actual index), closes elastic#725.
1 parent d34a30a commit 1661c33

File tree

3 files changed

+18
-45
lines changed

3 files changed

+18
-45
lines changed

modules/elasticsearch/src/main/java/org/elasticsearch/index/percolator/PercolatorExecutor.java

Lines changed: 10 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,8 @@
5555
import org.elasticsearch.index.query.xcontent.QueryBuilders;
5656
import org.elasticsearch.index.service.IndexService;
5757
import org.elasticsearch.index.settings.IndexSettings;
58-
import org.elasticsearch.index.shard.ShardId;
5958
import org.elasticsearch.index.shard.service.IndexShard;
60-
import org.elasticsearch.indices.IndicesLifecycle;
59+
import org.elasticsearch.indices.IndicesService;
6160

6261
import java.io.IOException;
6362
import java.io.Reader;
@@ -170,13 +169,7 @@ public List<String> matches() {
170169
private volatile ImmutableMap<String, Query> queries = ImmutableMap.of();
171170

172171

173-
private final PercolatorIndexAndShardListener percolatorIndexAndShardListener = new PercolatorIndexAndShardListener();
174-
175-
private volatile IndicesLifecycle indicesLifecycle;
176-
177-
private volatile IndexService percolatorIndex;
178-
179-
private volatile IndexShard percolatorShard;
172+
private IndicesService indicesService;
180173

181174
@Inject public PercolatorExecutor(Index index, @IndexSettings Settings indexSettings,
182175
MapperService mapperService, IndexQueryParserService queryParserService,
@@ -187,17 +180,11 @@ public List<String> matches() {
187180
this.indexCache = indexCache;
188181
}
189182

190-
public void setIndicesLifecycle(IndicesLifecycle indicesLifecycle) {
191-
this.indicesLifecycle = indicesLifecycle;
192-
if (indicesLifecycle != null) {
193-
indicesLifecycle.addListener(percolatorIndexAndShardListener);
194-
}
183+
public void setIndicesService(IndicesService indicesService) {
184+
this.indicesService = indicesService;
195185
}
196186

197187
public synchronized void close() {
198-
if (indicesLifecycle != null) {
199-
indicesLifecycle.removeListener(percolatorIndexAndShardListener);
200-
}
201188
ImmutableMap<String, Query> old = queries;
202189
queries = ImmutableMap.of();
203190
old.clear();
@@ -362,9 +349,14 @@ public Response percolate(DocAndQueryRequest request) throws ElasticSearchExcept
362349
}
363350
}
364351
} else {
365-
if (percolatorIndex == null || percolatorShard == null) {
352+
IndexService percolatorIndex = indicesService.indexService(PercolatorService.INDEX_NAME);
353+
if (percolatorIndex == null) {
366354
throw new PercolateIndexUnavailable(new Index(PercolatorService.INDEX_NAME));
367355
}
356+
if (percolatorIndex.numberOfShards() == 0) {
357+
throw new PercolateIndexUnavailable(new Index(PercolatorService.INDEX_NAME));
358+
}
359+
IndexShard percolatorShard = percolatorIndex.shard(0);
368360
Engine.Searcher percolatorSearcher = percolatorShard.searcher();
369361
try {
370362
percolatorSearcher.searcher().search(request.query(), new QueryCollector(logger, queries, searcher, percolatorIndex, matches));
@@ -380,32 +372,6 @@ public Response percolate(DocAndQueryRequest request) throws ElasticSearchExcept
380372
return new Response(matches, request.doc().mappersAdded());
381373
}
382374

383-
class PercolatorIndexAndShardListener extends IndicesLifecycle.Listener {
384-
@Override public void afterIndexCreated(IndexService indexService) {
385-
if (indexService.index().name().equals(PercolatorService.INDEX_NAME)) {
386-
percolatorIndex = indexService;
387-
}
388-
}
389-
390-
@Override public void afterIndexClosed(Index index, boolean delete) {
391-
if (index.name().equals(PercolatorService.INDEX_NAME)) {
392-
percolatorIndex = null;
393-
}
394-
}
395-
396-
@Override public void afterIndexShardCreated(IndexShard indexShard) {
397-
if (indexShard.shardId().index().name().equals(PercolatorService.INDEX_NAME)) {
398-
percolatorShard = indexShard;
399-
}
400-
}
401-
402-
@Override public void afterIndexShardClosed(ShardId shardId, boolean delete) {
403-
if (shardId.index().name().equals(PercolatorService.INDEX_NAME)) {
404-
percolatorShard = null;
405-
}
406-
}
407-
}
408-
409375
static class QueryCollector extends Collector {
410376
private final IndexSearcher searcher;
411377
private final IndexService percolatorIndex;

modules/elasticsearch/src/main/java/org/elasticsearch/index/percolator/PercolatorService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ public class PercolatorService extends AbstractIndexComponent {
7171
this.percolator = percolator;
7272
this.shardLifecycleListener = new ShardLifecycleListener();
7373
this.indicesService.indicesLifecycle().addListener(shardLifecycleListener);
74-
this.percolator.setIndicesLifecycle(indicesService.indicesLifecycle());
74+
this.percolator.setIndicesService(indicesService);
7575
}
7676

7777
public void close() {

modules/test/integration/src/test/java/org/elasticsearch/test/integration/percolator/SimplePercolatorTests.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,13 @@ protected Client getClient() {
8888
.endObject().endObject())
8989
.execute().actionGet();
9090
assertThat(percolate.matches().size(), equalTo(1));
91+
92+
percolate = client.preparePercolate("test", "type1").setSource(jsonBuilder().startObject()
93+
.startObject("doc").field("field1", "value1").endObject()
94+
.field("query", matchAllQuery())
95+
.endObject())
96+
.execute().actionGet();
97+
assertThat(percolate.matches().size(), equalTo(1));
9198
}
9299

93100
@Test public void createIndexAndThenRegisterPercolator() throws Exception {

0 commit comments

Comments
 (0)