package org.radargun.stages.cache.background;
import org.radargun.DistStageAck;
import org.radargun.config.Property;
import org.radargun.config.Stage;
import org.radargun.stages.AbstractDistStage;
/**
* @author Radim Vansa <rvansa@redhat.com>
*/
@Stage(doc = "Stage that checks the progress in background stressors and fails if something went wrong.")
public class BackgroundStressorsCheckStage extends AbstractDistStage {
@Property(doc = "Name of the background operations. By default, all instances are checked.")
public String name = null;
@Property(doc = "Stops stressors and waits until all confirmed operations are checked. Default is false.")
public boolean waitUntilChecked = false;
@Property(doc = "Resume stressors after we have stopped them in order to let checkers check everything. Default is false.")
public boolean resumeAfterChecked = false;
@Property(doc = "Waits until all stressors record new progress, or timeout (no-progress-timeout) elapses. Default is false.")
public boolean waitForProgress = false;
@Override
public DistStageAck executeOnSlave() {
if (name != null) {
BackgroundOpsManager manager = BackgroundOpsManager.getInstance(slaveState, name);
if (manager == null) {
return errorResponse("Manager '" + name + "' does not exist");
} else {
DistStageAck response = checkManager(manager);
if (response != null) return response;
}
} else {
for (BackgroundOpsManager manager : BackgroundOpsManager.getAllInstances(slaveState)) {
DistStageAck response = checkManager(manager);
if (response != null) return response;
}
}
return successfulResponse();
}
private DistStageAck checkManager(BackgroundOpsManager manager) {
boolean errorOnly = (waitUntilChecked || resumeAfterChecked || waitForProgress) && manager.getLogLogicConfiguration().isIgnoreDeadCheckers();
// Even if service is not running, check whether no errors had been logged before it stopped
String error = manager.getError(errorOnly);
if (error != null) {
return errorResponse("Background stressors " + manager.getName() + ": " + error);
}
if (waitUntilChecked && resumeAfterChecked) {
return errorResponse("Cannot both wait and resume in the same stage; other node may have not finished checking.");
}
if (!isServiceRunning()) {
return successfulResponse();
}
if (waitForProgress) {
if (!manager.waitForProgress()) {
return errorResponse("Background stressors have not completed any progress within timeout.");
}
error = manager.getError(errorOnly); // checking once more does not hurt
if (error != null) {
return errorResponse("Background stressors " + manager.getName() + ": " + error);
}
}
if (waitUntilChecked) {
error = manager.waitUntilChecked();
if (error != null) {
return errorResponse(error);
}
} else if (resumeAfterChecked) {
manager.resumeAfterChecked();
}
return null;
}
}