long totalBytes = progress.getTotalBytesExpected() - progress.getBytesSkipped();
long totalObjects = progress.getTotalObjectsExpected() - progress.getObjectsSkipped();
long etaMs = 0;
if (progress.getRuntimeMs() > 0) {
bw = (double) progress.getBytesComplete() * 1000 / progress.getRuntimeMs();
xput = (double) progress.getObjectsComplete() * 1000 / progress.getRuntimeMs();
if (totalBytes > 0) {
byteRatio = (double) progress.getBytesComplete() / totalBytes;
completionRatio = byteRatio;
objectRatio = (double) progress.getObjectsComplete() / totalObjects;
completionRatio = objectRatio;
completionRatio = (2 * Math.min(byteRatio, objectRatio) + Math.max(byteRatio, objectRatio)) / 3;
if (completionRatio > 0)
etaMs = (long) (progress.getRuntimeMs() / completionRatio - progress.getRuntimeMs());
String generalError = progress.getRunError() == null ? "" : progress.getRunError();
System.out.printf("Job Status: %s\n", progress.getStatus());
System.out.printf("Job Time: %s\n", duration(progress.getRuntimeMs()));
System.out.printf("Active Query Threads: %d\n", progress.getActiveQueryTasks());
System.out.printf("Active Sync Threads: %d\n", progress.getActiveSyncTasks());
System.out.printf("CPU Time: %dms\n", progress.getCpuTimeMs());
System.out.printf("CPU Usage: %.1f %%\n", progress.getProcessCpuLoad() * 100);
System.out.printf("Memory Usage: %sB\n", simpleSize(progress.getProcessMemoryUsed()));
System.out.printf("Objects Expected: %d %s\n", progress.getTotalObjectsExpected(),
progress.isEstimatingTotals() ? "(calculating...)" : "");
System.out.printf("Objects Completed: %d\n", progress.getObjectsComplete());