From c287d2356aedd5b02cf1691abb2bc0e595970088 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Tue, 27 Apr 2021 16:42:52 +0200 Subject: [PATCH] Fix worker tasks progress reporting These tasks do not have complete work state information (only buckets allocated to them) so they cannot report bucketed progress. Should fix MID-7002. --- .../task/TaskPartProgressInformation.java | 13 ++++++-- .../schema/util/task/TaskWorkStateUtil.java | 7 ++++ .../intest/sync/TestProgressReporting.java | 33 +++++++++++++++++++ 3 files changed, 51 insertions(+), 2 deletions(-) diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/task/TaskPartProgressInformation.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/task/TaskPartProgressInformation.java index 785b8dfa445..1acd0817ec1 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/task/TaskPartProgressInformation.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/task/TaskPartProgressInformation.java @@ -55,7 +55,7 @@ private TaskPartProgressInformation(String partOrHandlerUri, boolean complete, B public static TaskPartProgressInformation fromPersistentSubtask(TaskType task) { String partUri = task.getHandlerUri(); boolean complete = task.getExecutionStatus() == TaskExecutionStateType.CLOSED; - BucketsProgressInformation bucketsProgress = BucketsProgressInformation.fromWorkState(task.getWorkState()); + BucketsProgressInformation bucketsProgress = getBucketsProgressInformation(task); ItemsProgressInformation itemsProgress = ItemsProgressInformation.fromTask(task); return new TaskPartProgressInformation(partUri, complete, bucketsProgress, itemsProgress); } @@ -76,11 +76,20 @@ public static TaskPartProgressInformation fromPartProgress(TaskPartProgressType */ static TaskPartProgressInformation fromSimpleTask(TaskType task) { boolean complete = TaskWorkStateUtil.isAllWorkComplete(task); - BucketsProgressInformation bucketsProgress = BucketsProgressInformation.fromWorkState(task.getWorkState()); + BucketsProgressInformation bucketsProgress = getBucketsProgressInformation(task); ItemsProgressInformation itemsProgress = ItemsProgressInformation.fromTask(task); return new TaskPartProgressInformation(null, complete, bucketsProgress, itemsProgress); } + private static BucketsProgressInformation getBucketsProgressInformation(TaskType task) { + if (TaskWorkStateUtil.isWorker(task)) { + // Workers do not have complete information about buckets. + return null; + } else { + return BucketsProgressInformation.fromWorkState(task.getWorkState()); + } + } + public String getPartOrHandlerUri() { return partOrHandlerUri; } diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/task/TaskWorkStateUtil.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/task/TaskWorkStateUtil.java index 349d389c699..32af1a2a18e 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/task/TaskWorkStateUtil.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/task/TaskWorkStateUtil.java @@ -129,6 +129,13 @@ public static boolean isCoordinator(TaskType task) { return getKind(task) == TaskKindType.COORDINATOR; } + /** + * @return True if the task is a worker (in the bucketing sense). + */ + public static boolean isWorker(TaskType task) { + return getKind(task) == TaskKindType.WORKER; + } + /** * @return True if the task is a partitioned master. */ diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/sync/TestProgressReporting.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/sync/TestProgressReporting.java index 6d27b2af260..9a076eae688 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/sync/TestProgressReporting.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/sync/TestProgressReporting.java @@ -10,6 +10,7 @@ import java.io.FileNotFoundException; import java.net.ConnectException; import java.util.Collection; +import java.util.List; import com.evolveum.icf.dummy.resource.ConflictException; import com.evolveum.icf.dummy.resource.ObjectAlreadyExistsException; @@ -21,6 +22,7 @@ import com.evolveum.midpoint.schema.util.task.TaskPartProgressInformation; import com.evolveum.midpoint.schema.util.task.TaskPerformanceInformation; import com.evolveum.midpoint.schema.util.task.TaskProgressInformation; +import com.evolveum.midpoint.schema.util.task.TaskTreeUtil; import com.evolveum.midpoint.task.api.TaskDebugUtil; import com.evolveum.midpoint.test.TestResource; @@ -407,6 +409,23 @@ private void executePartitionedBucketedReconciliation(TestResource rec TaskPerformanceInformation perf2 = TaskPerformanceInformation.fromTaskTree(rootAfterSuspension2.asObjectable()); displayDumpable("perf after 2nd run", perf2); + + PrismObject subtask2 = assertTask(rootAfterSuspension2.asObjectable(), "after 2nd run") + .subtaskForPart(2) + .getObject(); + List children2 = TaskTreeUtil.getResolvedSubtasks(subtask2.asObjectable()); + if (!children2.isEmpty()) { + TaskType worker = children2.get(0); + assertTask(worker, "worker") + .display() + .structuredProgress() + .display(); + TaskProgressInformation progressOfSubtask = TaskProgressInformation.fromTaskTree(worker); + assertTaskProgress(progressOfSubtask, "worker task progress") + .display() + .part(null) + .assertNoBucketInformation(); // MID-7006 + } } /** @@ -513,5 +532,19 @@ private void executeRecomputation(TestResource recomputationTask, Stri TaskPerformanceInformation perf2 = TaskPerformanceInformation.fromTaskTree(rootAfterSuspension2.asObjectable()); displayDumpable("perf after 2nd run", perf2); + + List subtasks = TaskTreeUtil.getResolvedSubtasks(rootAfterSuspension2.asObjectable()); + if (!subtasks.isEmpty()) { + TaskType subtask = subtasks.get(0); + assertTask(subtask, "subtask") + .display() + .structuredProgress() + .display(); + TaskProgressInformation progressOfSubtask = TaskProgressInformation.fromTaskTree(subtask); + assertTaskProgress(progressOfSubtask, "subtask progress") + .display() + .part(null) + .assertNoBucketInformation(); // MID-7006 + } } }