diff --git a/docs/changelog/138122.yaml b/docs/changelog/138122.yaml new file mode 100644 index 0000000000000..928f1d72577cd --- /dev/null +++ b/docs/changelog/138122.yaml @@ -0,0 +1,6 @@ +pr: 138122 +summary: Add validation for updating `num_threads` +area: Machine Learning +type: bug +issues: + - 137129 diff --git a/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/elasticsearch/ElasticsearchInternalServiceSettings.java b/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/elasticsearch/ElasticsearchInternalServiceSettings.java index 73aedfdf50ce6..4d8336a953e55 100644 --- a/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/elasticsearch/ElasticsearchInternalServiceSettings.java +++ b/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/elasticsearch/ElasticsearchInternalServiceSettings.java @@ -234,6 +234,10 @@ public ElasticsearchInternalServiceSettings updateServiceSettings(Map(serviceSettings); + if (serviceSettings.containsKey(NUM_THREADS)) { + validationException.addValidationError(Strings.format("[%s] cannot be updated", NUM_THREADS)); + } + var numAllocations = extractOptionalPositiveInteger( mutableServiceSettings, NUM_ALLOCATIONS, diff --git a/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/services/elasticsearch/ElasticsearchInternalServiceTests.java b/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/services/elasticsearch/ElasticsearchInternalServiceTests.java index 68538608513bb..70e1b15be261c 100644 --- a/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/services/elasticsearch/ElasticsearchInternalServiceTests.java +++ b/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/services/elasticsearch/ElasticsearchInternalServiceTests.java @@ -18,6 +18,7 @@ import org.elasticsearch.action.support.PlainActionFuture; import org.elasticsearch.client.internal.Client; import org.elasticsearch.cluster.service.ClusterService; +import org.elasticsearch.common.ValidationException; import org.elasticsearch.common.bytes.BytesArray; import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.common.logging.DeprecationLogger; @@ -2205,6 +2206,17 @@ public void test_providedTimeoutPropagateProperly() throws InterruptedException assertEquals(providedTimeout, requestCaptor.getValue().getInferenceTimeout()); } + public void testUpdateServiceSettings_ThrowsExceptionWhenNumThreadsIsUpdated() { + var existingSettings = new ElasticsearchInternalServiceSettings(1, 4, "test-model", null, null); + + Map serviceSettingsWithNumThreads = Map.of(ElasticsearchInternalServiceSettings.NUM_THREADS, 8); + var exception = expectThrows( + ValidationException.class, + () -> existingSettings.updateServiceSettings(serviceSettingsWithNumThreads) + ); + assertThat(exception.getMessage(), containsString("[num_threads] cannot be updated")); + } + private ElasticsearchInternalService createService(Client client) { var cs = mock(ClusterService.class); var cSettings = new ClusterSettings(Settings.EMPTY, Set.of(MachineLearningField.MAX_LAZY_ML_NODES));