Added a Stop() method to handle stopping executor worker threads.
fix for bug 1181569 Refactored how stop was handled. Removing thread and stopping thread in the same syncronized loop was causing concurrent modification error. Needed to seperate the actions for it to work. Change-Id: I99b676f377842826f9e6a847cfeff76be91c8299
This commit is contained in:
parent
0b017fe95d
commit
78abc3d903
|
@ -20,12 +20,9 @@ package hudson.plugins.gearman;
|
||||||
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.HashSet;
|
|
||||||
|
|
||||||
import org.gearman.worker.GearmanFunctionFactory;
|
|
||||||
import org.gearman.common.GearmanNIOJobServerConnection;
|
import org.gearman.common.GearmanNIOJobServerConnection;
|
||||||
import org.gearman.worker.GearmanWorker;
|
import org.gearman.worker.GearmanFunctionFactory;
|
||||||
//import org.gearman.worker.GearmanWorkerImpl;
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
@ -118,8 +115,7 @@ public abstract class AbstractWorkerThread implements Runnable {
|
||||||
|
|
||||||
if (worker.isRunning()) {
|
if (worker.isRunning()) {
|
||||||
try {
|
try {
|
||||||
logger.info("---- Stopping " + getName() +" (" + new Date().toString() + ")");
|
worker.stop();
|
||||||
worker.shutdown();
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,7 +23,6 @@ import hudson.model.Computer;
|
||||||
import hudson.slaves.ComputerListener;
|
import hudson.slaves.ComputerListener;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
@ -67,19 +66,8 @@ public class ComputerListenerImpl extends ComputerListener {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// remove worker when jenkins slave is deleted or disconnected
|
// stop worker when jenkins slave is deleted or disconnected
|
||||||
GearmanProxy gp = GearmanProxy.getInstance();
|
GearmanProxy.getInstance().stop(c);
|
||||||
List<AbstractWorkerThread> workers = gp.getGewtHandles();
|
|
||||||
synchronized(workers) {
|
|
||||||
for (AbstractWorkerThread worker : workers) {
|
|
||||||
if (worker.name.contains(c.getName())) {
|
|
||||||
logger.info("---- stopping executor worker = "
|
|
||||||
+ worker.getName());
|
|
||||||
gp.getGewtHandles().remove(worker);
|
|
||||||
worker.stop();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -23,6 +23,7 @@ import hudson.model.Node;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import jenkins.model.Jenkins;
|
import jenkins.model.Jenkins;
|
||||||
|
@ -142,6 +143,9 @@ public class GearmanProxy {
|
||||||
masterName);
|
masterName);
|
||||||
gwt.start();
|
gwt.start();
|
||||||
gmwtHandles.add(gwt);
|
gmwtHandles.add(gwt);
|
||||||
|
|
||||||
|
logger.info("---- Num of executors running = " + getNumExecutors());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -168,8 +172,10 @@ public class GearmanProxy {
|
||||||
//ewt.registerJobs();
|
//ewt.registerJobs();
|
||||||
ewt.start();
|
ewt.start();
|
||||||
gewtHandles.add(ewt);
|
gewtHandles.add(ewt);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
logger.info("---- Num of executors running = " + getNumExecutors());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -194,6 +200,31 @@ public class GearmanProxy {
|
||||||
logger.info("---- Num of executors running = " + getNumExecutors());
|
logger.info("---- Num of executors running = " + getNumExecutors());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This method stops all threads on the gewtHandles list that
|
||||||
|
* is used to service the jenkins slave/computer
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @param Node
|
||||||
|
* The Computer to stop
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void stop(Computer computer) {
|
||||||
|
|
||||||
|
// find the computer in the executor workers list and stop it
|
||||||
|
synchronized(gewtHandles) {
|
||||||
|
for (Iterator<AbstractWorkerThread> it = gewtHandles.iterator(); it.hasNext(); ) {
|
||||||
|
AbstractWorkerThread t = it.next();
|
||||||
|
if (t.name.contains(computer.getName())) {
|
||||||
|
t.stop();
|
||||||
|
it.remove();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
logger.info("---- Num of executors running = " + getNumExecutors());
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This method returns the total number of gearman executor threads
|
* This method returns the total number of gearman executor threads
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in New Issue