Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
LinuxSuRen
jenkins
提交
d6b242f2
J
jenkins
项目概览
LinuxSuRen
/
jenkins
与 Fork 源项目一致
从无法访问的项目Fork
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
J
jenkins
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
d6b242f2
编写于
4月 08, 2014
作者:
K
Kohsuke Kawaguchi
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'nio'
上级
e7e7448d
f9624dcf
变更
10
显示空白变更内容
内联
并排
Showing
10 changed file
with
135 addition
and
20 deletion
+135
-20
changelog.html
changelog.html
+2
-0
core/src/main/java/hudson/Launcher.java
core/src/main/java/hudson/Launcher.java
+1
-1
core/src/main/java/hudson/TcpSlaveAgentListener.java
core/src/main/java/hudson/TcpSlaveAgentListener.java
+7
-4
core/src/main/java/hudson/cli/CliProtocol.java
core/src/main/java/hudson/cli/CliProtocol.java
+33
-4
core/src/main/java/hudson/cli/CliProtocol2.java
core/src/main/java/hudson/cli/CliProtocol2.java
+10
-1
core/src/main/java/hudson/slaves/Channels.java
core/src/main/java/hudson/slaves/Channels.java
+2
-2
core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol.java
.../src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol.java
+26
-6
core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol2.java
...src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol2.java
+10
-1
core/src/main/java/jenkins/slaves/NioChannelSelector.java
core/src/main/java/jenkins/slaves/NioChannelSelector.java
+43
-0
pom.xml
pom.xml
+1
-1
未找到文件。
changelog.html
浏览文件 @
d6b242f2
...
...
@@ -63,6 +63,8 @@ Upcoming changes</a>
<div
id=
"rc"
style=
"display:none;"
>
<!--=BEGIN=-->
<h3><a
name=
v1.559
>
What's new in 1.559
</a>
<!--=DATE=-->
</h3>
<ul
class=
image
>
<li
class=
rfe
>
JNLP slaves are now handled through NIO-based remoting channels for better scalability.
<li
class=
rfe
>
Slaves connected via Java Web Start now restart themselves when a connection to Jenkins is lost.
(
<a
href=
"https://issues.jenkins-ci.org/browse/JENKINS-19055"
>
issue 19055
</a>
)
...
...
core/src/main/java/hudson/Launcher.java
浏览文件 @
d6b242f2
...
...
@@ -818,7 +818,7 @@ public abstract class Launcher {
* Kill the process when the channel is severed.
*/
@Override
p
rotected
synchronized
void
terminate
(
IOException
e
)
{
p
ublic
synchronized
void
terminate
(
IOException
e
)
{
super
.
terminate
(
e
);
ProcessTree
pt
=
ProcessTree
.
get
();
try
{
...
...
core/src/main/java/hudson/TcpSlaveAgentListener.java
浏览文件 @
d6b242f2
...
...
@@ -32,8 +32,10 @@ import java.io.IOException;
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 @@ import java.util.logging.Logger;
*/
public
final
class
TcpSlaveAgentListener
extends
Thread
{
private
final
ServerSocket
serverSocket
;
private
final
ServerSocket
Channel
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 final class TcpSlaveAgentListener extends Thread {
* 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 final class TcpSlaveAgentListener extends Thread {
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
...
...
core/src/main/java/hudson/cli/CliProtocol.java
浏览文件 @
d6b242f2
...
...
@@ -4,9 +4,13 @@ import hudson.Extension;
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 @@ import java.net.Socket;
*/
@Extension
public
class
CliProtocol
extends
AgentProtocol
{
@Inject
NioChannelSelector
nio
;
@Override
public
String
getName
()
{
return
"CLI-connect"
;
...
...
@@ -30,13 +37,23 @@ public class CliProtocol extends AgentProtocol {
@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 class CliProtocol extends AgentProtocol {
}
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
();
}
...
...
core/src/main/java/hudson/cli/CliProtocol2.java
浏览文件 @
d6b242f2
...
...
@@ -2,6 +2,7 @@ package hudson.cli;
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 class CliProtocol2 extends CliProtocol {
@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
{
...
...
core/src/main/java/hudson/slaves/Channels.java
浏览文件 @
d6b242f2
...
...
@@ -73,7 +73,7 @@ public class Channels {
* Kill the process when the channel is severed.
*/
@Override
p
rotected
synchronized
void
terminate
(
IOException
e
)
{
p
ublic
synchronized
void
terminate
(
IOException
e
)
{
super
.
terminate
(
e
);
try
{
proc
.
kill
();
...
...
@@ -109,7 +109,7 @@ public class Channels {
* Kill the process when the channel is severed.
*/
@Override
p
rotected
synchronized
void
terminate
(
IOException
e
)
{
p
ublic
synchronized
void
terminate
(
IOException
e
)
{
super
.
terminate
(
e
);
proc
.
destroy
();
// the stderr copier should exit by itself
...
...
core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol.java
浏览文件 @
d6b242f2
...
...
@@ -2,18 +2,18 @@ package jenkins.slaves;
import
hudson.AbortException
;
import
hudson.Extension
;
import
hudson.model.Computer
;
import
hudson.remoting.Channel
;
import
hudson.remoting.Channel.Listener
;
import
hudson.remoting.ChannelBuilder
;
import
hudson.remoting.Engine
;
import
hudson.remoting.SocketInputStream
;
import
hudson.remoting.SocketOutputStream
;
import
hudson.slaves.SlaveComputer
;
import
jenkins.AgentProtocol
;
import
jenkins.model.Jenkins
;
import
jenkins.security.HMACConfidentialKey
;
import
org.jenkinsci.remoting.nio.NioChannelHub
;
import
java.io.BufferedInputStream
;
import
java.io.BufferedOutputStream
;
import
javax.inject.Inject
;
import
java.io.BufferedWriter
;
import
java.io.DataInputStream
;
import
java.io.DataOutputStream
;
...
...
@@ -55,6 +55,9 @@ import java.util.logging.Logger;
*/
@Extension
public
class
JnlpSlaveAgentProtocol
extends
AgentProtocol
{
@Inject
NioChannelSelector
hub
;
@Override
public
String
getName
()
{
return
"JNLP-connect"
;
...
...
@@ -62,10 +65,11 @@ public class JnlpSlaveAgentProtocol extends AgentProtocol {
@Override
public
void
handle
(
Socket
socket
)
throws
IOException
,
InterruptedException
{
new
Handler
(
socket
).
run
();
new
Handler
(
hub
.
getHub
(),
socket
).
run
();
}
protected
static
class
Handler
{
protected
final
NioChannelHub
hub
;
protected
final
Socket
socket
;
/**
...
...
@@ -82,7 +86,16 @@ public class JnlpSlaveAgentProtocol extends AgentProtocol {
*/
protected
final
PrintWriter
out
;
/**
* @deprecated as of 1.559
* Use {@link #Handler(NioChannelHub, Socket)}
*/
public
Handler
(
Socket
socket
)
throws
IOException
{
this
(
null
,
socket
);
}
public
Handler
(
NioChannelHub
hub
,
Socket
socket
)
throws
IOException
{
this
.
hub
=
hub
;
this
.
socket
=
socket
;
in
=
new
DataInputStream
(
socket
.
getInputStream
());
out
=
new
PrintWriter
(
new
BufferedWriter
(
new
OutputStreamWriter
(
socket
.
getOutputStream
(),
"UTF-8"
)),
true
);
...
...
@@ -121,7 +134,14 @@ public class JnlpSlaveAgentProtocol extends AgentProtocol {
logw
.
println
(
"JNLP agent connected from "
+
socket
.
getInetAddress
());
try
{
computer
.
setChannel
(
new
BufferedInputStream
(
new
SocketInputStream
(
socket
)),
new
BufferedOutputStream
(
new
SocketOutputStream
(
socket
)),
log
,
ChannelBuilder
cb
;
if
(
hub
==
null
)
cb
=
new
ChannelBuilder
(
nodeName
,
Computer
.
threadPoolForRemoting
);
else
cb
=
hub
.
newChannelBuilder
(
nodeName
,
Computer
.
threadPoolForRemoting
);
computer
.
setChannel
(
cb
.
withHeaderStream
(
log
).
build
(
socket
),
log
,
new
Listener
()
{
@Override
public
void
onClosed
(
Channel
channel
,
IOException
cause
)
{
...
...
core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol2.java
浏览文件 @
d6b242f2
...
...
@@ -7,6 +7,7 @@ import hudson.remoting.Channel;
import
hudson.remoting.Engine
;
import
hudson.slaves.SlaveComputer
;
import
jenkins.model.Jenkins
;
import
org.jenkinsci.remoting.nio.NioChannelHub
;
import
java.io.ByteArrayInputStream
;
import
java.io.IOException
;
...
...
@@ -40,14 +41,22 @@ public class JnlpSlaveAgentProtocol2 extends JnlpSlaveAgentProtocol {
@Override
public
void
handle
(
Socket
socket
)
throws
IOException
,
InterruptedException
{
new
Handler2
(
socket
).
run
();
new
Handler2
(
hub
.
getHub
(),
socket
).
run
();
}
protected
static
class
Handler2
extends
Handler
{
/**
* @deprecated as of 1.559
* Use {@link #Handler2(NioChannelHub, Socket)}
*/
public
Handler2
(
Socket
socket
)
throws
IOException
{
super
(
socket
);
}
public
Handler2
(
NioChannelHub
hub
,
Socket
socket
)
throws
IOException
{
super
(
hub
,
socket
);
}
/**
* Handles JNLP slave agent connection request (v2 protocol)
*/
...
...
core/src/main/java/jenkins/slaves/NioChannelSelector.java
0 → 100644
浏览文件 @
d6b242f2
package
jenkins.slaves
;
import
hudson.Extension
;
import
hudson.model.Computer
;
import
org.jenkinsci.remoting.nio.NioChannelHub
;
import
java.io.IOException
;
import
java.util.logging.Level
;
import
java.util.logging.Logger
;
/**
* Singleton holder of {@link NioChannelHub}
*
* @author Kohsuke Kawaguchi
*/
@Extension
public
class
NioChannelSelector
{
private
NioChannelHub
hub
;
public
NioChannelSelector
()
{
try
{
if
(!
DISABLED
)
{
this
.
hub
=
new
NioChannelHub
(
Computer
.
threadPoolForRemoting
);
Computer
.
threadPoolForRemoting
.
submit
(
hub
);
}
}
catch
(
IOException
e
)
{
LOGGER
.
log
(
Level
.
SEVERE
,
"Failed to launch NIO hub"
,
e
);
this
.
hub
=
null
;
DISABLED
=
true
;
}
}
public
NioChannelHub
getHub
()
{
return
hub
;
}
/**
* Escape hatch to disable use of NIO.
*/
public
static
boolean
DISABLED
=
Boolean
.
getBoolean
(
NioChannelSelector
.
class
.
getName
()+
".disabled"
);
private
static
final
Logger
LOGGER
=
Logger
.
getLogger
(
NioChannelSelector
.
class
.
getName
());
}
pom.xml
浏览文件 @
d6b242f2
...
...
@@ -172,7 +172,7 @@ THE SOFTWARE.
<dependency>
<groupId>
org.jenkins-ci.main
</groupId>
<artifactId>
remoting
</artifactId>
<version>
2.3
7
</version>
<version>
2.3
8
</version>
</dependency>
<dependency>
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录