fullfil the ScriptLoadCommand, and we can rollback it now

This commit is contained in:
Tienan Chen 2013-11-01 14:44:41 +08:00
parent dbe83ffd58
commit 57d9329dd9
6 changed files with 447 additions and 184 deletions

View File

@ -21,7 +21,6 @@ import org.springframework.stereotype.Component;
@Component
public class ScriptService {
private SessionHelper sessionHelper = new SessionHelper();
private UserService userService;

View File

@ -1,49 +1,37 @@
package org.bench4q.master.testPlan;
import java.io.IOException;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import org.apache.log4j.Logger;
import org.bench4q.master.api.model.RunningAgentModel;
import org.bench4q.master.api.model.RunningScriptModel;
import org.bench4q.master.communication.HttpRequester;
import org.bench4q.master.communication.agent.RunScenarioModel;
import org.bench4q.master.communication.agent.RunScenarioResultModel;
import org.bench4q.master.entity.db.Agent;
import org.bench4q.master.service.AgentService;
import org.bench4q.master.service.ScriptService;
import org.bench4q.master.testPlan.highavailable.HighAvailableAgentPool;
import org.bench4q.master.testPlan.loadcommand.LoadCommand;
import org.bench4q.master.testPlan.loadcommand.ScriptLoadCommand;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class LoadBallancer {
private ScriptService scriptService;
private AgentService agentService;
// private ScriptService scriptService;
// private AgentService agentService;
private HighAvailableAgentPool highAvailableAgentPool;
private static Logger logger = Logger.getLogger(LoadBallancer.class);
@Autowired
public void setScriptService(ScriptService scriptService) {
this.scriptService = scriptService;
}
// @Autowired
// public void setScriptService(ScriptService scriptService) {
// this.scriptService = scriptService;
// }
private AgentService getAgentService() {
return agentService;
}
@Autowired
public void setAgentService(AgentService agentService) {
this.agentService = agentService;
}
// private AgentService getAgentService() {
// return agentService;
// }
//
// @Autowired
// public void setAgentService(AgentService agentService) {
// this.agentService = agentService;
// }
@Autowired
public void setHttpRequester(HttpRequester httpRequester) {
@ -68,15 +56,24 @@ public class LoadBallancer {
}
for (RunningScriptModel scriptInputModel : testPlanContext
.getRunningScriptMap().values()) {
RunningScriptModel sOutputModel = this.generateLoadForScript(
// RunningScriptModel sOutputModel = this.generateLoadForScript(
// scriptInputModel, testPlanId);
// if (sOutputModel == null) {
// logger.error("generateLoadForScriptFails where scriptInputModel is null and script num is :"
// + testPlanContext.getRunningScriptMap().size());
// return false;
// }
// testPlanContext.addToScriptMap(sOutputModel.getScriptId(),
// sOutputModel);
LoadCommand scriptLoadCommand = new ScriptLoadCommand(
scriptInputModel, testPlanId);
RunningScriptModel sOutputModel = (RunningScriptModel) scriptLoadCommand
.distributeLoad();
if (sOutputModel == null) {
logger.error("generateLoadForScriptFails where scriptInputModel is null and script num is :"
+ testPlanContext.getRunningScriptMap().size());
scriptLoadCommand.retieveLoad();
return false;
}
testPlanContext.addToScriptMap(sOutputModel.getScriptId(),
sOutputModel);
testPlanContext.addToScriptMap(sOutputModel);
}
return true;
}
@ -87,157 +84,159 @@ public class LoadBallancer {
.getTotalLoad();
}
private RunningScriptModel generateLoadForScript(
RunningScriptModel scriptInputModel, UUID testPlanId) {
RunScenarioModel runScenarioModel = this.scriptService
.getRunSceniroModelByScriptId(scriptInputModel.getScriptId());
if (runScenarioModel == null) {
return null;
}
try {
RunningScriptModel result = this.runAgentsWithScenario(
runScenarioModel, scriptInputModel.getRequireLoad(),
scriptInputModel.getScriptId(), testPlanId);
// private RunningScriptModel generateLoadForScript(
// RunningScriptModel scriptInputModel, UUID testPlanId) {
// RunScenarioModel runScenarioModel = this.scriptService
// .getRunSceniroModelByScriptId(scriptInputModel.getScriptId());
// if (runScenarioModel == null) {
// return null;
// }
// try {
// RunningScriptModel result = this.runAgentsWithScenario(
// runScenarioModel, scriptInputModel.getRequireLoad(),
// scriptInputModel.getScriptId(), testPlanId);
//
// if (result.getRunningAgents() == null) {
// // this means that allocation for this script fails
// // TODO: sign the script's failure in response.
// logger.error("runAgentsWithScenario fails where scriptId = "
// + result.getScriptId());
// return null;
// }
// result.setRequireLoad(scriptInputModel.getRequireLoad());
// result.setConfig(scriptInputModel.getConfig());
// return result;
// } catch (JAXBException e) {
// e.printStackTrace();
// return null;
// }
// }
if (result.getRunningAgents() == null) {
// this means that allocation for this script fails
// TODO: sign the script's failure in response.
logger.error("runAgentsWithScenario fails where scriptId = "
+ result.getScriptId());
return null;
}
// private RunningScriptModel runAgentsWithScenario(
// RunScenarioModel runScenarioModel, int totalRequireLoad,
// int scriptId, UUID testPlanId) throws JAXBException {
// RunningAgentModel runningAgentModel = new RunningAgentModel();
// RunScenarioResultModel runScenarioResultModel = new
// RunScenarioResultModel();
// List<RunningAgentModel> runningAgentModelList = new
// ArrayList<RunningAgentModel>();
// int loadForRunCurrent;
//
// for (Agent agent : this.getHighAvailableAgentPool()
// .getHighAvailablePool()) {
// if (allocationFinish(totalRequireLoad)) {
// break;
// }
// if (this.highAvailableAgentPool.queryAgentStatus(agent) == null
// || inUse(agent)) {
// continue;
// }
// loadForRunCurrent = getMin(totalRequireLoad, agent.getRemainLoad());
// runScenarioModel.setPoolSize(loadForRunCurrent);
// runScenarioModel.setTotalCount(loadForRunCurrent);
// runScenarioResultModel = runAgentWithScenario(runScenarioModel,
// agent);
// if (runScenarioResultModel == null) {
// continue;
// }
// runningAgentModel = buildRunningAgentModel(agent,
// loadForRunCurrent, scriptId,
// runScenarioResultModel.getRunId());
// runningAgentModelList.add(runningAgentModel);
//
// this.highAvailableAgentPool.getAgentRunBlotters().put(
// runScenarioResultModel.getRunId(),
// buildAgentRunBlotter(runningAgentModel, testPlanId));
// totalRequireLoad -= loadForRunCurrent;
// }
//
// if (!allocationFinish(totalRequireLoad)) {
// logger.error("allocationUnfinished, remain " + totalRequireLoad
// + " unallocated");
// runningAgentModelList =
// rollbackForUnfinishedAllocation(runningAgentModelList);
// }
// return buildRunningScriptModel(runningAgentModelList, scriptId);
// }
result.setRequireLoad(scriptInputModel.getRequireLoad());
result.setConfig(scriptInputModel.getConfig());
return result;
} catch (JAXBException e) {
e.printStackTrace();
return null;
}
}
// private List<RunningAgentModel> rollbackForUnfinishedAllocation(
// List<RunningAgentModel> runningAgentModelList) {
// stopAgentsRunningThisScript(runningAgentModelList);
// runningAgentModelList = null;
// return runningAgentModelList;
// }
private RunningScriptModel runAgentsWithScenario(
RunScenarioModel runScenarioModel, int totalRequireLoad,
int scriptId, UUID testPlanId) throws JAXBException {
RunningAgentModel runningAgentModel = new RunningAgentModel();
RunScenarioResultModel runScenarioResultModel = new RunScenarioResultModel();
List<RunningAgentModel> runningAgentModelList = new ArrayList<RunningAgentModel>();
int loadForRunCurrent;
// private boolean allocationFinish(int requireLoad) {
// return requireLoad <= 0;
// }
for (Agent agent : this.getHighAvailableAgentPool()
.getHighAvailablePool()) {
if (allocationFinish(totalRequireLoad)) {
break;
}
if (this.highAvailableAgentPool.queryAgentStatus(agent) == null
|| inUse(agent)) {
continue;
}
loadForRunCurrent = getMin(totalRequireLoad, agent.getRemainLoad());
runScenarioModel.setPoolSize(loadForRunCurrent);
runScenarioModel.setTotalCount(loadForRunCurrent);
runScenarioResultModel = runAgentWithScenario(runScenarioModel,
agent);
if (runScenarioResultModel == null) {
continue;
}
runningAgentModel = buildRunningAgentModel(agent,
loadForRunCurrent, scriptId,
runScenarioResultModel.getRunId());
runningAgentModelList.add(runningAgentModel);
// private void stopAgentsRunningThisScript(
// List<RunningAgentModel> runningAgentModels) {
// for (RunningAgentModel runningAgentModel : runningAgentModels) {
// this.getAgentService().stop(runningAgentModel.getAgent(),
// runningAgentModel.getAgentRunId());
// }
// }
this.highAvailableAgentPool.getAgentRunBlotters().put(
runScenarioResultModel.getRunId(),
buildAgentRunBlotter(runningAgentModel, testPlanId));
totalRequireLoad -= loadForRunCurrent;
}
// private RunScenarioResultModel runAgentWithScenario(
// RunScenarioModel runScenarioModel, Agent agent)
// throws JAXBException {
// try {
// if (!this.getAgentService().getLoadFromAgent(agent.getHostName(),
// runScenarioModel.getPoolSize())) {
// return null;
// }
// return this.getAgentService().run(agent,
// this._marshalRunScenarioModelToString(runScenarioModel));
//
// } catch (IOException e) {
// e.printStackTrace();
// return null;
// }
// }
if (!allocationFinish(totalRequireLoad)) {
logger.error("allocationUnfinished, remain " + totalRequireLoad
+ " unallocated");
runningAgentModelList = rollbackForUnfinishedAllocation(runningAgentModelList);
}
return buildRunningScriptModel(runningAgentModelList, scriptId);
}
// private RunningAgentModel buildRunningAgentModel(Agent agent,
// int loadInUse, int scriptId, UUID agentRunId) {
// RunningAgentModel runningAgentModel = new RunningAgentModel();
// runningAgentModel.setAgent(agent);
// runningAgentModel.setLoadInUse(loadInUse);
// runningAgentModel.setScriptId(scriptId);
// runningAgentModel.setAgentRunId(agentRunId);
// return runningAgentModel;
// }
//
// private AgentRunBlotter buildAgentRunBlotter(
// RunningAgentModel runningAgentModel, UUID testPlanId) {
// AgentRunBlotter result = new AgentRunBlotter();
// result.setRunningAgentModel(runningAgentModel);
// result.setTestPlanId(testPlanId);
// return result;
// }
private List<RunningAgentModel> rollbackForUnfinishedAllocation(
List<RunningAgentModel> runningAgentModelList) {
stopAgentsRunningThisScript(runningAgentModelList);
runningAgentModelList = null;
return runningAgentModelList;
}
// private boolean inUse(Agent agent) {
// return agent.getRemainLoad() < agent.getMaxLoad();
// }
//
// private int getMin(int requireLoad, int remainLoadByStart) {
// return remainLoadByStart >= requireLoad ? requireLoad
// : remainLoadByStart;
// }
private boolean allocationFinish(int requireLoad) {
return requireLoad <= 0;
}
private void stopAgentsRunningThisScript(
List<RunningAgentModel> runningAgentModels) {
for (RunningAgentModel runningAgentModel : runningAgentModels) {
this.getAgentService().stop(runningAgentModel.getAgent(),
runningAgentModel.getAgentRunId());
}
}
private RunScenarioResultModel runAgentWithScenario(
RunScenarioModel runScenarioModel, Agent agent)
throws JAXBException {
try {
if (!this.getAgentService().getLoadFromAgent(agent.getHostName(),
runScenarioModel.getPoolSize())) {
return null;
}
return this.getAgentService().run(agent,
this._marshalRunScenarioModelToString(runScenarioModel));
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
private RunningAgentModel buildRunningAgentModel(Agent agent,
int loadInUse, int scriptId, UUID agentRunId) {
RunningAgentModel runningAgentModel = new RunningAgentModel();
runningAgentModel.setAgent(agent);
runningAgentModel.setLoadInUse(loadInUse);
runningAgentModel.setScriptId(scriptId);
runningAgentModel.setAgentRunId(agentRunId);
return runningAgentModel;
}
private AgentRunBlotter buildAgentRunBlotter(
RunningAgentModel runningAgentModel, UUID testPlanId) {
AgentRunBlotter result = new AgentRunBlotter();
result.setRunningAgentModel(runningAgentModel);
result.setTestPlanId(testPlanId);
return result;
}
private boolean inUse(Agent agent) {
return agent.getRemainLoad() < agent.getMaxLoad();
}
private int getMin(int requireLoad, int remainLoadByStart) {
return remainLoadByStart >= requireLoad ? requireLoad
: remainLoadByStart;
}
private String _marshalRunScenarioModelToString(
RunScenarioModel runScenarioModel) throws JAXBException {
Marshaller marshaller;
marshaller = JAXBContext.newInstance(runScenarioModel.getClass())
.createMarshaller();
StringWriter stringWriter = new StringWriter();
marshaller.marshal(runScenarioModel, stringWriter);
return stringWriter.toString();
}
private RunningScriptModel buildRunningScriptModel(
List<RunningAgentModel> runningAgentModels, int scriptId) {
RunningScriptModel result = new RunningScriptModel();
result.setScriptId(scriptId);
result.setRunningAgents(runningAgentModels);
return result;
}
// private String _marshalRunScenarioModelToString(
// RunScenarioModel runScenarioModel) throws JAXBException {
// Marshaller marshaller;
// marshaller = JAXBContext.newInstance(runScenarioModel.getClass())
// .createMarshaller();
// StringWriter stringWriter = new StringWriter();
// marshaller.marshal(runScenarioModel, stringWriter);
// return stringWriter.toString();
// }
//
// private RunningScriptModel buildRunningScriptModel(
// List<RunningAgentModel> runningAgentModels, int scriptId) {
// RunningScriptModel result = new RunningScriptModel();
// result.setScriptId(scriptId);
// result.setRunningAgents(runningAgentModels);
// return result;
// }
}

View File

@ -53,9 +53,10 @@ public class TestPlanContext {
}
}
public void addToScriptMap(Integer scriptId,
RunningScriptModel runningScriptModel) {
this.runningScriptMap.put(scriptId, runningScriptModel);
public void addToScriptMap(RunningScriptModel runningScriptModel) {
this.runningScriptMap.put(
new Integer(runningScriptModel.getScriptId()),
runningScriptModel);
}
public RunningScriptModel queryRunningScriptModel(int scriptId) {

View File

@ -1,11 +1,258 @@
package org.bench4q.master.testPlan.loadcommand;
import java.io.IOException;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import org.apache.log4j.Logger;
import org.bench4q.master.api.model.RunningAgentModel;
import org.bench4q.master.api.model.RunningScriptModel;
import org.bench4q.master.communication.agent.RunScenarioModel;
import org.bench4q.master.communication.agent.RunScenarioResultModel;
import org.bench4q.master.communication.agent.StopTestModel;
import org.bench4q.master.entity.db.Agent;
import org.bench4q.master.helper.ApplicationContextHelper;
import org.bench4q.master.service.AgentService;
import org.bench4q.master.service.ScriptService;
import org.bench4q.master.testPlan.AgentRunBlotter;
import org.bench4q.master.testPlan.highavailable.HighAvailableAgentPool;
public class ScriptLoadCommand implements LoadCommand {
private RunningScriptModel runningScriptModel;
private UUID testPlanRunID;
private AgentService agentService;
private ScriptService scriptService;
private HighAvailableAgentPool highAvailableAgentPool;
private static Logger logger = Logger.getLogger(ScriptLoadCommand.class);
public RunningScriptModel getRunningScriptModel() {
return runningScriptModel;
}
private void setRunningScriptModel(RunningScriptModel runningScriptModel) {
this.runningScriptModel = runningScriptModel;
}
public UUID getTestPlanRunID() {
return testPlanRunID;
}
private void setTestPlanRunID(UUID testPlanRunID) {
this.testPlanRunID = testPlanRunID;
}
public AgentService getAgentService() {
return agentService;
}
public void setAgentService(AgentService agentService) {
this.agentService = agentService;
}
private ScriptService getScriptService() {
return scriptService;
}
public void setScriptService(ScriptService scriptService) {
this.scriptService = scriptService;
}
public HighAvailableAgentPool getHighAvailableAgentPool() {
return highAvailableAgentPool;
}
public void setHighAvailableAgentPool(
HighAvailableAgentPool highAvailableAgentPool) {
this.highAvailableAgentPool = highAvailableAgentPool;
}
public ScriptLoadCommand(RunningScriptModel runningScriptModel,
UUID testPlanRunID) {
this.setRunningScriptModel(runningScriptModel);
this.setTestPlanRunID(testPlanRunID);
this.setScriptService(ApplicationContextHelper.getContext().getBean(
ScriptService.class));
this.setAgentService(ApplicationContextHelper.getContext().getBean(
AgentService.class));
this.setHighAvailableAgentPool(ApplicationContextHelper.getContext()
.getBean(HighAvailableAgentPool.class));
}
public Object distributeLoad() {
return null;
RunScenarioModel runScenarioModel = this.getScriptService()
.getRunSceniroModelByScriptId(
this.getRunningScriptModel().getScriptId());
if (runScenarioModel == null) {
logger.error("runScenarioModel is null!");
return null;
}
try {
RunningScriptModel result = this.runAgentsWithScenario(
runScenarioModel, this.getRunningScriptModel()
.getRequireLoad(), this.getRunningScriptModel()
.getScriptId(), this.getTestPlanRunID());
if (result.getRunningAgents() == null) {
logger.error("runAgentsWithScenario fails where scriptId = "
+ result.getScriptId());
return null;
}
result.setRequireLoad(this.getRunningScriptModel().getRequireLoad());
result.setConfig(this.getRunningScriptModel().getConfig());
return result;
} catch (Exception e) {
logger.error(e.getMessage() + "whose scriptID is "
+ this.getRunningScriptModel().getScriptId()
+ " and TestPlanID is "
+ this.getTestPlanRunID().toString());
return null;
}
}
private RunningScriptModel runAgentsWithScenario(
RunScenarioModel runScenarioModel, int totalRequireLoad,
int scriptId, UUID testPlanId) throws JAXBException,
ScriptLoadDistributeException {
RunningAgentModel runningAgentModel = new RunningAgentModel();
RunScenarioResultModel runScenarioResultModel = new RunScenarioResultModel();
List<RunningAgentModel> runningAgentModelList = new ArrayList<RunningAgentModel>();
int loadForRunCurrent;
for (Agent agent : this.getHighAvailableAgentPool()
.getHighAvailablePool()) {
if (allocationFinish(totalRequireLoad)) {
break;
}
if (this.getHighAvailableAgentPool().queryAgentStatus(agent) == null
|| inUse(agent)) {
continue;
}
loadForRunCurrent = getMin(totalRequireLoad, agent.getRemainLoad());
runScenarioModel.setPoolSize(loadForRunCurrent);
runScenarioModel.setTotalCount(loadForRunCurrent);
runScenarioResultModel = runAgentWithScenario(runScenarioModel,
agent);
if (runScenarioResultModel == null) {
continue;
}
runningAgentModel = buildRunningAgentModel(agent,
loadForRunCurrent, scriptId,
runScenarioResultModel.getRunId());
runningAgentModelList.add(runningAgentModel);
this.getHighAvailableAgentPool()
.getAgentRunBlotters()
.put(runScenarioResultModel.getRunId(),
buildAgentRunBlotter(runningAgentModel, testPlanId));
totalRequireLoad -= loadForRunCurrent;
}
if (!allocationFinish(totalRequireLoad)) {
logger.error("allocationUnfinished, remain " + totalRequireLoad
+ " unallocated");
throw new ScriptLoadDistributeException();
}
return buildRunningScriptModel(runningAgentModelList, scriptId);
}
private boolean allocationFinish(int requireLoad) {
return requireLoad <= 0;
}
private boolean inUse(Agent agent) {
return agent.getRemainLoad() < agent.getMaxLoad();
}
private int getMin(int requireLoad, int remainLoadByStart) {
return remainLoadByStart >= requireLoad ? requireLoad
: remainLoadByStart;
}
private RunningAgentModel buildRunningAgentModel(Agent agent,
int loadInUse, int scriptId, UUID agentRunId) {
RunningAgentModel runningAgentModel = new RunningAgentModel();
runningAgentModel.setAgent(agent);
runningAgentModel.setLoadInUse(loadInUse);
runningAgentModel.setScriptId(scriptId);
runningAgentModel.setAgentRunId(agentRunId);
return runningAgentModel;
}
private AgentRunBlotter buildAgentRunBlotter(
RunningAgentModel runningAgentModel, UUID testPlanId) {
AgentRunBlotter result = new AgentRunBlotter();
result.setRunningAgentModel(runningAgentModel);
result.setTestPlanId(testPlanId);
return result;
}
private RunScenarioResultModel runAgentWithScenario(
RunScenarioModel runScenarioModel, Agent agent)
throws JAXBException {
try {
if (!this.getAgentService().getLoadFromAgent(agent.getHostName(),
runScenarioModel.getPoolSize())) {
return null;
}
return this.getAgentService().run(agent,
this._marshalRunScenarioModelToString(runScenarioModel));
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
private String _marshalRunScenarioModelToString(
RunScenarioModel runScenarioModel) throws JAXBException {
Marshaller marshaller;
marshaller = JAXBContext.newInstance(runScenarioModel.getClass())
.createMarshaller();
StringWriter stringWriter = new StringWriter();
marshaller.marshal(runScenarioModel, stringWriter);
return stringWriter.toString();
}
private RunningScriptModel buildRunningScriptModel(
List<RunningAgentModel> runningAgentModels, int scriptId) {
RunningScriptModel result = new RunningScriptModel();
result.setScriptId(scriptId);
result.setRunningAgents(runningAgentModels);
return result;
}
public void retieveLoad() {
stopAgentsRunningThisScript(this.getRunningScriptModel()
.getRunningAgents());
if (this.getRunningScriptModel().getRunningAgents().size() > 0) {
}
}
private void stopAgentsRunningThisScript(
List<RunningAgentModel> runningAgentModels) {
if (runningAgentModels == null) {
return;
}
for (RunningAgentModel runningAgentModel : runningAgentModels) {
if (runningAgentModel.getAgent().getCurrentStatus() == AgentService.AGENT_STATUS_BreakDown) {
runningAgentModels.remove(runningAgentModel);
continue;
} else if (stopAgentSuccess(runningAgentModel)) {
runningAgentModels.remove(runningAgentModel);
}
}
}
private boolean stopAgentSuccess(RunningAgentModel runningAgentModel) {
StopTestModel resultModel = this.getAgentService()
.stop(runningAgentModel.getAgent(),
runningAgentModel.getAgentRunId());
return (resultModel != null) && resultModel.isSuccess();
}
}

View File

@ -0,0 +1,18 @@
package org.bench4q.master.testPlan.loadcommand;
public class ScriptLoadDistributeException extends Exception {
private static final long serialVersionUID = -5230579598325900610L;
private String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public ScriptLoadDistributeException() {
this.setMessage("Distribute load for script fails!");
}
}

View File

@ -8,5 +8,4 @@ public class TestPlanLoadCommand implements LoadCommand {
public void retieveLoad() {
}
}