| /* |
| * 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); |
| } |
| } |