Skip to content

Commit bdaf901

Browse files
breakanalysisadamnsch
authored andcommitted
Introduce setSteps and logSteps in ProgressTracker
Co-Authored-By: Adam Schill Collberg<adam.schill.collberg@protonmail.com>
1 parent c611b8a commit bdaf901

File tree

3 files changed

+60
-0
lines changed

3 files changed

+60
-0
lines changed

core/src/main/java/org/neo4j/gds/core/utils/progress/tasks/ProgressTracker.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,10 @@ default void logProgress() {
6161

6262
void release();
6363

64+
void setSteps(long steps);
65+
66+
void logSteps(long steps);
67+
6468
class EmptyProgressTracker implements ProgressTracker {
6569

6670
@Override
@@ -108,6 +112,16 @@ public void logProgress(long value, String messageTemplate) {
108112
public void setVolume(long volume) {
109113
}
110114

115+
@Override
116+
public void setSteps(long steps) {
117+
118+
}
119+
120+
@Override
121+
public void logSteps(long steps) {
122+
123+
}
124+
111125
@Override
112126
public void logDebug(String message) {
113127

core/src/main/java/org/neo4j/gds/core/utils/progress/tasks/TaskProgressTracker.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,16 @@
3737

3838
public class TaskProgressTracker implements ProgressTracker {
3939

40+
private static final long UNKNOWN_STEPS = -1;
41+
4042
private final Task baseTask;
4143
private final TaskRegistry taskRegistry;
4244
private final UserLogRegistry userLogRegistry;
4345
private final TaskProgressLogger taskProgressLogger;
4446
private final Stack<Task> nestedTasks;
4547
protected Optional<Task> currentTask;
48+
private long currentTotalSteps;
49+
private double progressLeftOvers;
4650

4751
public TaskProgressTracker(Task baseTask, Log log, int concurrency, TaskRegistryFactory taskRegistryFactory) {
4852
this(baseTask, log, concurrency, new JobId(), taskRegistryFactory, EmptyUserLogRegistryFactory.INSTANCE);
@@ -56,6 +60,8 @@ public TaskProgressTracker(
5660
this.taskRegistry = taskRegistryFactory.newInstance(jobId);
5761
this.taskProgressLogger = new TaskProgressLogger(log, baseTask, concurrency);
5862
this.currentTask = Optional.empty();
63+
this.currentTotalSteps = UNKNOWN_STEPS;
64+
this.progressLeftOvers = 0;
5965
this.nestedTasks = new Stack<>();
6066
this.userLogRegistry = userLogRegistryFactory.newInstance();
6167
}
@@ -76,6 +82,8 @@ public void beginSubTask() {
7682
nextTask.start();
7783
taskProgressLogger.logBeginSubTask(nextTask, parentTask());
7884
currentTask = Optional.of(nextTask);
85+
currentTotalSteps = UNKNOWN_STEPS;
86+
progressLeftOvers = 0;
7987
}
8088

8189
@Override
@@ -90,6 +98,26 @@ public void beginSubTask(long taskVolume) {
9098
setVolume(taskVolume);
9199
}
92100

101+
@Override
102+
public void setSteps(long steps) {
103+
if (steps <= 0) {
104+
throw new IllegalStateException(formatWithLocale(
105+
"Total steps for task must be at least 1 but was %d",
106+
steps
107+
));
108+
}
109+
currentTotalSteps = steps;
110+
}
111+
112+
@Override
113+
public void logSteps(long steps) {
114+
long volume = requireCurrentTask().getProgress().volume();
115+
double progress = steps * volume / (double) currentTotalSteps + progressLeftOvers;
116+
long longProgress = (long) progress;
117+
progressLeftOvers = progress - longProgress;
118+
logProgress(longProgress);
119+
}
120+
93121
@Override
94122
public void beginSubTask(String expectedTaskDescription, long taskVolume) {
95123
beginSubTask();

core/src/test/java/org/neo4j/gds/core/utils/progress/tasks/TaskProgressTrackerTest.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,24 @@ void shouldRegisterBaseTaskOnBaseTaskStart() {
208208
assertThat(taskStore.query("")).containsValue(task);
209209
}
210210

211+
@Test
212+
void stepsShouldGiveProgress() {
213+
var leafTask = Tasks.leaf("leaf", 100);
214+
var progressTracker = progressTracker(leafTask);
215+
216+
progressTracker.beginSubTask();
217+
progressTracker.setSteps(13);
218+
progressTracker.logProgress(3);
219+
progressTracker.logSteps(1);
220+
double expectedDoubleProgressFromFirstStep = 100.0 * 1.0 / 13.0;
221+
long progressAfterFirstStep = leafTask.getProgress().progress();
222+
assertThat(progressAfterFirstStep).isEqualTo((long) expectedDoubleProgressFromFirstStep + 3);
223+
224+
progressTracker.logProgress(1);
225+
progressTracker.logSteps(4);
226+
assertThat(leafTask.getProgress().progress()).isEqualTo(3 + 1 + (long) (100.0 * 5.0 / 13));
227+
}
228+
211229
private TaskProgressTracker progressTracker(Task task, Log log) {
212230
return new TaskProgressTracker(task, log, 1, EmptyTaskRegistryFactory.INSTANCE);
213231
}

0 commit comments

Comments
 (0)