diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/util/WindowsBasedProcessTree.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/util/WindowsBasedProcessTree.java index 1265066..f9a2166 100644 --- a/WindowsBasedProcessTree.java +++ b/WindowsBasedProcessTree-patched.java @@ -19,6 +19,7 @@ package org.apache.hadoop.yarn.util; import java.io.IOException; +import java.math.BigInteger; import java.util.HashMap; import java.util.Map; @@ -48,6 +49,9 @@ public class WindowsBasedProcessTree extends ResourceCalculatorProcessTree { private long cpuTimeMs = UNAVAILABLE; private Map processTree = new HashMap(); + + private final CpuTimeTracker cpuTimeTracker; + private Clock clock; public static boolean isAvailable() { if (Shell.WINDOWS) { @@ -71,6 +75,9 @@ public class WindowsBasedProcessTree extends ResourceCalculatorProcessTree { public WindowsBasedProcessTree(String pid) { super(pid); taskProcessId = pid; + this.clock = new SystemClock(); + // Instead of jiffies, Windows uses milliseconds directly; 1ms = 1 jiffy + this.cpuTimeTracker = new CpuTimeTracker(1L); } // helper method to override while testing @@ -227,9 +234,22 @@ public class WindowsBasedProcessTree extends ResourceCalculatorProcessTree { return cpuTimeMs; } + private BigInteger getTotalProcessMs() { + long totalMs = 0; + for (ProcessInfo p : processTree.values()) { + if (p != null) { + totalMs += p.cpuTimeMs; + } + } + return BigInteger.valueOf(totalMs); + } + @Override public float getCpuUsagePercent() { - return CpuTimeTracker.UNAVAILABLE; + BigInteger processTotalMs = getTotalProcessMs(); + cpuTimeTracker.updateElapsedJiffies(processTotalMs, clock.getTime()); + + return cpuTimeTracker.getCpuTrackerUsagePercent(); } }