/**
* Copyright 2014 LinkedIn Corp. Licensed 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.
*/
package com.linkedin.multitenant.profiler;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import org.apache.log4j.Logger;
import com.linkedin.multitenant.common.Query.QueryType;
import com.linkedin.multitenant.db.Database.DatabaseResult;
public class Profiler
{
private static final Logger _LOG = Logger.getLogger(Profiler.class);
private CompleteResult _insertResult;
private CompleteResult _readResult;
private CompleteResult _deleteResult;
private CompleteResult _updateResult;
public Profiler(int runTime, int gran, int histogramSize)
{
_insertResult = new CompleteResult(runTime, gran, histogramSize);
_readResult = new CompleteResult(runTime, gran, histogramSize);
_deleteResult = new CompleteResult(runTime, gran, histogramSize);
_updateResult = new CompleteResult(runTime, gran, histogramSize);
}
public Profiler(byte arr[]) throws Exception
{
ByteArrayInputStream bs = new ByteArrayInputStream(arr);
DataInputStream in = new DataInputStream(bs);
//read insert results size and data
int size = in.readInt();
_LOG.debug("Insert CompleteResult len: " + size);
byte temp[] = new byte[size];
in.readFully(temp);
_insertResult = new CompleteResult(temp);
//read read results size and data
size = in.readInt();
_LOG.debug("Read CompleteResult len: " + size);
temp = new byte[size];
in.readFully(temp);
_readResult = new CompleteResult(temp);
//read delete results size and data
size = in.readInt();
_LOG.debug("Delete CompleteResult len: " + size);
temp = new byte[size];
in.readFully(temp);
_deleteResult = new CompleteResult(temp);
//read update results size and data
size = in.readInt();
_LOG.debug("Update CompleteResult len: " + size);
temp = new byte[size];
in.readFully(temp);
_updateResult = new CompleteResult(temp);
in.close();
}
public byte[] toByteArray() throws Exception
{
ByteArrayOutputStream bs = new ByteArrayOutputStream();
DataOutputStream out = new DataOutputStream(bs);
//write write results size and data
byte temp[] = _insertResult.toByteArray();
out.writeInt(temp.length);
_LOG.debug("Write CompleteResult len: " + temp.length);
out.write(temp);
//write read results size and data
temp = _readResult.toByteArray();
out.writeInt(temp.length);
_LOG.debug("Read CompleteResult len: " + temp.length);
out.write(temp);
//write delete results size and data
temp = _deleteResult.toByteArray();
out.writeInt(temp.length);
_LOG.debug("Delete CompleteResult len: " + temp.length);
out.write(temp);
//write update results size and data
temp = _updateResult.toByteArray();
out.writeInt(temp.length);
_LOG.debug("Update CompleteResult len: " + temp.length);
out.write(temp);
out.close();
return bs.toByteArray();
}
public CompleteResult getInsertResults()
{
return _insertResult;
}
public CompleteResult getReadResults()
{
return _readResult;
}
public CompleteResult getDeleteResults()
{
return _deleteResult;
}
public CompleteResult getUpdateResults()
{
return _updateResult;
}
/**
* Insert a completed operation data.
* @param timeFromStart Time passed in seconds since the start of experiments
* @param latency Latency in nanoseconds for the operation
* @param optType Operation type
*/
public void add(int timeFromStart, long latency, QueryType optType, DatabaseResult optResult)
{
switch (optType)
{
case INSERT:
_insertResult.add(timeFromStart, latency, optResult);
break;
case READ:
_readResult.add(timeFromStart, latency, optResult);
break;
case DELETE:
_deleteResult.add(timeFromStart, latency, optResult);
break;
case UPDATE:
_updateResult.add(timeFromStart, latency, optResult);
break;
default:
_LOG.debug("Unknown operation type: " + optType);
break;
}
}
/**
* Add rhs Profiler to this instance. The result is this instance.
* @param rhs
*/
public void add(Profiler rhs)
{
_insertResult.add(rhs.getInsertResults());
_readResult.add(rhs.getReadResults());
_deleteResult.add(rhs.getDeleteResults());
_updateResult.add(rhs.getUpdateResults());
}
public String toString()
{
StringBuilder sb = new StringBuilder();
sb.append("Insert:");
sb.append("\n");
sb.append(_insertResult.toString());
sb.append("\n");
sb.append("Read:");
sb.append("\n");
sb.append(_readResult.toString());
sb.append("\n");
sb.append("Delete:");
sb.append("\n");
sb.append(_deleteResult.toString());
sb.append("\n");
sb.append("Update:");
sb.append("\n");
sb.append(_updateResult.toString());
return sb.toString();
}
}