/*
* Copyright (c) 2010-2012 Grid Dynamics Consulting Services, Inc, All Rights Reserved
* http://www.griddynamics.com
*
* This library is free software; you can redistribute it and/or modify it under the terms of
* the Apache License; either
* version 2.0 of the License, or any later version.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package com.griddynamics.jagger.engine.e1.scenario;
import com.griddynamics.jagger.util.JavaSystemClock;
import com.griddynamics.jagger.util.SystemClock;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.math.BigDecimal;
/**
* @author Nikolay Musienko
* Date: 28.06.13
*/
public abstract class AbstractRateClockConfiguration implements WorkloadClockConfiguration {
private static final Logger log = LoggerFactory.getLogger(TpsClockConfiguration.class);
private int tickInterval = 500;
private double tps;
private MaxTpsCalculator maxTpsCalculator = new DefaultMaxTpsCalculator();
private WorkloadSuggestionMaker workloadSuggestionMaker;
private int maxThreadNumber = 50;
private int maxThreadDiff = 10;
private SystemClock systemClock = new JavaSystemClock();
private long warmUpTime = -1;
public void setTickInterval(int tickInterval) {
this.tickInterval = tickInterval;
}
@Override
public WorkloadClock getClock() {
log.debug("Going to create workload clock");
TpsRouter tpsRouter = new DefaultTpsRouter(createDesiredTps(new BigDecimal(tps)), maxTpsCalculator, systemClock);
if (workloadSuggestionMaker == null) {
workloadSuggestionMaker = new DefaultWorkloadSuggestionMaker(maxThreadDiff);
}
return getRateClock(tickInterval, tpsRouter, workloadSuggestionMaker, systemClock, maxThreadNumber);
}
protected DesiredTps createDesiredTps (BigDecimal tps) {
log.debug("creating createDesiredTps({}, {})", new Object[] { tps, warmUpTime });
if (!isRumpUp()) {
log.debug("creating ConstantTps({})", tps);
return new ConstantTps(tps);
}
log.debug("creating RumpUpTps({}, {})", new Object[]{ tps, warmUpTime });
return new RumpUpTps(tps, warmUpTime);
}
protected abstract WorkloadClock getRateClock(int tickInterval, TpsRouter tpsRouter,
WorkloadSuggestionMaker workloadSuggestionMaker,
SystemClock systemClock, int maxThreadNumber);
public int getTickInterval() {
return tickInterval;
}
public void setValue(double tps) {
this.tps = tps;
}
public double getTps() {
return tps;
}
public void setTps(double tps) {
this.tps = tps;
}
public MaxTpsCalculator getMaxTpsCalculator() {
return maxTpsCalculator;
}
public void setMaxTpsCalculator(MaxTpsCalculator maxTpsCalculator) {
this.maxTpsCalculator = maxTpsCalculator;
}
public void setMaxThreadNumber(int maxThreadNumber) {
this.maxThreadNumber = maxThreadNumber;
}
public void setMaxThreadDiff(int maxThreadDiff) {
this.maxThreadDiff = maxThreadDiff;
}
public SystemClock getSystemClock() {
return systemClock;
}
public void setSystemClock(SystemClock systemClock) {
this.systemClock = systemClock;
}
public void setWorkloadSuggestionMaker(WorkloadSuggestionMaker workloadSuggestionMaker) {
this.workloadSuggestionMaker = workloadSuggestionMaker;
}
public long getWarmUpTime() {
return warmUpTime;
}
public void setWarmUpTime(long warmUpTime) {
this.warmUpTime = warmUpTime;
}
public boolean isRumpUp() {
return (warmUpTime != -1 && warmUpTime != 0);
}
}