Provide the TransportRequest during validation of a search context (#24985)

This commit provides the TransportRequest that caused the retrieval of a search context to the
SearchOperationListener#validateSearchContext method so that implementers have access to the
request.
This commit is contained in:
Jay Modi 2017-06-01 07:49:58 -06:00 committed by GitHub
parent 45bdaeced5
commit 7526c29a05
3 changed files with 18 additions and 12 deletions

View File

@ -23,6 +23,7 @@ import org.apache.logging.log4j.message.ParameterizedMessage;
import org.apache.logging.log4j.util.Supplier;
import org.elasticsearch.ExceptionsHelper;
import org.elasticsearch.search.internal.SearchContext;
import org.elasticsearch.transport.TransportRequest;
import java.util.List;
@ -110,8 +111,9 @@ public interface SearchOperationListener {
* from the active contexts. If the context is deemed invalid a runtime
* exception can be thrown, which will prevent the context from being used.
* @param context the context retrieved from the active contexts
* @param transportRequest the request that is going to use the search context
*/
default void validateSearchContext(SearchContext context) {}
default void validateSearchContext(SearchContext context, TransportRequest transportRequest) {}
/**
* A Composite listener that multiplexes calls to each of the listeners methods.
@ -236,11 +238,11 @@ public interface SearchOperationListener {
}
@Override
public void validateSearchContext(SearchContext context) {
public void validateSearchContext(SearchContext context, TransportRequest request) {
Exception exception = null;
for (SearchOperationListener listener : listeners) {
try {
listener.validateSearchContext(context);
listener.validateSearchContext(context, request);
} catch (Exception e) {
exception = ExceptionsHelper.useOrSuppress(exception, e);
}

View File

@ -85,6 +85,7 @@ import org.elasticsearch.search.suggest.completion.CompletionSuggestion;
import org.elasticsearch.threadpool.ThreadPool;
import org.elasticsearch.threadpool.ThreadPool.Cancellable;
import org.elasticsearch.threadpool.ThreadPool.Names;
import org.elasticsearch.transport.TransportRequest;
import java.io.IOException;
import java.util.Collections;
@ -309,7 +310,7 @@ public class SearchService extends AbstractLifecycleComponent implements IndexEv
}
public ScrollQuerySearchResult executeQueryPhase(InternalScrollSearchRequest request, SearchTask task) {
final SearchContext context = findContext(request.id());
final SearchContext context = findContext(request.id(), request);
SearchOperationListener operationListener = context.indexShard().getSearchOperationListener();
context.incRef();
try {
@ -333,7 +334,7 @@ public class SearchService extends AbstractLifecycleComponent implements IndexEv
}
public QuerySearchResult executeQueryPhase(QuerySearchRequest request, SearchTask task) {
final SearchContext context = findContext(request.id());
final SearchContext context = findContext(request.id(), request);
context.setTask(task);
IndexShard indexShard = context.indexShard();
SearchOperationListener operationListener = indexShard.getSearchOperationListener();
@ -374,7 +375,7 @@ public class SearchService extends AbstractLifecycleComponent implements IndexEv
}
public ScrollQueryFetchSearchResult executeFetchPhase(InternalScrollSearchRequest request, SearchTask task) {
final SearchContext context = findContext(request.id());
final SearchContext context = findContext(request.id(), request);
context.incRef();
try {
context.setTask(task);
@ -405,7 +406,7 @@ public class SearchService extends AbstractLifecycleComponent implements IndexEv
}
public FetchSearchResult executeFetchPhase(ShardFetchRequest request, SearchTask task) {
final SearchContext context = findContext(request.id());
final SearchContext context = findContext(request.id(), request);
final SearchOperationListener operationListener = context.indexShard().getSearchOperationListener();
context.incRef();
try {
@ -435,7 +436,7 @@ public class SearchService extends AbstractLifecycleComponent implements IndexEv
}
}
private SearchContext findContext(long id) throws SearchContextMissingException {
private SearchContext findContext(long id, TransportRequest request) throws SearchContextMissingException {
SearchContext context = activeContexts.get(id);
if (context == null) {
throw new SearchContextMissingException(id);
@ -443,7 +444,7 @@ public class SearchService extends AbstractLifecycleComponent implements IndexEv
SearchOperationListener operationListener = context.indexShard().getSearchOperationListener();
try {
operationListener.validateSearchContext(context);
operationListener.validateSearchContext(context, request);
return context;
} catch (Exception e) {
processFailure(context, e);

View File

@ -21,6 +21,8 @@ package org.elasticsearch.index.shard;
import org.elasticsearch.search.internal.SearchContext;
import org.elasticsearch.test.ESTestCase;
import org.elasticsearch.test.TestSearchContext;
import org.elasticsearch.transport.TransportRequest;
import org.elasticsearch.transport.TransportRequest.Empty;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
@ -112,7 +114,7 @@ public class SearchOperationListenerTests extends ESTestCase {
}
@Override
public void validateSearchContext(SearchContext context) {
public void validateSearchContext(SearchContext context, TransportRequest request) {
assertNotNull(context);
validateSearchContext.incrementAndGet();
}
@ -267,9 +269,10 @@ public class SearchOperationListenerTests extends ESTestCase {
assertEquals(0, validateSearchContext.get());
if (throwingListeners == 0) {
compositeListener.validateSearchContext(ctx);
compositeListener.validateSearchContext(ctx, Empty.INSTANCE);
} else {
RuntimeException expected = expectThrows(RuntimeException.class, () -> compositeListener.validateSearchContext(ctx));
RuntimeException expected =
expectThrows(RuntimeException.class, () -> compositeListener.validateSearchContext(ctx, Empty.INSTANCE));
assertNull(expected.getMessage());
assertEquals(throwingListeners - 1, expected.getSuppressed().length);
if (throwingListeners > 1) {