提交 c74999f0 编写于 作者: J Jesse Glick

Found a race condition which could explain random CI hangs of CLIActionTest.authenticate.

上级 56cee951
......@@ -712,6 +712,7 @@ public class CLI implements AutoCloseable {
URL jenkins = new URL(url + "cli?remoting=false");
FullDuplexHttpStream streams = new FullDuplexHttpStream(jenkins, factory.authorization);
class ClientSideImpl extends PlainCLIProtocol.ClientSide {
boolean complete;
int exit = -1;
ClientSideImpl(InputStream is, OutputStream os) throws IOException {
super(is, os);
......@@ -720,9 +721,9 @@ public class CLI implements AutoCloseable {
}
}
@Override
protected synchronized void onExit(int code) {
protected void onExit(int code) {
this.exit = code;
notifyAll();
finished();
}
@Override
protected void onStdout(byte[] chunk) throws IOException {
......@@ -733,7 +734,11 @@ public class CLI implements AutoCloseable {
System.err.write(chunk);
}
@Override
protected synchronized void handleClose() {
protected void handleClose() {
finished();
}
private synchronized void finished() {
complete = true;
notifyAll();
}
}
......@@ -761,7 +766,9 @@ public class CLI implements AutoCloseable {
}
}.start();
synchronized (connection) {
connection.wait();
while (!connection.complete) {
connection.wait();
}
}
return connection.exit;
}
......
......@@ -135,6 +135,7 @@ public class CLIAction implements UnprotectedRootAction, StaplerProxy {
protected void run(InputStream upload, OutputStream download) throws IOException, InterruptedException {
final AtomicReference<Thread> runningThread = new AtomicReference<>();
class ServerSideImpl extends PlainCLIProtocol.ServerSide {
boolean ready;
List<String> args = new ArrayList<>();
Locale locale = Locale.getDefault();
Charset encoding = Charset.defaultCharset();
......@@ -167,8 +168,8 @@ public class CLIAction implements UnprotectedRootAction, StaplerProxy {
}
}
@Override
protected synchronized void onStart() {
notifyAll();
protected void onStart() {
ready();
}
@Override
protected void onStdin(byte[] chunk) throws IOException {
......@@ -179,18 +180,24 @@ public class CLIAction implements UnprotectedRootAction, StaplerProxy {
stdinMatch.close();
}
@Override
protected synchronized void handleClose() {
notifyAll();
protected void handleClose() {
ready();
Thread t = runningThread.get();
if (t != null) {
t.interrupt();
}
}
private synchronized void ready() {
ready = true;
notifyAll();
}
}
try (ServerSideImpl connection = new ServerSideImpl(upload, download)) {
connection.begin();
synchronized (connection) {
connection.wait();
while (!connection.ready) {
connection.wait();
}
}
PrintStream stdout = new PrintStream(connection.streamStdout(), false, connection.encoding.name());
PrintStream stderr = new PrintStream(connection.streamStderr(), true, connection.encoding.name());
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册