1919import org .elasticsearch .common .settings .Settings ;
2020import org .elasticsearch .common .unit .TimeValue ;
2121import org .elasticsearch .common .util .concurrent .AtomicArray ;
22+ import org .elasticsearch .persistent .PersistentTasksCustomMetaData ;
2223import org .elasticsearch .tasks .Task ;
2324import org .elasticsearch .threadpool .ThreadPool ;
2425import org .elasticsearch .transport .TransportService ;
25- import org .elasticsearch .xpack .core .ml .MlMetadata ;
2626import org .elasticsearch .xpack .core .ml .MlTasks ;
2727import org .elasticsearch .xpack .core .ml .action .GetJobsStatsAction ;
2828import org .elasticsearch .xpack .core .ml .action .util .QueryPage ;
3131import org .elasticsearch .xpack .core .ml .job .process .autodetect .state .DataCounts ;
3232import org .elasticsearch .xpack .core .ml .job .process .autodetect .state .ModelSizeStats ;
3333import org .elasticsearch .xpack .core .ml .stats .ForecastStats ;
34- import org .elasticsearch .persistent . PersistentTasksCustomMetaData ;
34+ import org .elasticsearch .xpack . ml . job . persistence . JobConfigProvider ;
3535import org .elasticsearch .xpack .ml .job .persistence .JobResultsProvider ;
3636import org .elasticsearch .xpack .ml .job .process .autodetect .AutodetectProcessManager ;
3737
@@ -53,27 +53,35 @@ public class TransportGetJobsStatsAction extends TransportTasksAction<TransportO
5353 private final ClusterService clusterService ;
5454 private final AutodetectProcessManager processManager ;
5555 private final JobResultsProvider jobResultsProvider ;
56+ private final JobConfigProvider jobConfigProvider ;
5657
5758 @ Inject
5859 public TransportGetJobsStatsAction (Settings settings , TransportService transportService ,
5960 ActionFilters actionFilters , ClusterService clusterService ,
60- AutodetectProcessManager processManager , JobResultsProvider jobResultsProvider ) {
61+ AutodetectProcessManager processManager , JobResultsProvider jobResultsProvider ,
62+ JobConfigProvider jobConfigProvider ) {
6163 super (settings , GetJobsStatsAction .NAME , clusterService , transportService , actionFilters ,
62- GetJobsStatsAction .Request ::new , GetJobsStatsAction .Response ::new ,
63- ThreadPool .Names .MANAGEMENT );
64+ GetJobsStatsAction .Request ::new , GetJobsStatsAction .Response ::new , ThreadPool .Names .MANAGEMENT );
6465 this .clusterService = clusterService ;
6566 this .processManager = processManager ;
6667 this .jobResultsProvider = jobResultsProvider ;
68+ this .jobConfigProvider = jobConfigProvider ;
6769 }
6870
6971 @ Override
70- protected void doExecute (Task task , GetJobsStatsAction .Request request , ActionListener <GetJobsStatsAction .Response > listener ) {
71- MlMetadata mlMetadata = MlMetadata .getMlMetadata (clusterService .state ());
72- request .setExpandedJobsIds (new ArrayList <>(mlMetadata .expandJobIds (request .getJobId (), request .allowNoJobs ())));
73- ActionListener <GetJobsStatsAction .Response > finalListener = listener ;
74- listener = ActionListener .wrap (response -> gatherStatsForClosedJobs (mlMetadata ,
75- request , response , finalListener ), listener ::onFailure );
76- super .doExecute (task , request , listener );
72+ protected void doExecute (Task task , GetJobsStatsAction .Request request , ActionListener <GetJobsStatsAction .Response > finalListener ) {
73+
74+ jobConfigProvider .expandJobsIds (request .getJobId (), request .allowNoJobs (), true , ActionListener .wrap (
75+ expandedIds -> {
76+ request .setExpandedJobsIds (new ArrayList <>(expandedIds ));
77+ ActionListener <GetJobsStatsAction .Response > jobStatsListener = ActionListener .wrap (
78+ response -> gatherStatsForClosedJobs (request , response , finalListener ),
79+ finalListener ::onFailure
80+ );
81+ super .doExecute (task , request , jobStatsListener );
82+ },
83+ finalListener ::onFailure
84+ ));
7785 }
7886
7987 @ Override
@@ -121,21 +129,20 @@ protected void taskOperation(GetJobsStatsAction.Request request, TransportOpenJo
121129
122130 // Up until now we gathered the stats for jobs that were open,
123131 // This method will fetch the stats for missing jobs, that was stored in the jobs index
124- void gatherStatsForClosedJobs (MlMetadata mlMetadata , GetJobsStatsAction .Request request , GetJobsStatsAction .Response response ,
132+ void gatherStatsForClosedJobs (GetJobsStatsAction .Request request , GetJobsStatsAction .Response response ,
125133 ActionListener <GetJobsStatsAction .Response > listener ) {
126- List <String > jobIds = determineNonDeletedJobIdsWithoutLiveStats (mlMetadata ,
127- request .getExpandedJobsIds (), response .getResponse ().results ());
128- if (jobIds .isEmpty ()) {
134+ List <String > closedJobIds = determineJobIdsWithoutLiveStats (request .getExpandedJobsIds (), response .getResponse ().results ());
135+ if (closedJobIds .isEmpty ()) {
129136 listener .onResponse (response );
130137 return ;
131138 }
132139
133- AtomicInteger counter = new AtomicInteger (jobIds .size ());
134- AtomicArray <GetJobsStatsAction .Response .JobStats > jobStats = new AtomicArray <>(jobIds .size ());
140+ AtomicInteger counter = new AtomicInteger (closedJobIds .size ());
141+ AtomicArray <GetJobsStatsAction .Response .JobStats > jobStats = new AtomicArray <>(closedJobIds .size ());
135142 PersistentTasksCustomMetaData tasks = clusterService .state ().getMetaData ().custom (PersistentTasksCustomMetaData .TYPE );
136- for (int i = 0 ; i < jobIds .size (); i ++) {
143+ for (int i = 0 ; i < closedJobIds .size (); i ++) {
137144 int slot = i ;
138- String jobId = jobIds .get (i );
145+ String jobId = closedJobIds .get (i );
139146 gatherForecastStats (jobId , forecastStats -> {
140147 gatherDataCountsAndModelSizeStats (jobId , (dataCounts , modelSizeStats ) -> {
141148 JobState jobState = MlTasks .getJobState (jobId , tasks );
@@ -178,11 +185,9 @@ static TimeValue durationToTimeValue(Optional<Duration> duration) {
178185 }
179186 }
180187
181- static List <String > determineNonDeletedJobIdsWithoutLiveStats (MlMetadata mlMetadata ,
182- List <String > requestedJobIds ,
183- List <GetJobsStatsAction .Response .JobStats > stats ) {
188+ static List <String > determineJobIdsWithoutLiveStats (List <String > requestedJobIds ,
189+ List <GetJobsStatsAction .Response .JobStats > stats ) {
184190 Set <String > excludeJobIds = stats .stream ().map (GetJobsStatsAction .Response .JobStats ::getJobId ).collect (Collectors .toSet ());
185- return requestedJobIds .stream ().filter (jobId -> !excludeJobIds .contains (jobId ) &&
186- !mlMetadata .isJobDeleting (jobId )).collect (Collectors .toList ());
191+ return requestedJobIds .stream ().filter (jobId -> !excludeJobIds .contains (jobId )).collect (Collectors .toList ());
187192 }
188193}
0 commit comments