diff --git a/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/registry/ModelRegistry.java b/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/registry/ModelRegistry.java index c93bebe6f2ce8..1f5a2cd50c01d 100644 --- a/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/registry/ModelRegistry.java +++ b/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/registry/ModelRegistry.java @@ -46,6 +46,7 @@ import org.elasticsearch.common.xcontent.XContentHelper; import org.elasticsearch.core.TimeValue; import org.elasticsearch.core.Tuple; +import org.elasticsearch.gateway.GatewayService; import org.elasticsearch.index.engine.VersionConflictEngineException; import org.elasticsearch.index.query.QueryBuilder; import org.elasticsearch.index.query.QueryBuilders; @@ -627,8 +628,8 @@ public void storeModel(Model model, ActionListener listener, TimeValue storeModel(model, true, listener, timeout); } - private void storeModel(Model model, boolean addToClusterState, ActionListener listener, TimeValue timeout) { - ActionListener bulkResponseActionListener = getStoreIndexListener(model, addToClusterState, listener, timeout); + private void storeModel(Model model, boolean updateClusterState, ActionListener listener, TimeValue timeout) { + ActionListener bulkResponseActionListener = getStoreIndexListener(model, updateClusterState, listener, timeout); IndexRequest configRequest = createIndexRequest( Model.documentId(model.getConfigurations().getInferenceEntityId()), @@ -653,7 +654,7 @@ private void storeModel(Model model, boolean addToClusterState, ActionListener getStoreIndexListener( Model model, - boolean addToClusterState, + boolean updateClusterState, ActionListener listener, TimeValue timeout ) { @@ -680,7 +681,7 @@ private ActionListener getStoreIndexListener( BulkItemResponse.Failure failure = getFirstBulkFailure(bulkItemResponses); if (failure == null) { - if (addToClusterState) { + if (updateClusterState) { var storeListener = getStoreMetadataListener(inferenceEntityId, listener); try { var projectId = clusterService.state().projectState().projectId(); @@ -777,7 +778,8 @@ public synchronized void removeDefaultConfigs(Set inferenceEntityIds, Ac } defaultConfigIds.keySet().removeAll(inferenceEntityIds); - deleteModels(inferenceEntityIds, listener); + // default models are not stored in the cluster state. + deleteModels(inferenceEntityIds, false, listener); } public void deleteModel(String inferenceEntityId, ActionListener listener) { @@ -785,6 +787,10 @@ public void deleteModel(String inferenceEntityId, ActionListener listen } public void deleteModels(Set inferenceEntityIds, ActionListener listener) { + deleteModels(inferenceEntityIds, true, listener); + } + + private void deleteModels(Set inferenceEntityIds, boolean updateClusterState, ActionListener listener) { var lockedInferenceIds = new HashSet<>(inferenceEntityIds); lockedInferenceIds.retainAll(preventDeletionLock); @@ -803,16 +809,25 @@ public void deleteModels(Set inferenceEntityIds, ActionListener } var request = createDeleteRequest(inferenceEntityIds); - client.execute(DeleteByQueryAction.INSTANCE, request, getDeleteModelClusterStateListener(inferenceEntityIds, listener)); + client.execute( + DeleteByQueryAction.INSTANCE, + request, + getDeleteModelClusterStateListener(inferenceEntityIds, updateClusterState, listener) + ); } private ActionListener getDeleteModelClusterStateListener( Set inferenceEntityIds, + boolean updateClusterState, ActionListener listener ) { return new ActionListener<>() { @Override public void onResponse(BulkByScrollResponse bulkByScrollResponse) { + if (updateClusterState == false) { + listener.onResponse(Boolean.TRUE); + return; + } var clusterStateListener = new ActionListener() { @Override public void onResponse(AcknowledgedResponse acknowledgedResponse) { @@ -920,6 +935,11 @@ public void clusterChanged(ClusterChangedEvent event) { return; } + // wait for the cluster state to be recovered + if (event.state().blocks().hasGlobalBlock(GatewayService.STATE_NOT_RECOVERED_BLOCK)) { + return; + } + if (event.state().metadata().projects().size() > 1) { // TODO: Add support to handle multi-projects return;