Skip to content

Commit 359d56f

Browse files
committed
undeploy models with no WorkerNodes
This commit aims to undeploy modelIds that have no nodes associated to them so as to keep the intention of undeploy truthful. Signed-off-by: Brian Flores <[email protected]> # Conflicts: # plugin/src/main/java/org/opensearch/ml/action/undeploy/TransportUndeployModelsAction.java
1 parent 571de0e commit 359d56f

File tree

1 file changed

+32
-0
lines changed

1 file changed

+32
-0
lines changed

plugin/src/main/java/org/opensearch/ml/action/undeploy/TransportUndeployModelsAction.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,21 @@
77

88
import static org.opensearch.ml.common.CommonValue.ML_MODEL_INDEX;
99

10+
import java.time.Instant;
1011
import java.util.Arrays;
1112
import java.util.List;
1213
import java.util.stream.Collectors;
1314

1415
import org.opensearch.ExceptionsHelper;
1516
import org.opensearch.OpenSearchStatusException;
1617
import org.opensearch.action.ActionRequest;
18+
import org.opensearch.action.bulk.BulkRequest;
1719
import org.opensearch.action.search.SearchRequest;
1820
import org.opensearch.action.search.SearchResponse;
1921
import org.opensearch.action.support.ActionFilters;
2022
import org.opensearch.action.support.HandledTransportAction;
23+
import org.opensearch.action.support.WriteRequest;
24+
import org.opensearch.action.update.UpdateRequest;
2125
import org.opensearch.client.Client;
2226
import org.opensearch.cluster.service.ClusterService;
2327
import org.opensearch.common.inject.Inject;
@@ -33,6 +37,7 @@
3337
import org.opensearch.index.query.TermsQueryBuilder;
3438
import org.opensearch.ml.cluster.DiscoveryNodeHelper;
3539
import org.opensearch.ml.common.MLModel;
40+
import org.opensearch.ml.common.model.MLModelState;
3641
import org.opensearch.ml.common.transport.deploy.MLDeployModelRequest;
3742
import org.opensearch.ml.common.transport.undeploy.MLUndeployModelAction;
3843
import org.opensearch.ml.common.transport.undeploy.MLUndeployModelNodesRequest;
@@ -57,6 +62,7 @@
5762
import org.opensearch.transport.TransportService;
5863

5964
import com.google.common.annotations.VisibleForTesting;
65+
import com.google.common.collect.ImmutableMap;
6066

6167
import lombok.extern.log4j.Log4j2;
6268

@@ -180,10 +186,36 @@ private void undeployModels(
180186
mlUndeployModelNodesRequest.setTenantId(tenantId);
181187

182188
client.execute(MLUndeployModelAction.INSTANCE, mlUndeployModelNodesRequest, ActionListener.wrap(r -> {
189+
if (r.getNodes().isEmpty()) {
190+
bulkSetModelIndexToUndeploy(modelIds);
191+
}
183192
listener.onResponse(new MLUndeployModelsResponse(r));
184193
}, listener::onFailure));
185194
}
186195

196+
private void bulkSetModelIndexToUndeploy(String[] modelIds) {
197+
BulkRequest bulkUpdateRequest = new BulkRequest();
198+
for (String modelId : modelIds) {
199+
UpdateRequest updateRequest = new UpdateRequest();
200+
Instant now = Instant.now();
201+
ImmutableMap.Builder<String, Object> builder = ImmutableMap.builder();
202+
builder.put(MLModel.MODEL_STATE_FIELD, MLModelState.UNDEPLOYED.name());
203+
204+
builder.put(MLModel.PLANNING_WORKER_NODES_FIELD, List.of());
205+
builder.put(MLModel.PLANNING_WORKER_NODE_COUNT_FIELD, 0);
206+
207+
builder.put(MLModel.LAST_UPDATED_TIME_FIELD, now.toEpochMilli());
208+
builder.put(MLModel.CURRENT_WORKER_NODE_COUNT_FIELD, 0);
209+
updateRequest.index(ML_MODEL_INDEX).id(modelId).doc(builder.build());
210+
bulkUpdateRequest.add(updateRequest);
211+
}
212+
bulkUpdateRequest.setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE);
213+
log.info("No models service: {}", modelIds.toString());
214+
client.bulk(bulkUpdateRequest, ActionListener.wrap(br -> { log.debug("Successfully set modelIds to UNDEPLOY in index"); }, e -> {
215+
log.error("Failed to set modelIds to UNDEPLOY in index", e);
216+
}));
217+
}
218+
187219
private void validateAccess(String modelId, String tenantId, ActionListener<Boolean> listener) {
188220
User user = RestActionUtils.getUserContext(client);
189221
boolean isSuperAdmin = isSuperAdminUserWrapper(clusterService, client);

0 commit comments

Comments
 (0)