private Stage lockAndRerunStage(String pipelineName, Integer counter, String stageName, StageInstanceCreator creator, final ErrorConditionHandler errorHandler) {
synchronized (mutexForPipeline(pipelineName)) {
OperationResult result = new ServerHealthStateOperationResult();
if (!schedulingChecker.canSchedule(result)) {
errorHandler.cantSchedule(result.getServerHealthState().getDescription(), pipelineName, stageName);
}
String username = CaseInsensitiveString.str(SessionUtils.currentUsername().getUsername());
if (!securityService.hasOperatePermissionForStage(pipelineName, stageName, username)) {
errorHandler.noOperatePermission(pipelineName, stageName);
}
Pipeline pipeline = pipelineService.fullPipelineByCounter(pipelineName, counter);
if (pipeline == null) {
errorHandler.nullPipeline(pipelineName, counter, stageName);
}
if (!pipeline.hasStageBeenRun(stageName)) {
if (goConfigService.hasPreviousStage(pipelineName, stageName)) {
CaseInsensitiveString previousStageName = goConfigService.previousStage(pipelineName, stageName).name();
if (!pipeline.hasStageBeenRun(CaseInsensitiveString.str(previousStageName))) {
errorHandler.previousStageNotRun(pipeline.getName(), stageName);
}
}
}
Stage stage = internalRerun(pipeline, stageName, username, creator, errorHandler);
if (stage == null) {
errorHandler.nullStage(stageName);
}
return stage;
}
}