/*
* Copyright 2009-2016 Weibo, Inc.
*
* 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.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.weibo.motan.benchmark;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.CyclicBarrier;
public abstract class AbstractClientRunnable implements ClientRunnable {
RunnableStatistics statistics;
private CyclicBarrier cyclicBarrier;
private CountDownLatch countDownLatch;
private long startTime;
private long endTime;
private int statisticTime;
private BenchmarkService benchmarkService;
public AbstractClientRunnable(BenchmarkService benchmarkService, CyclicBarrier barrier, CountDownLatch latch, long startTime, long endTime) {
this.cyclicBarrier = barrier;
this.countDownLatch = latch;
this.startTime = startTime;
this.endTime = endTime;
this.benchmarkService = benchmarkService;
statisticTime = (int) ((endTime - startTime) / 1000000);
statistics = new RunnableStatistics(statisticTime);
}
@Override
public RunnableStatistics getStatistics() {
return statistics;
}
@Override
public void run() {
try {
cyclicBarrier.await();
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}
callService();
countDownLatch.countDown();
}
private void callService() {
long beginTime = System.nanoTime() / 1000L;
while (beginTime <= startTime) {
// warm up
beginTime = System.nanoTime() / 1000L;
Object result = call(benchmarkService);
}
while (beginTime <= endTime) {
beginTime = System.nanoTime() / 1000L;
Object result = call(benchmarkService);
long responseTime = System.nanoTime() / 1000L - beginTime;
collectResponseTimeDistribution(responseTime);
int currTime = (int) ((beginTime - startTime) / 1000000L);
if (currTime >= statisticTime) {
continue;
}
if (result != null) {
statistics.TPS[currTime]++;
statistics.RT[currTime] += responseTime;
} else {
statistics.errTPS[currTime]++;
statistics.errRT[currTime] += responseTime;
}
}
}
private void collectResponseTimeDistribution(long time) {
double responseTime = (double) (time / 1000L);
if (responseTime >= 0 && responseTime <= 1) {
statistics.above0sum++;
} else if (responseTime > 1 && responseTime <= 5) {
statistics.above1sum++;
} else if (responseTime > 5 && responseTime <= 10) {
statistics.above5sum++;
} else if (responseTime > 10 && responseTime <= 50) {
statistics.above10sum++;
} else if (responseTime > 50 && responseTime <= 100) {
statistics.above50sum++;
} else if (responseTime > 100 && responseTime <= 500) {
statistics.above100sum++;
} else if (responseTime > 500 && responseTime <= 1000) {
statistics.above500sum++;
} else if (responseTime > 1000) {
statistics.above1000sum++;
}
}
protected abstract Object call(BenchmarkService benchmarkService);
}