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; ...@@ -27,8 +27,10 @@ import com.yahoo.ycsb.measurements.exporter.MeasurementsExporter;
public abstract class OneMeasurement { public abstract class OneMeasurement {
String _name; String _name;
final ConcurrentHashMap<Integer, AtomicInteger> returncodes;
public String getName() { public String getName() {
returncodes = new ConcurrentHashMap<Integer, AtomicInteger>();
return _name; return _name;
} }
...@@ -39,7 +41,22 @@ public abstract class OneMeasurement { ...@@ -39,7 +41,22 @@ public abstract class OneMeasurement {
this._name = _name; 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); public abstract void measure(int latency);
......
...@@ -46,13 +46,11 @@ public class OneMeasurementHdrHistogram extends OneMeasurement { ...@@ -46,13 +46,11 @@ public class OneMeasurementHdrHistogram extends OneMeasurement {
final HistogramLogWriter histogramLogWriter; final HistogramLogWriter histogramLogWriter;
final Recorder histogram = new Recorder(3); final Recorder histogram = new Recorder(3);
final ConcurrentHashMap<Integer, AtomicInteger> returncodes;
Histogram totalHistogram; Histogram totalHistogram;
public OneMeasurementHdrHistogram(String name, Properties props) { public OneMeasurementHdrHistogram(String name, Properties props) {
super(name); super(name);
returncodes = new ConcurrentHashMap<Integer, AtomicInteger>();
boolean shouldLog = Boolean.parseBoolean(props.getProperty("hdrhistogram.fileoutput", "false")); boolean shouldLog = Boolean.parseBoolean(props.getProperty("hdrhistogram.fileoutput", "false"));
if (!shouldLog) { if (!shouldLog) {
log = null; log = null;
...@@ -72,24 +70,6 @@ public class OneMeasurementHdrHistogram extends OneMeasurement { ...@@ -72,24 +70,6 @@ public class OneMeasurementHdrHistogram extends OneMeasurement {
histogramLogWriter.outputLegend(); 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. * It appears latency is reported in micros.
* Using {@link Recorder} to support concurrent updates to histogram. * Using {@link Recorder} to support concurrent updates to histogram.
......
...@@ -48,7 +48,6 @@ public class OneMeasurementHistogram extends OneMeasurement ...@@ -48,7 +48,6 @@ public class OneMeasurementHistogram extends OneMeasurement
int min; int min;
int max; int max;
HashMap<Integer,int[]> returncodes;
public OneMeasurementHistogram(String name, Properties props) public OneMeasurementHistogram(String name, Properties props)
{ {
...@@ -62,25 +61,8 @@ public class OneMeasurementHistogram extends OneMeasurement ...@@ -62,25 +61,8 @@ public class OneMeasurementHistogram extends OneMeasurement
windowtotallatency=0; windowtotallatency=0;
min=-1; min=-1;
max=-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) /* (non-Javadoc)
* @see com.yahoo.ycsb.OneMeasurement#measure(int) * @see com.yahoo.ycsb.OneMeasurement#measure(int)
*/ */
...@@ -136,11 +118,9 @@ public class OneMeasurementHistogram extends OneMeasurement ...@@ -136,11 +118,9 @@ public class OneMeasurementHistogram extends OneMeasurement
} }
} }
for (Integer I : returncodes.keySet()) for (Map.Entry<Integer, AtomicInteger> entry : returncodes.entrySet()) {
{ exporter.write(getName(), "Return=" + entry.getKey(), entry.getValue().get());
int[] val=returncodes.get(I); }
exporter.write(getName(), "Return="+I, val[0]);
}
for (int i=0; i<_buckets; i++) for (int i=0; i<_buckets; i++)
{ {
......
...@@ -68,14 +68,11 @@ public class OneMeasurementTimeSeries extends OneMeasurement ...@@ -68,14 +68,11 @@ public class OneMeasurementTimeSeries extends OneMeasurement
int min=-1; int min=-1;
int max=-1; int max=-1;
private HashMap<Integer, int[]> returncodes;
public OneMeasurementTimeSeries(String name, Properties props) public OneMeasurementTimeSeries(String name, Properties props)
{ {
super(name); super(name);
_granularity=Integer.parseInt(props.getProperty(GRANULARITY,GRANULARITY_DEFAULT)); _granularity=Integer.parseInt(props.getProperty(GRANULARITY,GRANULARITY_DEFAULT));
_measurements=new Vector<SeriesUnit>(); _measurements=new Vector<SeriesUnit>();
returncodes=new HashMap<Integer,int[]>();
} }
void checkEndOfUnit(boolean forceend) void checkEndOfUnit(boolean forceend)
...@@ -138,30 +135,16 @@ public class OneMeasurementTimeSeries extends OneMeasurement ...@@ -138,30 +135,16 @@ public class OneMeasurementTimeSeries extends OneMeasurement
//TODO: 95th and 99th percentile latency //TODO: 95th and 99th percentile latency
for (Integer I : returncodes.keySet())
{ for (Map.Entry<Integer, AtomicInteger> entry : returncodes.entrySet()) {
int[] val=returncodes.get(I); exporter.write(getName(), "Return=" + entry.getKey(), entry.getValue().get());
exporter.write(getName(), "Return="+I, val[0]); }
}
for (SeriesUnit unit : _measurements) for (SeriesUnit unit : _measurements)
{ {
exporter.write(getName(), Long.toString(unit.time), unit.average); 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 @Override
public String getSummary() { 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