Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
xxadev
jenkins
提交
74c2ab46
J
jenkins
项目概览
xxadev
/
jenkins
与 Fork 源项目一致
从无法访问的项目Fork
通知
3
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,发现更多精彩内容 >>
提交
74c2ab46
编写于
9月 09, 2013
作者:
K
Kohsuke Kawaguchi
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
further simplification
上级
73073387
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
72 addition
and
84 deletion
+72
-84
core/src/main/java/hudson/model/Executor.java
core/src/main/java/hudson/model/Executor.java
+72
-84
未找到文件。
core/src/main/java/hudson/model/Executor.java
浏览文件 @
74c2ab46
...
...
@@ -76,7 +76,7 @@ public class Executor extends Thread implements ModelObject {
/**
* Used to track when a job was last executed.
*/
private
long
finishTime
;
private
final
long
creationTime
=
System
.
currentTimeMillis
()
;
/**
* Executor number that identifies it among other executors for the same {@link Computer}.
...
...
@@ -184,109 +184,97 @@ public class Executor extends Thread implements ModelObject {
@Override
public
void
run
()
{
startTime
=
System
.
currentTimeMillis
();
// run as the system user. see ACL.SYSTEM for more discussion about why this is somewhat broken
ACL
.
impersonate
(
ACL
.
SYSTEM
);
try
{
finishTime
=
System
.
currentTimeMillis
();
MAIN:
do
{
executable
=
null
;
workUnit
=
null
;
interruptStatus
=
null
;
causes
.
clear
();
synchronized
(
owner
)
{
if
(
owner
.
getNumExecutors
()<
owner
.
getExecutors
().
size
())
{
// we've got too many executors.
owner
.
removeExecutor
(
this
);
return
;
}
synchronized
(
owner
)
{
if
(
owner
.
getNumExecutors
()<
owner
.
getExecutors
().
size
())
{
// we've got too many executors.
owner
.
removeExecutor
(
this
);
return
;
}
}
// clear the interrupt flag as a precaution.
// sometime an interrupt aborts a build but without clearing the flag.
// see issue #1583
if
(
Thread
.
interrupted
())
break
MAIN
;
if
(
induceDeath
)
throw
new
ThreadDeath
();
SubTask
task
;
try
{
// transition from idle to building.
// perform this state change as an atomic operation wrt other queue operations
synchronized
(
queue
)
{
workUnit
.
setExecutor
(
this
);
queue
.
onStartExecuting
(
this
);
if
(
LOGGER
.
isLoggable
(
FINE
))
LOGGER
.
log
(
FINE
,
getName
()+
" grabbed "
+
workUnit
+
" from queue"
);
task
=
workUnit
.
work
;
startTime
=
System
.
currentTimeMillis
();
executable
=
task
.
createExecutable
();
workUnit
.
setExecutable
(
executable
);
}
// clear the interrupt flag as a precaution.
// sometime an interrupt aborts a build but without clearing the flag.
// see issue #1583
if
(
Thread
.
interrupted
())
return
;
if
(
induceDeath
)
throw
new
ThreadDeath
();
SubTask
task
;
try
{
// transition from idle to building.
// perform this state change as an atomic operation wrt other queue operations
synchronized
(
queue
)
{
workUnit
.
setExecutor
(
this
);
queue
.
onStartExecuting
(
this
);
if
(
LOGGER
.
isLoggable
(
FINE
))
LOGGER
.
log
(
FINE
,
getName
()+
" is going to execute "
+
executable
);
}
catch
(
IOException
e
)
{
LOGGER
.
log
(
Level
.
SEVERE
,
"Executor threw an exception"
,
e
);
break
MAIN
;
}
catch
(
InterruptedException
e
)
{
LOGGER
.
log
(
FINE
,
getName
()+
" interrupted"
,
e
);
break
MAIN
;
LOGGER
.
log
(
FINE
,
getName
()+
" grabbed "
+
workUnit
+
" from queue"
);
task
=
workUnit
.
work
;
executable
=
task
.
createExecutable
();
workUnit
.
setExecutable
(
executable
);
}
if
(
LOGGER
.
isLoggable
(
FINE
))
LOGGER
.
log
(
FINE
,
getName
()+
" is going to execute "
+
executable
);
}
catch
(
IOException
e
)
{
LOGGER
.
log
(
Level
.
SEVERE
,
"Executor threw an exception"
,
e
);
return
;
}
catch
(
InterruptedException
e
)
{
LOGGER
.
log
(
FINE
,
getName
()+
" interrupted"
,
e
);
return
;
}
Throwable
problems
=
null
;
final
String
threadName
=
getName
();
try
{
workUnit
.
context
.
synchronizeStart
();
Throwable
problems
=
null
;
try
{
workUnit
.
context
.
synchronizeStart
();
if
(
executable
instanceof
Actionable
)
{
for
(
Action
action:
workUnit
.
context
.
actions
)
{
((
Actionable
)
executable
).
addAction
(
action
);
}
if
(
executable
instanceof
Actionable
)
{
for
(
Action
action:
workUnit
.
context
.
actions
)
{
((
Actionable
)
executable
).
addAction
(
action
);
}
}
final
SecurityContext
savedContext
=
ACL
.
impersonate
(
workUnit
.
context
.
item
.
authenticate
());
try
{
setName
(
threadName
+
" : executing "
+
executable
.
toString
());
if
(
LOGGER
.
isLoggable
(
FINE
))
LOGGER
.
log
(
FINE
,
getName
()+
" is now executing "
+
executable
);
queue
.
execute
(
executable
,
task
);
}
finally
{
SecurityContextHolder
.
setContext
(
savedContext
);
}
}
catch
(
Throwable
e
)
{
// for some reason the executor died. this is really
// a bug in the code, but we don't want the executor to die,
// so just leave some info and go on to build other things
LOGGER
.
log
(
Level
.
SEVERE
,
"Executor threw an exception"
,
e
);
final
SecurityContext
savedContext
=
ACL
.
impersonate
(
workUnit
.
context
.
item
.
authenticate
());
try
{
setName
(
getName
()
+
" : executing "
+
executable
.
toString
());
if
(
LOGGER
.
isLoggable
(
FINE
))
LOGGER
.
log
(
FINE
,
getName
()+
" is now executing "
+
executable
);
queue
.
execute
(
executable
,
task
);
}
finally
{
SecurityContextHolder
.
setContext
(
savedContext
);
}
}
catch
(
Throwable
e
)
{
// for some reason the executor died. this is really
// a bug in the code, but we don't want the executor to die,
// so just leave some info and go on to build other things
LOGGER
.
log
(
Level
.
SEVERE
,
"Executor threw an exception"
,
e
);
workUnit
.
context
.
abort
(
e
);
problems
=
e
;
}
finally
{
long
time
=
System
.
currentTimeMillis
()-
startTime
;
if
(
LOGGER
.
isLoggable
(
FINE
))
LOGGER
.
log
(
FINE
,
getName
()+
" completed "
+
executable
+
" in "
+
time
+
"ms"
);
try
{
workUnit
.
context
.
synchronizeEnd
(
executable
,
problems
,
time
);
}
catch
(
InterruptedException
e
)
{
workUnit
.
context
.
abort
(
e
);
problems
=
e
;
}
finally
{
setName
(
threadName
);
finishTime
=
System
.
currentTimeMillis
();
if
(
LOGGER
.
isLoggable
(
FINE
))
LOGGER
.
log
(
FINE
,
getName
()+
" completed "
+
executable
+
" in "
+(
finishTime
-
startTime
)+
"ms"
);
try
{
workUnit
.
context
.
synchronizeEnd
(
executable
,
problems
,
finishTime
-
startTime
);
}
catch
(
InterruptedException
e
)
{
workUnit
.
context
.
abort
(
e
);
break
MAIN
;
}
finally
{
workUnit
.
setExecutor
(
null
);
}
workUnit
.
setExecutor
(
null
);
}
}
while
(
false
);
// this pointless do-while allows "break" to come here
// let this thread die and be replaced by a fresh unstarted instance
owner
.
removeExecutor
(
this
);
}
}
catch
(
RuntimeException
e
)
{
causeOfDeath
=
e
;
throw
e
;
}
catch
(
Error
e
)
{
causeOfDeath
=
e
;
throw
e
;
}
finally
{
if
(
causeOfDeath
==
null
)
// let this thread die and be replaced by a fresh unstarted instance
owner
.
removeExecutor
(
this
);
}
}
...
...
@@ -557,7 +545,7 @@ public class Executor extends Thread implements ModelObject {
*/
public
long
getIdleStartMilliseconds
()
{
if
(
isIdle
())
return
Math
.
max
(
finish
Time
,
owner
.
getConnectTime
());
return
Math
.
max
(
creation
Time
,
owner
.
getConnectTime
());
else
{
return
Math
.
max
(
startTime
+
Math
.
max
(
0
,
Executables
.
getEstimatedDurationFor
(
executable
)),
System
.
currentTimeMillis
()
+
15000
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录