Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell8_hotspot
提交
715631ea
D
dragonwell8_hotspot
项目概览
openanolis
/
dragonwell8_hotspot
通知
2
Star
2
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
dragonwell8_hotspot
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
715631ea
编写于
7月 15, 2013
作者:
F
fparain
浏览文件
操作
浏览文件
下载
差异文件
Merge
上级
7b9bb74a
6ca53ef7
变更
13
隐藏空白更改
内联
并排
Showing
13 changed file
with
293 addition
and
5 deletion
+293
-5
src/os/bsd/vm/attachListener_bsd.cpp
src/os/bsd/vm/attachListener_bsd.cpp
+25
-1
src/os/linux/vm/attachListener_linux.cpp
src/os/linux/vm/attachListener_linux.cpp
+25
-1
src/os/solaris/vm/attachListener_solaris.cpp
src/os/solaris/vm/attachListener_solaris.cpp
+25
-1
src/os/windows/vm/attachListener_windows.cpp
src/os/windows/vm/attachListener_windows.cpp
+5
-1
src/share/vm/memory/resourceArea.hpp
src/share/vm/memory/resourceArea.hpp
+26
-1
src/share/vm/runtime/thread.cpp
src/share/vm/runtime/thread.cpp
+2
-0
src/share/vm/runtime/thread.hpp
src/share/vm/runtime/thread.hpp
+6
-0
src/share/vm/services/attachListener.hpp
src/share/vm/services/attachListener.hpp
+1
-0
src/share/vm/services/memTracker.cpp
src/share/vm/services/memTracker.cpp
+6
-0
src/share/vm/utilities/ostream.cpp
src/share/vm/utilities/ostream.cpp
+3
-0
src/share/vm/utilities/ostream.hpp
src/share/vm/utilities/ostream.hpp
+3
-0
test/serviceability/attach/AttachWithStalePidFile.java
test/serviceability/attach/AttachWithStalePidFile.java
+139
-0
test/serviceability/attach/AttachWithStalePidFileTarget.java
test/serviceability/attach/AttachWithStalePidFileTarget.java
+27
-0
未找到文件。
src/os/bsd/vm/attachListener_bsd.cpp
浏览文件 @
715631ea
/*
* Copyright (c) 2005, 201
2
, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2005, 201
3
, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
...
...
@@ -437,6 +437,30 @@ AttachOperation* AttachListener::dequeue() {
return
op
;
}
// Performs initialization at vm startup
// For BSD we remove any stale .java_pid file which could cause
// an attaching process to think we are ready to receive on the
// domain socket before we are properly initialized
void
AttachListener
::
vm_start
()
{
char
fn
[
UNIX_PATH_MAX
];
struct
stat64
st
;
int
ret
;
int
n
=
snprintf
(
fn
,
UNIX_PATH_MAX
,
"%s/.java_pid%d"
,
os
::
get_temp_directory
(),
os
::
current_process_id
());
assert
(
n
<
(
int
)
UNIX_PATH_MAX
,
"java_pid file name buffer overflow"
);
RESTARTABLE
(
::
stat64
(
fn
,
&
st
),
ret
);
if
(
ret
==
0
)
{
ret
=
::
unlink
(
fn
);
if
(
ret
==
-
1
)
{
debug_only
(
warning
(
"failed to remove stale attach pid file at %s"
,
fn
));
}
}
}
int
AttachListener
::
pd_init
()
{
JavaThread
*
thread
=
JavaThread
::
current
();
ThreadBlockInVM
tbivm
(
thread
);
...
...
src/os/linux/vm/attachListener_linux.cpp
浏览文件 @
715631ea
/*
* Copyright (c) 2005, 201
0
, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2005, 201
3
, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
...
...
@@ -432,6 +432,30 @@ AttachOperation* AttachListener::dequeue() {
return
op
;
}
// Performs initialization at vm startup
// For Linux we remove any stale .java_pid file which could cause
// an attaching process to think we are ready to receive on the
// domain socket before we are properly initialized
void
AttachListener
::
vm_start
()
{
char
fn
[
UNIX_PATH_MAX
];
struct
stat64
st
;
int
ret
;
int
n
=
snprintf
(
fn
,
UNIX_PATH_MAX
,
"%s/.java_pid%d"
,
os
::
get_temp_directory
(),
os
::
current_process_id
());
assert
(
n
<
(
int
)
UNIX_PATH_MAX
,
"java_pid file name buffer overflow"
);
RESTARTABLE
(
::
stat64
(
fn
,
&
st
),
ret
);
if
(
ret
==
0
)
{
ret
=
::
unlink
(
fn
);
if
(
ret
==
-
1
)
{
debug_only
(
warning
(
"failed to remove stale attach pid file at %s"
,
fn
));
}
}
}
int
AttachListener
::
pd_init
()
{
JavaThread
*
thread
=
JavaThread
::
current
();
ThreadBlockInVM
tbivm
(
thread
);
...
...
src/os/solaris/vm/attachListener_solaris.cpp
浏览文件 @
715631ea
/*
* Copyright (c) 2005, 201
2
, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2005, 201
3
, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
...
...
@@ -576,6 +576,30 @@ AttachOperation* AttachListener::dequeue() {
return
op
;
}
// Performs initialization at vm startup
// For Solaris we remove any stale .java_pid file which could cause
// an attaching process to think we are ready to receive a door_call
// before we are properly initialized
void
AttachListener
::
vm_start
()
{
char
fn
[
PATH_MAX
+
1
];
struct
stat64
st
;
int
ret
;
int
n
=
snprintf
(
fn
,
sizeof
(
fn
),
"%s/.java_pid%d"
,
os
::
get_temp_directory
(),
os
::
current_process_id
());
assert
(
n
<
sizeof
(
fn
),
"java_pid file name buffer overflow"
);
RESTARTABLE
(
::
stat64
(
fn
,
&
st
),
ret
);
if
(
ret
==
0
)
{
ret
=
::
unlink
(
fn
);
if
(
ret
==
-
1
)
{
debug_only
(
warning
(
"failed to remove stale attach pid file at %s"
,
fn
));
}
}
}
int
AttachListener
::
pd_init
()
{
JavaThread
*
thread
=
JavaThread
::
current
();
ThreadBlockInVM
tbivm
(
thread
);
...
...
src/os/windows/vm/attachListener_windows.cpp
浏览文件 @
715631ea
/*
* Copyright (c) 2005, 201
0
, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2005, 201
3
, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
...
...
@@ -358,6 +358,10 @@ AttachOperation* AttachListener::dequeue() {
return
op
;
}
void
AttachListener
::
vm_start
()
{
// nothing to do
}
int
AttachListener
::
pd_init
()
{
return
Win32AttachListener
::
init
();
}
...
...
src/share/vm/memory/resourceArea.hpp
浏览文件 @
715631ea
/*
* Copyright (c) 1997, 201
2
, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1997, 201
3
, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
...
...
@@ -83,6 +83,10 @@ protected:
Chunk
*
_chunk
;
// saved arena chunk
char
*
_hwm
,
*
_max
;
size_t
_size_in_bytes
;
#ifdef ASSERT
Thread
*
_thread
;
ResourceMark
*
_previous_resource_mark
;
#endif //ASSERT
void
initialize
(
Thread
*
thread
)
{
_area
=
thread
->
resource_area
();
...
...
@@ -92,6 +96,11 @@ protected:
_size_in_bytes
=
_area
->
size_in_bytes
();
debug_only
(
_area
->
_nesting
++
;)
assert
(
_area
->
_nesting
>
0
,
"must stack allocate RMs"
);
#ifdef ASSERT
_thread
=
thread
;
_previous_resource_mark
=
thread
->
current_resource_mark
();
thread
->
set_current_resource_mark
(
this
);
#endif // ASSERT
}
public:
...
...
@@ -111,6 +120,17 @@ protected:
_size_in_bytes
=
r
->
_size_in_bytes
;
debug_only
(
_area
->
_nesting
++
;)
assert
(
_area
->
_nesting
>
0
,
"must stack allocate RMs"
);
#ifdef ASSERT
Thread
*
thread
=
ThreadLocalStorage
::
thread
();
if
(
thread
!=
NULL
)
{
_thread
=
thread
;
_previous_resource_mark
=
thread
->
current_resource_mark
();
thread
->
set_current_resource_mark
(
this
);
}
else
{
_thread
=
NULL
;
_previous_resource_mark
=
NULL
;
}
#endif // ASSERT
}
void
reset_to_mark
()
{
...
...
@@ -137,6 +157,11 @@ protected:
assert
(
_area
->
_nesting
>
0
,
"must stack allocate RMs"
);
debug_only
(
_area
->
_nesting
--
;)
reset_to_mark
();
#ifdef ASSERT
if
(
_thread
!=
NULL
)
{
_thread
->
set_current_resource_mark
(
_previous_resource_mark
);
}
#endif // ASSERT
}
...
...
src/share/vm/runtime/thread.cpp
浏览文件 @
715631ea
...
...
@@ -218,6 +218,7 @@ Thread::Thread() {
// allocated data structures
set_osthread
(
NULL
);
set_resource_area
(
new
(
mtThread
)
ResourceArea
());
DEBUG_ONLY
(
_current_resource_mark
=
NULL
;)
set_handle_area
(
new
(
mtThread
)
HandleArea
(
NULL
));
set_metadata_handles
(
new
(
ResourceObj
::
C_HEAP
,
mtClass
)
GrowableArray
<
Metadata
*>
(
30
,
true
));
set_active_handles
(
NULL
);
...
...
@@ -3636,6 +3637,7 @@ jint Threads::create_vm(JavaVMInitArgs* args, bool* canTryAgain) {
// Start Attach Listener if +StartAttachListener or it can't be started lazily
if
(
!
DisableAttachMechanism
)
{
AttachListener
::
vm_start
();
if
(
StartAttachListener
||
AttachListener
::
init_at_startup
())
{
AttachListener
::
init
();
}
...
...
src/share/vm/runtime/thread.hpp
浏览文件 @
715631ea
...
...
@@ -86,6 +86,8 @@ class GCTaskQueue;
class
ThreadClosure
;
class
IdealGraphPrinter
;
DEBUG_ONLY
(
class
ResourceMark
;)
class
WorkerThread
;
// Class hierarchy
...
...
@@ -531,6 +533,8 @@ public:
// Thread local resource area for temporary allocation within the VM
ResourceArea
*
_resource_area
;
DEBUG_ONLY
(
ResourceMark
*
_current_resource_mark
;)
// Thread local handle area for allocation of handles within the VM
HandleArea
*
_handle_area
;
GrowableArray
<
Metadata
*>*
_metadata_handles
;
...
...
@@ -585,6 +589,8 @@ public:
// Deadlock detection
bool
allow_allocation
()
{
return
_allow_allocation_count
==
0
;
}
ResourceMark
*
current_resource_mark
()
{
return
_current_resource_mark
;
}
void
set_current_resource_mark
(
ResourceMark
*
rm
)
{
_current_resource_mark
=
rm
;
}
#endif
void
check_for_valid_safepoint_state
(
bool
potential_vm_operation
)
PRODUCT_RETURN
;
...
...
src/share/vm/services/attachListener.hpp
浏览文件 @
715631ea
...
...
@@ -50,6 +50,7 @@ struct AttachOperationFunctionInfo {
class
AttachListener
:
AllStatic
{
public:
static
void
vm_start
()
NOT_SERVICES_RETURN
;
static
void
init
()
NOT_SERVICES_RETURN
;
static
void
abort
()
NOT_SERVICES_RETURN
;
...
...
src/share/vm/services/memTracker.cpp
浏览文件 @
715631ea
...
...
@@ -385,6 +385,7 @@ void MemTracker::enqueue_pending_recorder(MemRecorder* rec) {
#define SAFE_SEQUENCE_THRESHOLD 30
#define HIGH_GENERATION_THRESHOLD 60
#define MAX_RECORDER_THREAD_RATIO 30
#define MAX_RECORDER_PER_THREAD 100
void
MemTracker
::
sync
()
{
assert
(
_tracking_level
>
NMT_off
,
"NMT is not enabled"
);
...
...
@@ -437,6 +438,11 @@ void MemTracker::sync() {
// means that worker thread is lagging behind in processing them.
if
(
!
AutoShutdownNMT
)
{
_slowdown_calling_thread
=
(
MemRecorder
::
_instance_count
>
MAX_RECORDER_THREAD_RATIO
*
_thread_count
);
}
else
{
// If auto shutdown is on, enforce MAX_RECORDER_PER_THREAD threshold to prevent OOM
if
(
MemRecorder
::
_instance_count
>=
_thread_count
*
MAX_RECORDER_PER_THREAD
)
{
shutdown
(
NMT_out_of_memory
);
}
}
// check _worker_thread with lock to avoid racing condition
...
...
src/share/vm/utilities/ostream.cpp
浏览文件 @
715631ea
...
...
@@ -296,6 +296,7 @@ stringStream::stringStream(size_t initial_size) : outputStream() {
buffer
=
NEW_RESOURCE_ARRAY
(
char
,
buffer_length
);
buffer_pos
=
0
;
buffer_fixed
=
false
;
DEBUG_ONLY
(
rm
=
Thread
::
current
()
->
current_resource_mark
();)
}
// useful for output to fixed chunks of memory, such as performance counters
...
...
@@ -321,6 +322,8 @@ void stringStream::write(const char* s, size_t len) {
end
=
buffer_length
*
2
;
}
char
*
oldbuf
=
buffer
;
assert
(
rm
==
NULL
||
Thread
::
current
()
->
current_resource_mark
()
==
rm
,
"stringStream is re-allocated with a different ResourceMark"
);
buffer
=
NEW_RESOURCE_ARRAY
(
char
,
end
);
strncpy
(
buffer
,
oldbuf
,
buffer_pos
);
buffer_length
=
end
;
...
...
src/share/vm/utilities/ostream.hpp
浏览文件 @
715631ea
...
...
@@ -28,6 +28,8 @@
#include "memory/allocation.hpp"
#include "runtime/timer.hpp"
DEBUG_ONLY
(
class
ResourceMark
;)
// Output streams for printing
//
// Printing guidelines:
...
...
@@ -177,6 +179,7 @@ class stringStream : public outputStream {
size_t
buffer_pos
;
size_t
buffer_length
;
bool
buffer_fixed
;
DEBUG_ONLY
(
ResourceMark
*
rm
;)
public:
stringStream
(
size_t
initial_bufsize
=
256
);
stringStream
(
char
*
fixed_buffer
,
size_t
fixed_buffer_size
);
...
...
test/serviceability/attach/AttachWithStalePidFile.java
0 → 100644
浏览文件 @
715631ea
/*
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* @test
* @bug 7162400
* @key regression
* @summary Regression test for attach issue where stale pid files in /tmp lead to connection issues
* @library /testlibrary
* @compile AttachWithStalePidFileTarget.java
* @run main AttachWithStalePidFile
*/
import
com.oracle.java.testlibrary.*
;
import
com.sun.tools.attach.VirtualMachine
;
import
sun.tools.attach.HotSpotVirtualMachine
;
import
java.lang.reflect.Field
;
import
java.nio.file.*
;
import
java.nio.file.attribute.*
;
import
java.io.*
;
public
class
AttachWithStalePidFile
{
public
static
void
main
(
String
...
args
)
throws
Exception
{
// this test is only valid on non-Windows platforms
if
(
Platform
.
isWindows
())
{
System
.
out
.
println
(
"This test is only valid on non-Windows platforms."
);
return
;
}
// Since there might be stale pid-files owned by different
// users on the system we may need to retry the test in case we
// are unable to remove the existing file.
int
retries
=
5
;
while
(!
runTest
()
&&
--
retries
>
0
);
if
(
retries
==
0
)
{
throw
new
RuntimeException
(
"Test failed after 5 retries. "
+
"Remove any /tmp/.java_pid* files and retry."
);
}
}
public
static
boolean
runTest
()
throws
Exception
{
ProcessBuilder
pb
=
ProcessTools
.
createJavaProcessBuilder
(
"-XX:+UnlockDiagnosticVMOptions"
,
"-XX:+PauseAtStartup"
,
"AttachWithStalePidFileTarget"
);
Process
target
=
pb
.
start
();
Path
pidFile
=
null
;
try
{
int
pid
=
getUnixProcessId
(
target
);
// create the stale .java_pid file. use hard-coded /tmp path as in th VM
pidFile
=
createJavaPidFile
(
pid
);
if
(
pidFile
==
null
)
{
return
false
;
}
// wait for vm.paused file to be created and delete it once we find it.
waitForAndResumeVM
(
pid
);
// unfortunately there's no reliable way to know the VM is ready to receive the
// attach request so we have to do an arbitrary sleep.
Thread
.
sleep
(
5000
);
HotSpotVirtualMachine
vm
=
(
HotSpotVirtualMachine
)
VirtualMachine
.
attach
(((
Integer
)
pid
).
toString
());
BufferedReader
remoteDataReader
=
new
BufferedReader
(
new
InputStreamReader
(
vm
.
remoteDataDump
()));
String
line
=
null
;
while
((
line
=
remoteDataReader
.
readLine
())
!=
null
);
vm
.
detach
();
return
true
;
}
finally
{
target
.
destroy
();
target
.
waitFor
();
if
(
pidFile
!=
null
&&
Files
.
exists
(
pidFile
))
{
Files
.
delete
(
pidFile
);
}
}
}
private
static
Path
createJavaPidFile
(
int
pid
)
throws
Exception
{
Path
pidFile
=
Paths
.
get
(
"/tmp/.java_pid"
+
pid
);
if
(
Files
.
exists
(
pidFile
))
{
try
{
Files
.
delete
(
pidFile
);
}
catch
(
FileSystemException
e
)
{
if
(
e
.
getReason
().
equals
(
"Operation not permitted"
))
{
System
.
out
.
println
(
"Unable to remove exisiting stale PID file"
+
pidFile
);
return
null
;
}
throw
e
;
}
}
return
Files
.
createFile
(
pidFile
,
PosixFilePermissions
.
asFileAttribute
(
PosixFilePermissions
.
fromString
(
"rw-------"
)));
}
private
static
void
waitForAndResumeVM
(
int
pid
)
throws
Exception
{
Path
pauseFile
=
Paths
.
get
(
"vm.paused."
+
pid
);
int
retries
=
60
;
while
(!
Files
.
exists
(
pauseFile
)
&&
--
retries
>
0
)
{
Thread
.
sleep
(
1000
);
}
if
(
retries
==
0
)
{
throw
new
RuntimeException
(
"Timeout waiting for VM to start. "
+
"vm.paused file not created within 60 seconds."
);
}
Files
.
delete
(
pauseFile
);
}
private
static
int
getUnixProcessId
(
Process
unixProcess
)
throws
Exception
{
Field
pidField
=
unixProcess
.
getClass
().
getDeclaredField
(
"pid"
);
pidField
.
setAccessible
(
true
);
return
(
Integer
)
pidField
.
get
(
unixProcess
);
}
}
test/serviceability/attach/AttachWithStalePidFileTarget.java
0 → 100644
浏览文件 @
715631ea
/*
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
public
class
AttachWithStalePidFileTarget
{
public
static
void
main
(
String
...
args
)
throws
Exception
{
Thread
.
sleep
(
2
*
60
*
1000
);
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录