/*
* 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.ignite.internal.visor.igfs;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
import java.util.Comparator;
import org.apache.ignite.igfs.IgfsMode;
import org.apache.ignite.internal.util.typedef.internal.S;
import org.apache.ignite.internal.util.typedef.internal.U;
import org.apache.ignite.internal.visor.VisorDataTransferObject;
/**
* Visor IGFS profiler information about one file.
*/
public class VisorIgfsProfilerEntry extends VisorDataTransferObject {
/** */
private static final long serialVersionUID = 0L;
/** Timestamp comparator. */
public static final Comparator<VisorIgfsProfilerEntry> ENTRY_TIMESTAMP_COMPARATOR =
new Comparator<VisorIgfsProfilerEntry>() {
@Override public int compare(VisorIgfsProfilerEntry a, VisorIgfsProfilerEntry b) {
return Long.compare(a.ts, b.ts);
}
};
/** Path to file. */
private String path;
/** Timestamp of last file operation. */
private long ts;
/** IGFS mode. */
private IgfsMode mode;
/** File size. */
private long size;
/** How many bytes were read. */
private long bytesRead;
/** How long read take. */
private long readTime;
/** User read time. */
private long userReadTime;
/** How many bytes were written. */
private long bytesWritten;
/** How long write take. */
private long writeTime;
/** User write read time. */
private long userWriteTime;
/** Calculated uniformity. */
private double uniformity = -1;
/** Counters for uniformity calculation. */
private VisorIgfsProfilerUniformityCounters counters;
/** Read speed in bytes per second or {@code -1} if speed not available. */
private long readSpeed;
/** Write speed in bytes per second or {@code -1} if speed not available. */
private long writeSpeed;
/**
* Default constructor.
*/
public VisorIgfsProfilerEntry() {
// No-op.
}
/** Create data transfer object with given parameters. */
public VisorIgfsProfilerEntry(
String path,
long ts,
IgfsMode mode,
long size,
long bytesRead,
long readTime,
long userReadTime,
long bytesWritten,
long writeTime,
long userWriteTime,
VisorIgfsProfilerUniformityCounters counters
) {
assert counters != null;
this.path = path;
this.ts = ts;
this.mode = mode;
this.size = size;
this.bytesRead = bytesRead;
this.readTime = readTime;
this.userReadTime = userReadTime;
this.bytesWritten = bytesWritten;
this.writeTime = writeTime;
this.userWriteTime = userWriteTime;
this.counters = counters;
readSpeed = speed(bytesRead, readTime);
writeSpeed = speed(bytesWritten, writeTime);
}
/**
* Calculate speed of bytes processing.
*
* @param bytes How many bytes were processed.
* @param time How long processing take (in nanoseconds).
* @return Speed of processing in bytes per second or {@code -1} if speed not available.
*/
private static long speed(long bytes, long time) {
if (time > 0) {
double bytesScaled = bytes * 100000d;
double timeScaled = time / 10000d;
return (long)(bytesScaled / timeScaled);
}
else
return -1L;
}
/**
* @return Path to file.
*/
public String getPath() {
return path;
}
/**
* @return Timestamp of last file operation.
*/
public long getTimestamp() {
return ts;
}
/**
* @return IGFS mode.
*/
public IgfsMode getMode() {
return mode;
}
/**
* @return File size.
*/
public long getSize() {
return size;
}
/**
* @return How many bytes were read.
*/
public long getBytesRead() {
return bytesRead;
}
/**
* @return How long read take.
*/
public long getReadTime() {
return readTime;
}
/**
* @return User read time.
*/
public long getUserReadTime() {
return userReadTime;
}
/**
* @return How many bytes were written.
*/
public long getBytesWritten() {
return bytesWritten;
}
/**
* @return How long write take.
*/
public long getWriteTime() {
return writeTime;
}
/**
* @return User write read time.
*/
public long getUserWriteTime() {
return userWriteTime;
}
/**
* @return Calculated uniformity.
*/
public double getUniformity() {
if (uniformity < 0)
uniformity = counters.calc();
return uniformity;
}
/**
* @return Counters for uniformity calculation.
*/
public VisorIgfsProfilerUniformityCounters getCounters() {
return counters;
}
/**
* @return Read speed in bytes per second or {@code -1} if speed not available.
*/
public long getReadSpeed() {
return readSpeed;
}
/**
* @return Write speed in bytes per second or {@code -1} if speed not available.
*/
public long getWriteSpeed() {
return writeSpeed;
}
/** {@inheritDoc} */
@Override protected void writeExternalData(ObjectOutput out) throws IOException {
U.writeString(out, path);
out.writeLong(ts);
U.writeEnum(out, mode);
out.writeLong(size);
out.writeLong(bytesRead);
out.writeLong(readTime);
out.writeLong(userReadTime);
out.writeLong(bytesWritten);
out.writeLong(writeTime);
out.writeLong(userWriteTime);
out.writeDouble(uniformity);
out.writeObject(counters);
out.writeLong(readSpeed);
out.writeLong(writeSpeed);
}
/** {@inheritDoc} */
@Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
path = U.readString(in);
ts = in.readLong();
mode = IgfsMode.fromOrdinal(in.readByte());
size = in.readLong();
bytesRead = in.readLong();
readTime = in.readLong();
userReadTime = in.readLong();
bytesWritten = in.readLong();
writeTime = in.readLong();
userWriteTime = in.readLong();
uniformity = in.readDouble();
counters = (VisorIgfsProfilerUniformityCounters)in.readObject();
readSpeed = in.readLong();
writeSpeed = in.readLong();
}
/** {@inheritDoc} */
@Override public String toString() {
return S.toString(VisorIgfsProfilerEntry.class, this);
}
}