in src/main/java/org/opensearch/knn/indices/ModelDao.java [434:501]
public void delete(String modelId, ActionListener<DeleteModelResponse> listener) {
// If the index is not created, there is no need to delete the model
if (!isCreated()) {
logger.error("Cannot delete model \"" + modelId + "\". Model index "+ MODEL_INDEX_NAME + "does not exist.");
String errorMessage = String.format("Cannot delete model \"%s\". Model index does not exist", modelId);
listener.onResponse(new DeleteModelResponse(modelId, "failed", errorMessage));
return;
}
// Setup delete model request
DeleteRequestBuilder deleteRequestBuilder = new DeleteRequestBuilder(client, DeleteAction.INSTANCE,
MODEL_INDEX_NAME);
deleteRequestBuilder.setId(modelId);
deleteRequestBuilder.setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE);
// On model deletion from the index, remove the model from all nodes' model cache
ActionListener<DeleteResponse> onModelDeleteListener = ActionListener.wrap(deleteResponse -> {
// If model is not deleted, return with error message
if(deleteResponse.getResult() != DocWriteResponse.Result.DELETED) {
String errorMessage = String.format("Model \" %s \" does not exist", modelId);
listener.onResponse(new DeleteModelResponse(modelId, deleteResponse.getResult().getLowercase(),
errorMessage));
return;
}
// After model is deleted from the index, make sure the model is evicted from every cache in the
// cluster
client.execute(
RemoveModelFromCacheAction.INSTANCE,
new RemoveModelFromCacheRequest(modelId),
ActionListener.wrap(
removeModelFromCacheResponse -> {
if (!removeModelFromCacheResponse.hasFailures()) {
listener.onResponse(
new DeleteModelResponse(
modelId,
deleteResponse.getResult().getLowercase(),
null
)
);
return;
}
String failureMessage = buildRemoveModelErrorMessage(modelId,
removeModelFromCacheResponse);
listener.onResponse(new DeleteModelResponse(modelId, "failed",
failureMessage));
}, e -> listener.onResponse(
new DeleteModelResponse(modelId, "failed", e.getMessage())
)
)
);
}, e -> listener.onResponse(new DeleteModelResponse(modelId, "failed", e.getMessage())));
// On model metadata removal, delete the model from the index
ActionListener<AcknowledgedResponse> onMetadataUpdateListener = ActionListener.wrap(acknowledgedResponse ->
deleteRequestBuilder.execute(onModelDeleteListener), listener::onFailure);
// Remove the metadata asynchronously
client.execute(
UpdateModelMetadataAction.INSTANCE,
new UpdateModelMetadataRequest(modelId, true, null),
onMetadataUpdateListener
);
}