Skip to content
Snippets Groups Projects
Commit 2d6185ee authored by bigbes's avatar bigbes
Browse files

[core] Move returncode handling to OneMeasurement

* returncodes -> OneMeasurement
* HashMap -> ConcurrentHashMap

Closes gh-353
parent 35720bb2
No related branches found
No related tags found
No related merge requests found
......@@ -27,8 +27,10 @@ import com.yahoo.ycsb.measurements.exporter.MeasurementsExporter;
public abstract class OneMeasurement {
String _name;
final ConcurrentHashMap<Integer, AtomicInteger> returncodes;
public String getName() {
returncodes = new ConcurrentHashMap<Integer, AtomicInteger>();
return _name;
}
......@@ -39,7 +41,22 @@ public abstract class OneMeasurement {
this._name = _name;
}
public abstract void reportReturnCode(int code);
/**
* No need for synchronization, using CHM to deal with that
*/
public void reportReturnCode(int code) {
Integer Icode = code;
AtomicInteger counter = returncodes.get(Icode);
if (counter == null) {
AtomicInteger other = returncodes.putIfAbsent(Icode, counter = new AtomicInteger());
if (other != null) {
counter = other;
}
}
counter.incrementAndGet();
}
public abstract void measure(int latency);
......
......@@ -46,13 +46,11 @@ public class OneMeasurementHdrHistogram extends OneMeasurement {
final HistogramLogWriter histogramLogWriter;
final Recorder histogram = new Recorder(3);
final ConcurrentHashMap<Integer, AtomicInteger> returncodes;
Histogram totalHistogram;
public OneMeasurementHdrHistogram(String name, Properties props) {
super(name);
returncodes = new ConcurrentHashMap<Integer, AtomicInteger>();
boolean shouldLog = Boolean.parseBoolean(props.getProperty("hdrhistogram.fileoutput", "false"));
if (!shouldLog) {
log = null;
......@@ -72,24 +70,6 @@ public class OneMeasurementHdrHistogram extends OneMeasurement {
histogramLogWriter.outputLegend();
}
/**
* No need for synchronization, using CHM to deal with that
*
* @see com.yahoo.ycsb.OneMeasurement#reportReturnCode(int)
*/
public void reportReturnCode(int code) {
Integer Icode = code;
AtomicInteger counter = returncodes.get(Icode);
if (counter == null) {
AtomicInteger other = returncodes.putIfAbsent(Icode, counter = new AtomicInteger());
if (other != null) {
counter = other;
}
}
counter.incrementAndGet();
}
/**
* It appears latency is reported in micros.
* Using {@link Recorder} to support concurrent updates to histogram.
......
......@@ -48,7 +48,6 @@ public class OneMeasurementHistogram extends OneMeasurement
int min;
int max;
HashMap<Integer,int[]> returncodes;
public OneMeasurementHistogram(String name, Properties props)
{
......@@ -62,25 +61,8 @@ public class OneMeasurementHistogram extends OneMeasurement
windowtotallatency=0;
min=-1;
max=-1;
returncodes=new HashMap<Integer,int[]>();
}
/* (non-Javadoc)
* @see com.yahoo.ycsb.OneMeasurement#reportReturnCode(int)
*/
public synchronized void reportReturnCode(int code)
{
Integer Icode=code;
if (!returncodes.containsKey(Icode))
{
int[] val=new int[1];
val[0]=0;
returncodes.put(Icode,val);
}
returncodes.get(Icode)[0]++;
}
/* (non-Javadoc)
* @see com.yahoo.ycsb.OneMeasurement#measure(int)
*/
......@@ -136,11 +118,9 @@ public class OneMeasurementHistogram extends OneMeasurement
}
}
for (Integer I : returncodes.keySet())
{
int[] val=returncodes.get(I);
exporter.write(getName(), "Return="+I, val[0]);
}
for (Map.Entry<Integer, AtomicInteger> entry : returncodes.entrySet()) {
exporter.write(getName(), "Return=" + entry.getKey(), entry.getValue().get());
}
for (int i=0; i<_buckets; i++)
{
......
......@@ -68,14 +68,11 @@ public class OneMeasurementTimeSeries extends OneMeasurement
int min=-1;
int max=-1;
private HashMap<Integer, int[]> returncodes;
public OneMeasurementTimeSeries(String name, Properties props)
{
super(name);
_granularity=Integer.parseInt(props.getProperty(GRANULARITY,GRANULARITY_DEFAULT));
_measurements=new Vector<SeriesUnit>();
returncodes=new HashMap<Integer,int[]>();
}
void checkEndOfUnit(boolean forceend)
......@@ -138,30 +135,16 @@ public class OneMeasurementTimeSeries extends OneMeasurement
//TODO: 95th and 99th percentile latency
for (Integer I : returncodes.keySet())
{
int[] val=returncodes.get(I);
exporter.write(getName(), "Return="+I, val[0]);
}
for (Map.Entry<Integer, AtomicInteger> entry : returncodes.entrySet()) {
exporter.write(getName(), "Return=" + entry.getKey(), entry.getValue().get());
}
for (SeriesUnit unit : _measurements)
{
exporter.write(getName(), Long.toString(unit.time), unit.average);
}
}
@Override
public void reportReturnCode(int code) {
Integer Icode=code;
if (!returncodes.containsKey(Icode))
{
int[] val=new int[1];
val[0]=0;
returncodes.put(Icode,val);
}
returncodes.get(Icode)[0]++;
}
@Override
public String getSummary() {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment