/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.hadoop.tools.rumen;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import org.apache.hadoop.io.Writable;
import org.apache.hadoop.io.WritableUtils;
/**
* Captures the resource usage metrics.
*/
public class ResourceUsageMetrics implements Writable, DeepCompare {
private long cumulativeCpuUsage;
private long virtualMemoryUsage;
private long physicalMemoryUsage;
private long heapUsage;
public ResourceUsageMetrics() {
}
/**
* Get the cumulative CPU usage.
*/
public long getCumulativeCpuUsage() {
return cumulativeCpuUsage;
}
/**
* Set the cumulative CPU usage.
*/
public void setCumulativeCpuUsage(long usage) {
cumulativeCpuUsage = usage;
}
/**
* Get the virtual memory usage.
*/
public long getVirtualMemoryUsage() {
return virtualMemoryUsage;
}
/**
* Set the virtual memory usage.
*/
public void setVirtualMemoryUsage(long usage) {
virtualMemoryUsage = usage;
}
/**
* Get the physical memory usage.
*/
public long getPhysicalMemoryUsage() {
return physicalMemoryUsage;
}
/**
* Set the physical memory usage.
*/
public void setPhysicalMemoryUsage(long usage) {
physicalMemoryUsage = usage;
}
/**
* Get the total heap usage.
*/
public long getHeapUsage() {
return heapUsage;
}
/**
* Set the total heap usage.
*/
public void setHeapUsage(long usage) {
heapUsage = usage;
}
/**
* Returns the size of the serialized data
*/
public int size() {
int size = 0;
size += WritableUtils.getVIntSize(cumulativeCpuUsage); // long #1
size += WritableUtils.getVIntSize(virtualMemoryUsage); // long #2
size += WritableUtils.getVIntSize(physicalMemoryUsage); // long #3
size += WritableUtils.getVIntSize(heapUsage); // long #4
return size;
}
@Override
public void readFields(DataInput in) throws IOException {
cumulativeCpuUsage = WritableUtils.readVLong(in); // long #1
virtualMemoryUsage = WritableUtils.readVLong(in); // long #2
physicalMemoryUsage = WritableUtils.readVLong(in); // long #3
heapUsage = WritableUtils.readVLong(in); // long #4
}
@Override
public void write(DataOutput out) throws IOException {
//TODO Write resources version no too
WritableUtils.writeVLong(out, cumulativeCpuUsage); // long #1
WritableUtils.writeVLong(out, virtualMemoryUsage); // long #2
WritableUtils.writeVLong(out, physicalMemoryUsage); // long #3
WritableUtils.writeVLong(out, heapUsage); // long #4
}
private static void compareMetric(long m1, long m2, TreePath loc)
throws DeepInequalityException {
if (m1 != m2) {
throw new DeepInequalityException("Value miscompared:" + loc.toString(),
loc);
}
}
private static void compareSize(ResourceUsageMetrics m1,
ResourceUsageMetrics m2, TreePath loc)
throws DeepInequalityException {
if (m1.size() != m2.size()) {
throw new DeepInequalityException("Size miscompared: " + loc.toString(),
loc);
}
}
@Override
public void deepCompare(DeepCompare other, TreePath loc)
throws DeepInequalityException {
if (!(other instanceof ResourceUsageMetrics)) {
throw new DeepInequalityException("Comparand has wrong type", loc);
}
ResourceUsageMetrics metrics2 = (ResourceUsageMetrics) other;
compareMetric(getCumulativeCpuUsage(), metrics2.getCumulativeCpuUsage(),
new TreePath(loc, "cumulativeCpu"));
compareMetric(getVirtualMemoryUsage(), metrics2.getVirtualMemoryUsage(),
new TreePath(loc, "virtualMemory"));
compareMetric(getPhysicalMemoryUsage(), metrics2.getPhysicalMemoryUsage(),
new TreePath(loc, "physicalMemory"));
compareMetric(getHeapUsage(), metrics2.getHeapUsage(),
new TreePath(loc, "heapUsage"));
compareSize(this, metrics2, new TreePath(loc, "size"));
}
}