Skip to content

Commit 256947e

Browse files
authored
Merge pull request #922 from jglick/SimpleCommandLauncher
Implement `afterDisconnect` in `SimpleCommandLauncher`
2 parents f25ef8c + 86a2bc9 commit 256947e

File tree

1 file changed

+23
-14
lines changed

1 file changed

+23
-14
lines changed

src/main/java/org/jvnet/hudson/test/SimpleCommandLauncher.java

+23-14
Original file line numberDiff line numberDiff line change
@@ -24,19 +24,18 @@
2424

2525
package org.jvnet.hudson.test;
2626

27+
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
2728
import hudson.AbortException;
2829
import hudson.EnvVars;
2930
import hudson.Extension;
3031
import hudson.Util;
3132
import hudson.model.Descriptor;
3233
import hudson.model.Slave;
3334
import hudson.model.TaskListener;
34-
import hudson.remoting.Channel;
3535
import hudson.slaves.ComputerLauncher;
3636
import hudson.slaves.SlaveComputer;
3737
import hudson.util.ProcessTree;
3838
import hudson.util.StreamCopyThread;
39-
import java.io.IOException;
4039
import java.util.HashMap;
4140
import java.util.Map;
4241
import java.util.logging.Level;
@@ -52,6 +51,8 @@ public class SimpleCommandLauncher extends ComputerLauncher {
5251

5352
public final String cmd;
5453
private final Map<String, String> env;
54+
private transient Process proc;
55+
private transient EnvVars cookie;
5556

5657
@DataBoundConstructor // in case anyone needs to configRoundtrip such a node
5758
public SimpleCommandLauncher(String cmd) {
@@ -72,29 +73,37 @@ public void launch(SlaveComputer computer, final TaskListener listener) {
7273
}
7374
listener.getLogger().println("$ " + cmd);
7475
ProcessBuilder pb = new ProcessBuilder(Util.tokenize(cmd));
75-
final EnvVars cookie = EnvVars.createCookie();
76+
cookie = EnvVars.createCookie();
7677
pb.environment().putAll(cookie);
7778
if (env != null) {
7879
pb.environment().putAll(env);
7980
}
80-
final Process proc = pb.start();
81+
proc = pb.start();
8182
new StreamCopyThread("stderr copier for remote agent on " + computer.getDisplayName(), proc.getErrorStream(), listener.getLogger()).start();
82-
computer.setChannel(proc.getInputStream(), proc.getOutputStream(), listener.getLogger(), new Channel.Listener() {
83-
@Override
84-
public void onClosed(Channel channel, IOException cause) {
85-
try {
86-
ProcessTree.get().killAll(proc, cookie);
87-
} catch (Exception x) {
88-
LOGGER.log(Level.WARNING, null, x);
89-
}
90-
}
91-
});
83+
computer.setChannel(proc.getInputStream(), proc.getOutputStream(), listener, null);
9284
LOGGER.log(Level.INFO, "agent launched for {0}", computer.getName());
9385
} catch (Exception x) {
9486
LOGGER.log(Level.WARNING, null, x);
9587
}
9688
}
9789

90+
@SuppressFBWarnings(value = "IS2_INCONSISTENT_SYNC", justification = "test code, close enough")
91+
@Override
92+
public synchronized void afterDisconnect(SlaveComputer computer, TaskListener listener) {
93+
if (proc != null) {
94+
try {
95+
ProcessTree.get().killAll(proc, cookie);
96+
LOGGER.info(() -> "killed " + proc + " with " + cookie + " for " + computer.getName());
97+
} catch (Exception x) {
98+
LOGGER.log(Level.WARNING, "failed to kill " + proc + " with " + cookie + " for " + computer.getName(), x);
99+
}
100+
proc = null;
101+
cookie = null;
102+
} else {
103+
LOGGER.info(() -> "no process for " + computer.getName());
104+
}
105+
}
106+
98107
@Extension
99108
public static class DescriptorImpl extends Descriptor<ComputerLauncher> {}
100109
}

0 commit comments

Comments
 (0)