diff --git a/changelog.html b/changelog.html index 850a487c6e3a..e02f7fff9b0b 100644 --- a/changelog.html +++ b/changelog.html @@ -55,7 +55,14 @@
diff --git a/cli/src/main/java/hudson/cli/CLI.java b/cli/src/main/java/hudson/cli/CLI.java index f24549f8c5f0..bf75736560e5 100644 --- a/cli/src/main/java/hudson/cli/CLI.java +++ b/cli/src/main/java/hudson/cli/CLI.java @@ -29,7 +29,7 @@ import hudson.remoting.Pipe; import hudson.remoting.RemoteInputStream; import hudson.remoting.RemoteOutputStream; -import hudson.remoting.SocketInputStream; +import hudson.remoting.SocketChannelStream; import hudson.remoting.SocketOutputStream; import javax.crypto.SecretKey; @@ -201,7 +201,7 @@ public void close() throws IOException { } else { s = new Socket(); s.connect(clip.endpoint,3000); - out = new SocketOutputStream(s); + out = SocketChannelStream.out(s); } closables.add(new Closeable() { @@ -210,7 +210,7 @@ public void close() throws IOException { } }); - Connection c = new Connection(new SocketInputStream(s),out); + Connection c = new Connection(SocketChannelStream.in(s),out); switch (clip.version) { case 1: diff --git a/cli/src/main/java/hudson/cli/Connection.java b/cli/src/main/java/hudson/cli/Connection.java index 8f35276cb7af..165a6deb7e6a 100644 --- a/cli/src/main/java/hudson/cli/Connection.java +++ b/cli/src/main/java/hudson/cli/Connection.java @@ -23,8 +23,7 @@ */ package hudson.cli; -import hudson.remoting.SocketInputStream; -import hudson.remoting.SocketOutputStream; +import hudson.remoting.SocketChannelStream; import org.apache.commons.codec.binary.Base64; import javax.crypto.Cipher; @@ -63,7 +62,7 @@ public class Connection { public final DataOutputStream dout; public Connection(Socket socket) throws IOException { - this(new SocketInputStream(socket),new SocketOutputStream(socket)); + this(SocketChannelStream.in(socket),SocketChannelStream.out(socket)); } public Connection(InputStream in, OutputStream out) { diff --git a/core/src/main/java/hudson/Launcher.java b/core/src/main/java/hudson/Launcher.java index 6822a5c8ca71..39d1a56b1371 100644 --- a/core/src/main/java/hudson/Launcher.java +++ b/core/src/main/java/hudson/Launcher.java @@ -818,7 +818,7 @@ public Channel launchChannel(OutputStream out, ProcessBuilder pb) throws IOExcep * Kill the process when the channel is severed. */ @Override - protected synchronized void terminate(IOException e) { + public synchronized void terminate(IOException e) { super.terminate(e); ProcessTree pt = ProcessTree.get(); try { diff --git a/core/src/main/java/hudson/TcpSlaveAgentListener.java b/core/src/main/java/hudson/TcpSlaveAgentListener.java index 2c5f4f916c62..b93a9f115b90 100644 --- a/core/src/main/java/hudson/TcpSlaveAgentListener.java +++ b/core/src/main/java/hudson/TcpSlaveAgentListener.java @@ -32,8 +32,10 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.BindException; +import java.net.InetSocketAddress; import java.net.ServerSocket; import java.net.Socket; +import java.nio.channels.ServerSocketChannel; import java.util.logging.Level; import java.util.logging.Logger; @@ -55,7 +57,7 @@ */ public final class TcpSlaveAgentListener extends Thread { - private final ServerSocket serverSocket; + private final ServerSocketChannel serverSocket; private volatile boolean shuttingDown; public final int configuredPort; @@ -67,7 +69,8 @@ public final class TcpSlaveAgentListener extends Thread { public TcpSlaveAgentListener(int port) throws IOException { super("TCP slave agent listener port="+port); try { - serverSocket = new ServerSocket(port); + serverSocket = ServerSocketChannel.open(); + serverSocket.socket().bind(new InetSocketAddress(port)); } catch (BindException e) { throw (BindException)new BindException("Failed to listen on port "+port+" because it's already in use.").initCause(e); } @@ -82,7 +85,7 @@ public TcpSlaveAgentListener(int port) throws IOException { * Gets the TCP port number in which we are listening. */ public int getPort() { - return serverSocket.getLocalPort(); + return serverSocket.socket().getLocalPort(); } @Override @@ -90,7 +93,7 @@ public void run() { try { // the loop eventually terminates when the socket is closed. while (true) { - Socket s = serverSocket.accept(); + Socket s = serverSocket.accept().socket(); // this prevents a connection from silently terminated by the router in between or the other peer // and that goes without unnoticed. However, the time out is often very long (for example 2 hours diff --git a/core/src/main/java/hudson/cli/CliProtocol.java b/core/src/main/java/hudson/cli/CliProtocol.java index b3b725fe33ff..1d4f25627e07 100644 --- a/core/src/main/java/hudson/cli/CliProtocol.java +++ b/core/src/main/java/hudson/cli/CliProtocol.java @@ -4,9 +4,13 @@ import hudson.model.Computer; import hudson.remoting.Channel; import hudson.remoting.Channel.Mode; +import hudson.remoting.ChannelBuilder; import jenkins.AgentProtocol; import jenkins.model.Jenkins; +import jenkins.slaves.NioChannelSelector; +import org.jenkinsci.remoting.nio.NioChannelHub; +import javax.inject.Inject; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.BufferedWriter; @@ -23,6 +27,9 @@ */ @Extension public class CliProtocol extends AgentProtocol { + @Inject + NioChannelSelector nio; + @Override public String getName() { return "CLI-connect"; @@ -30,13 +37,23 @@ public String getName() { @Override public void handle(Socket socket) throws IOException, InterruptedException { - new Handler(socket).run(); + new Handler(nio.getHub(),socket).run(); } protected static class Handler { + protected final NioChannelHub hub; protected final Socket socket; + /** + * @deprecated as of 1.559 + * Use {@link #Handler(NioChannelHub, Socket)} + */ public Handler(Socket socket) { + this(null,socket); + } + + public Handler(NioChannelHub hub, Socket socket) { + this.hub = hub; this.socket = socket; } @@ -47,9 +64,21 @@ public void run() throws IOException, InterruptedException { } protected void runCli(Connection c) throws IOException, InterruptedException { - Channel channel = new Channel("CLI channel from " + socket.getInetAddress(), - Computer.threadPoolForRemoting, Mode.BINARY, - new BufferedInputStream(c.in), new BufferedOutputStream(c.out), null, true, Jenkins.getInstance().pluginManager.uberClassLoader); + ChannelBuilder cb; + String name = "CLI channel from " + socket.getInetAddress(); + + // Connection can contain cipher wrapper, which can't be NIO-ed. +// if (hub!=null) +// cb = hub.newChannelBuilder(name, Computer.threadPoolForRemoting); +// else + cb = new ChannelBuilder(name, Computer.threadPoolForRemoting); + + Channel channel = cb + .withMode(Mode.BINARY) + .withRestricted(true) + .withBaseLoader(Jenkins.getInstance().pluginManager.uberClassLoader) + .build(new BufferedInputStream(c.in), new BufferedOutputStream(c.out)); + channel.setProperty(CliEntryPoint.class.getName(),new CliManagerImpl(channel)); channel.join(); } diff --git a/core/src/main/java/hudson/cli/CliProtocol2.java b/core/src/main/java/hudson/cli/CliProtocol2.java index bd3af1ee6497..644914a089bd 100644 --- a/core/src/main/java/hudson/cli/CliProtocol2.java +++ b/core/src/main/java/hudson/cli/CliProtocol2.java @@ -2,6 +2,7 @@ import hudson.Extension; import jenkins.model.Jenkins; +import org.jenkinsci.remoting.nio.NioChannelHub; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; @@ -28,14 +29,22 @@ public String getName() { @Override public void handle(Socket socket) throws IOException, InterruptedException { - new Handler2(socket).run(); + new Handler2(nio.getHub(), socket).run(); } protected static class Handler2 extends Handler { + /** + * @deprecated as of 1.559 + * Use {@link #Handler2(NioChannelHub, Socket)} + */ public Handler2(Socket socket) { super(socket); } + public Handler2(NioChannelHub hub, Socket socket) { + super(hub, socket); + } + @Override public void run() throws IOException, InterruptedException { try { diff --git a/core/src/main/java/hudson/model/AbstractBuild.java b/core/src/main/java/hudson/model/AbstractBuild.java index 963bd0736289..164bd285e9c7 100644 --- a/core/src/main/java/hudson/model/AbstractBuild.java +++ b/core/src/main/java/hudson/model/AbstractBuild.java @@ -71,7 +71,6 @@ import java.io.InterruptedIOException; import java.io.StringWriter; import java.lang.ref.WeakReference; -import java.text.MessageFormat; import java.util.AbstractSet; import java.util.ArrayList; import java.util.Calendar; @@ -156,7 +155,11 @@ public abstract class AbstractBuild,R extends Abs
*/
protected transient List runMixIn;
+ private transient final LazyBuildMixIn.RunMixIn runMixIn = new LazyBuildMixIn.RunMixIn () {
+ @Override protected R asRun() {
+ return _this();
+ }
+ };
protected AbstractBuild(P job) throws IOException {
super(job);
@@ -174,14 +177,7 @@ public final P getProject() {
return getParent();
}
- @Override public final synchronized LazyBuildMixIn.RunMixIn getRunMixIn() {
- if (runMixIn == null) {
- runMixIn = new LazyBuildMixIn.RunMixIn () {
- @Override protected R asRun() {
- return _this();
- }
- };
- }
+ @Override public final LazyBuildMixIn.RunMixIn getRunMixIn() {
return runMixIn;
}
diff --git a/core/src/main/java/hudson/model/ItemGroupMixIn.java b/core/src/main/java/hudson/model/ItemGroupMixIn.java
index 311afa572da8..131738ed18f9 100644
--- a/core/src/main/java/hudson/model/ItemGroupMixIn.java
+++ b/core/src/main/java/hudson/model/ItemGroupMixIn.java
@@ -108,6 +108,7 @@ public boolean accept(File child) {
item = (V) Items.load( parent, subdir );
}else{
Logger.getLogger( ItemGroupMixIn.class.getName() ).log( Level.WARNING, "could not find file " + xmlFile.getFile());
+ continue;
}
} else {
item.onLoad(parent, subdir.getName());
diff --git a/core/src/main/java/hudson/model/ReconfigurableDescribable.java b/core/src/main/java/hudson/model/ReconfigurableDescribable.java
index 7738089b1d8b..e9dd8c2f6c01 100644
--- a/core/src/main/java/hudson/model/ReconfigurableDescribable.java
+++ b/core/src/main/java/hudson/model/ReconfigurableDescribable.java
@@ -25,6 +25,8 @@
import hudson.model.Descriptor.FormException;
import hudson.slaves.NodeProperty;
+import javax.annotation.CheckForNull;
+import javax.annotation.Nonnull;
import net.sf.json.JSONObject;
import org.kohsuke.stapler.StaplerRequest;
@@ -77,5 +79,5 @@ public interface ReconfigurableDescribable