package org.radargun.service;
import java.util.regex.Pattern;
import org.radargun.utils.TimeService;
/**
* @author Matej Cimbora
*/
public class SparkWorkerLifecycle extends AbstractSparkLifecycle {
private static final Pattern START_PATTERN = Pattern.compile(".*starting org\\.apache\\.spark\\.deploy\\.worker\\.Worker, logging to.*");
private static final Pattern CONNECTED_TO_MASTER_PATTERN = Pattern.compile(".*Worker: Successfully registered with master.*");
// Consider worker running only when it's associated with a master
private boolean connectedToMaster;
public SparkWorkerLifecycle(SparkWorkerService service) {
super(service);
}
@Override
protected void startInternal() {
service.registerAction(CONNECTED_TO_MASTER_PATTERN, m -> {
setConnectedToMaster();
});
super.startInternal();
long startTime = TimeService.currentTimeMillis();
synchronized (this) {
while (!connectedToMaster) {
try {
long waitTime = startTime + service.startTimeout - TimeService.currentTimeMillis();
if (waitTime <= 0) {
throw new IllegalStateException("Connection with master wasn't established within timeout");
}
wait(waitTime);
} catch (InterruptedException e) {
throw new IllegalStateException(e);
}
}
}
}
protected synchronized void setConnectedToMaster() {
connectedToMaster = true;
notifyAll();
}
@Override
protected Pattern getStartPattern() {
return START_PATTERN;
}
}