On 9/17/17 5:17 PM, David Holmes wrote:
Hi Chris,

On 15/09/2017 2:19 PM, Chris Plummer wrote:
On 9/14/17 9:56 AM, Chris Plummer wrote:
On 9/14/17 1:45 AM, David Holmes wrote:
On 14/09/2017 5:53 PM, Dmitry Samersoff wrote:
Chris,

So now .attach_pid<pid> is always created in cwd as you can see in
createAttachFile(), although AttachListener::is_init_trigger() does
check tmp, but only after cwd.

***getNamespacePid - ns_pid: 125
***findSocketFile - f: /proc/24445/root/tmp/.java_pid125
***createAttachFile - path: /proc/24445/cwd/.attach_pid125

Could we always use tmp ?

IMHO cwd is not a right choice for such kind of files, it should be
either $HOME or tmp.

And we hardwired /tmp and stopped using cwd under

https://bugs.openjdk.java.net/browse/JDK-7132199

So I'm a bit confused as to how this has evolved back into using cwd. ??
Yeah, I had this backwards with my earlier comment. Before JDK-7132199 we actually do it the way we do now, trying cwd first, and then tmp if it fails. JDK-7132199 made it only use tmp, but only for findSocketFile(). createAttachFile() still tries cwd first and then tmp, and I see nothing in the history to indicate this was ever changed, other than to force the location of tmp to /tmp with JDK-6950927.

So the question is do we get rid of the cwd support and always use tmp? If yes, I think it's best not to do that as part of this CR. I'd rather just add the docker /tmp support to createAttachFile() now, and have a separate CR deal with removing all cwd support (or maybe even push changes for it before the docker support fix).
Here's an updated webrev with the tmpdir fix in createAttachFile():

http://cr.openjdk.java.net/~cjplummer/8179498/webrev.02/webrev_jdk/

I ran all the same tests again, including testing with docker. To make sure it was hitting the tmpdir code, I forced the cwd code to error out by making it use cwdX instead.

There are also two other changes to fix an issue I noticed when you provide a bad pid. You are suppose to get an error message like this:

java.io.IOException: No such process
     at jdk.attach/sun.tools.attach.VirtualMachineImpl.sendQuitTo(Native Method)      at jdk.attach/sun.tools.attach.VirtualMachineImpl.<init>(VirtualMachineImpl.java:80)      at jdk.attach/sun.tools.attach.AttachProviderImpl.attachVirtualMachine(AttachProviderImpl.java:58)      at jdk.attach/com.sun.tools.attach.VirtualMachine.attach(VirtualMachine.java:207)
     at jdk.jcmd/sun.tools.jcmd.JCmd.executeCommandForPid(JCmd.java:114)
     at jdk.jcmd/sun.tools.jcmd.JCmd.main(JCmd.java:98)

However, I was seeing the following due to the docker related changes:

java.nio.file.NoSuchFileException: /proc/7777/status
     at java.base/sun.nio.fs.UnixException.translateToIOException(UnixException.java:92)      at java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:111)      at java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:116)      at java.base/sun.nio.fs.UnixFileSystemProvider.newByteChannel(UnixFileSystemProvider.java:215)
     at java.base/java.nio.file.Files.newByteChannel(Files.java:369)
     at java.base/java.nio.file.Files.newByteChannel(Files.java:415)
     at java.base/java.nio.file.spi.FileSystemProvider.newInputStream(FileSystemProvider.java:384)
     at java.base/java.nio.file.Files.newInputStream(Files.java:154)
     at java.base/java.nio.file.Files.newBufferedReader(Files.java:2830)
     at java.base/java.nio.file.Files.readAllLines(Files.java:3260)
     at jdk.attach/sun.tools.attach.VirtualMachineImpl.getNamespacePid(VirtualMachineImpl.java:334)      at jdk.attach/sun.tools.attach.VirtualMachineImpl.<init>(VirtualMachineImpl.java:71)      at jdk.attach/sun.tools.attach.AttachProviderImpl.attachVirtualMachine(AttachProviderImpl.java:58)      at jdk.attach/com.sun.tools.attach.VirtualMachine.attach(VirtualMachine.java:207)
     at jdk.jcmd/sun.tools.jcmd.JCmd.executeCommandForPid(JCmd.java:114)
     at jdk.jcmd/sun.tools.jcmd.JCmd.main(JCmd.java:98)

I fixed getNamespacePid() to validate that /proc/<pid>/status exists before trying to process it. If it doesn't, it just returns pid rather than trying to find ns_pid. However, that led to:

java.io.IOException: No such file or directory
     at java.base/java.io.UnixFileSystem.createFileExclusively(Native Method)
     at java.base/java.io.File.createNewFile(File.java:1024)
     at jdk.attach/sun.tools.attach.VirtualMachineImpl.createAttachFile(VirtualMachineImpl.java:300)      at jdk.attach/sun.tools.attach.VirtualMachineImpl.<init>(VirtualMachineImpl.java:78)      at jdk.attach/sun.tools.attach.AttachProviderImpl.attachVirtualMachine(AttachProviderImpl.java:58)      at jdk.attach/com.sun.tools.attach.VirtualMachine.attach(VirtualMachine.java:207)
     at jdk.jcmd/sun.tools.jcmd.JCmd.executeCommandForPid(JCmd.java:114)
     at jdk.jcmd/sun.tools.jcmd.JCmd.main(JCmd.java:98)

This is because createAttachFile() first tried to create the file in /proc/<pid>/cwd, and after that failed with IOException (which is caught), it tried in /proc/<pid>/root/tmp, which fails with the above uncaught IOException. I changed the code to only try /proc/<pid>/root/tmp if pid != ns_pid (which means either it is a docker situation and the pid is valid). Otherwise it reverts to the old behavior just using /tmp.

Hi David,
This all seems okay.

One suggestion:

 359         } catch (NumberFormatException | IOException x) {
 360             throw new AttachNotSupportedException("Unable to parse namespace");
 361         }

Set "x" as the cause of the AttachNotSupportedException before throwing it. That will give more diagnostics if we ever see this exception.
Ok. I'll make this change.

thanks,

Chris

Thans,
David

thanks,

Chris

thanks,

Chris

David


-Dmitry

On 14.09.2017 07:15, Chris Plummer wrote:
On 9/13/17 9:00 PM, David Holmes wrote:
Hi Chris,

On 14/09/2017 1:03 PM, Chris Plummer wrote:
Hi David,

On 9/13/17 5:12 PM, David Holmes wrote:
Hi Chris,

On 14/09/2017 8:23 AM, Chris Plummer wrote:
I could use one more reviewer.

Generally this seems okay to me.

One query though ... in createAttachFile don't you need to alter the
tmpdir using part in a similar manner to how findSocketFile was
modified?
The fix in findSocketFile is not just to make sure the client uses
the correct pid in the .java_pid file files, but also (as you point
out) to make sure that the client properly references the target
jvm's tmp directory when accessing the .java_pid file. findSocketFile
is a little

I presume you mean createAttachFile there.
Yes.

different. You still have to map to the proper from pid to ns_pid
when referencing the .attach_pid file, but you don't have the /tmp
mount point differences to deal with. /proc/<pid>/cwd should work
even if the pid is for a docker. You don't even have to map to the
pid as the docker sees it. /proc/<pid>/cwd from the client's POV
should be the same as /proc/<ns_pid>/cwd from the target JVM's POV.

Sorry but I don't follow. If findSocketFile has to look in
/proc/<pid>/root/<tmpdir> for the socket file, why does the
createAttachFile not also have to write the attach file into
/proc/<pid>/root/<tmpdir> ?? In both cases it needs to find the tmpdir
of the target process.
Fortunately I have some old printlns that might help:

***getNamespacePid - ns_pid: 125
***findSocketFile - f: /proc/24445/root/tmp/.java_pid125
***createAttachFile - path: /proc/24445/cwd/.attach_pid125

So this is a case where the real pid is 24445, but the namespace pid in
the docker is 125. The docker can (and does) reference
/tmp/.java_pid125, but the client needs to reference
/proc/24445/root/tmp/.java_pid125 to get to the same file. For
.attach_pid125, the client can get to it through
/proc/24445/cwd/.attach_pid125, and the docker process will look in cwd
for the file. This is done in AttachListener::is_init_trigger().

BTW, comments like the following are no longer correct due to JDK-7132199:

     // "/tmp" is used as a global well-known location for the files
     // .java_pid<pid>. and .attach_pid<pid>. It is important that this
     // location is the same for all processes, otherwise the tools
     // will not be able to find all Hotspot processes.
     // Any changes to this needs to be synchronized with HotSpot.
     private static final String tmpdir = "/tmp";

So now .attach_pid<pid> is always created in cwd as you can see in
createAttachFile(), although AttachListener::is_init_trigger() does
check tmp, but only after cwd.

thanks,

Chris

Thanks,
David


Minor note - you can collapse your catch blocks into 1 using
something like

������� } catch (NumberFormatException | IOException x) {
������������ throw new AttachNotSupportedException("Unable to parse
namespace");
������� }
I'll make that change.

thanks,

Chris

Cheers,
David
thanks,

Chris

On 9/11/17 8:03 PM, Chris Plummer wrote:
Ok, I will. Thanks.

Chris

On 9/11/17 6:13 PM, [email protected] wrote:
Hi Chris,

This looks good to me.

I'm not sure if all the nsk.aod and the AttachOnDemand tests from
the nsk.jvmti are run in the hotspot tier1, 2, and 3 tests.
It makes sense to double-check it.


Thanks,
Serguei


On 9/10/17 20:34, Chris Plummer wrote:
[re-sending - sent to wrong alias first time]

Hello,

Please review the following:

https://bugs.openjdk.java.net/browse/JDK-8179498
http://cr.openjdk.java.net/~cjplummer/8179498/webrev.00/webrev_jdk/

The CR has the relevant details. Some previous discussions can
be found here:

http://mail.openjdk.java.net/pipermail/serviceability-dev/2017-April/021237.html

http://mail.openjdk.java.net/pipermail/serviceability-dev/2017-May/021249.html

http://mail.openjdk.java.net/pipermail/serviceability-dev/2017-August/021679.html


Testing with docker has been limited to just making sure jcmd
now works with the docker setup I was provided. I currently
don't see how we can run our existing tests in a way that would test the docker support without doing some rewriting of the tests.

I also ran all our hotspot tier1, 2, and 3 tests, along with
jdk/test/tools and jdk/test/sun/tools tests to make sure
existing functionality is not broken with these changes.

thanks,

Chris















Reply via email to