diff --git a/docs/changelog/115363.yaml b/docs/changelog/115363.yaml new file mode 100644 index 0000000000000..8bc4b92a24229 --- /dev/null +++ b/docs/changelog/115363.yaml @@ -0,0 +1,5 @@ +pr: 115363 +summary: Avoid use of `GroupedActionListener` when the group size is zero +area: Machine Learning +type: bug +issues: [] diff --git a/server/src/main/java/org/elasticsearch/action/support/GroupedActionListener.java b/server/src/main/java/org/elasticsearch/action/support/GroupedActionListener.java index 6e4b2ee546bd6..f44c1573ed030 100644 --- a/server/src/main/java/org/elasticsearch/action/support/GroupedActionListener.java +++ b/server/src/main/java/org/elasticsearch/action/support/GroupedActionListener.java @@ -35,8 +35,9 @@ public final class GroupedActionListener extends DelegatingActionListener> delegate) { + public GroupedActionListener(int groupSize, ActionListener> delegate) throws IllegalArgumentException { super(delegate); if (groupSize <= 0) { assert false : "illegal group size [" + groupSize + "]"; diff --git a/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/action/TransportGetInferenceModelAction.java b/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/action/TransportGetInferenceModelAction.java index 01e663df4a3ea..292bb7692aaf0 100644 --- a/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/action/TransportGetInferenceModelAction.java +++ b/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/action/TransportGetInferenceModelAction.java @@ -16,6 +16,7 @@ import org.elasticsearch.common.util.concurrent.EsExecutors; import org.elasticsearch.inference.InferenceServiceRegistry; import org.elasticsearch.inference.Model; +import org.elasticsearch.inference.ModelConfigurations; import org.elasticsearch.inference.TaskType; import org.elasticsearch.inference.UnparsedModel; import org.elasticsearch.injection.guice.Inject; @@ -148,25 +149,32 @@ private void parseModels(List unparsedModels, ActionListener>( - parsedModelsByService.entrySet().size(), - listener.delegateFailureAndWrap((delegate, listOfListOfModels) -> { - var modifiable = new ArrayList(); - for (var l : listOfListOfModels) { - modifiable.addAll(l); - } - modifiable.sort(Comparator.comparing(Model::getInferenceEntityId)); - delegate.onResponse( - new GetInferenceModelAction.Response(modifiable.stream().map(Model::getConfigurations).collect(Collectors.toList())) - ); - }) - ); - - for (var entry : parsedModelsByService.entrySet()) { - serviceRegistry.getService(entry.getKey()) - .get() // must be non-null to get this far - .updateModelsWithDynamicFields(entry.getValue(), groupedListener); + if (parsedModelsByService.isEmpty() == false) { + var groupedListener = new GroupedActionListener>( + parsedModelsByService.entrySet().size(), + listener.delegateFailureAndWrap((delegate, listOfListOfModels) -> { + var modifiable = new ArrayList(); + for (var l : listOfListOfModels) { + modifiable.addAll(l); + } + modifiable.sort(Comparator.comparing(Model::getInferenceEntityId)); + delegate.onResponse( + new GetInferenceModelAction.Response( + modifiable.stream().map(Model::getConfigurations).collect(Collectors.toList()) + ) + ); + }) + ); + + for (var entry : parsedModelsByService.entrySet()) { + serviceRegistry.getService(entry.getKey()) + .get() // must be non-null to get this far + .updateModelsWithDynamicFields(entry.getValue(), groupedListener); + } + } else { + listener.onResponse(new GetInferenceModelAction.Response(new ArrayList(0))); } + } catch (Exception e) { listener.onFailure(e); }