diff --git a/docs/changelog/130083.yaml b/docs/changelog/130083.yaml new file mode 100644 index 000000000000..1b3288165953 --- /dev/null +++ b/docs/changelog/130083.yaml @@ -0,0 +1,5 @@ +pr: 130083 +summary: Fix timeout bug in DBQ deletion of unused and orphan ML data +area: Machine Learning +type: bug +issues: [] diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/job/persistence/JobDataDeleter.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/job/persistence/JobDataDeleter.java index 8abcb6b3f8d8..923135fe6b23 100644 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/job/persistence/JobDataDeleter.java +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/job/persistence/JobDataDeleter.java @@ -109,15 +109,7 @@ public class JobDataDeleter { */ public void deleteModelSnapshots(List modelSnapshots, ActionListener listener) { if (modelSnapshots.isEmpty()) { - listener.onResponse( - new BulkByScrollResponse( - TimeValue.ZERO, - new BulkByScrollTask.Status(Collections.emptyList(), null), - Collections.emptyList(), - Collections.emptyList(), - false - ) - ); + listener.onResponse(emptyBulkByScrollResponse()); return; } @@ -134,7 +126,12 @@ public class JobDataDeleter { indices.add(AnomalyDetectorsIndex.jobResultsAliasedName(modelSnapshot.getJobId())); } - String[] indicesToQuery = removeReadOnlyIndices(new ArrayList<>(indices), listener, "model snapshots", null); + String[] indicesToQuery = removeReadOnlyIndices( + new ArrayList<>(indices), + listener, + "model snapshots", + () -> listener.onResponse(emptyBulkByScrollResponse()) + ); if (indicesToQuery.length == 0) return; DeleteByQueryRequest deleteByQueryRequest = new DeleteByQueryRequest(indicesToQuery).setRefresh(true) @@ -147,6 +144,16 @@ public class JobDataDeleter { executeAsyncWithOrigin(client, ML_ORIGIN, DeleteByQueryAction.INSTANCE, deleteByQueryRequest, listener); } + private static BulkByScrollResponse emptyBulkByScrollResponse() { + return new BulkByScrollResponse( + TimeValue.ZERO, + new BulkByScrollTask.Status(Collections.emptyList(), null), + Collections.emptyList(), + Collections.emptyList(), + false + ); + } + /** * Asynchronously delete the annotations * If the deleteUserAnnotations field is set to true then all @@ -311,7 +318,7 @@ public class JobDataDeleter { List.of(AnomalyDetectorsIndex.jobResultsAliasedName(jobId)), listener, "datafeed timing stats", - null + () -> listener.onResponse(emptyBulkByScrollResponse()) ); if (indicesToQuery.length == 0) return; DeleteByQueryRequest deleteByQueryRequest = new DeleteByQueryRequest(indicesToQuery).setRefresh(true) @@ -504,7 +511,12 @@ public class JobDataDeleter { ActionListener refreshListener = ActionListener.wrap(refreshResponse -> { logger.info("[{}] running delete by query on [{}]", jobId, String.join(", ", indices)); ConstantScoreQueryBuilder query = new ConstantScoreQueryBuilder(new TermQueryBuilder(Job.ID.getPreferredName(), jobId)); - String[] indicesToQuery = removeReadOnlyIndices(List.of(indices), listener, "results", null); + String[] indicesToQuery = removeReadOnlyIndices( + List.of(indices), + listener, + "results", + () -> listener.onResponse(emptyBulkByScrollResponse()) + ); if (indicesToQuery.length == 0) return; DeleteByQueryRequest request = new DeleteByQueryRequest(indicesToQuery).setQuery(query) .setIndicesOptions(MlIndicesUtils.addIgnoreUnavailable(IndicesOptions.lenientExpandOpenHidden()))