On Wed, May 03, 2017 at 03:14:29PM +0200, Erik Gahlin wrote: > I noticed thatgetNamespacePid throws IOException and InvalidPathException. > Perhaps we want to catch those, so we can default to the original pid if > there is a I/O related problem.
That seems reasonable, I'll add that. > > Erik > > Hey, > > > > I’ve attached a version rebased on jdk10, it also (currently) applies > > cleanly to jdk9. > > > > While there is no supplied test or harness for this patch, how I built and > > tested is > > available at https://github.com/tjfontaine/jdkbuild (there’s also a preview > > of my > > follow on patch for pathmap_open as well). > > > > Thanks! > > > > TJ > > > > On 4/28/17, 3:47 PM, "serviceability-dev on behalf of TJ Fontaine" > > <serviceability-dev-boun...@openjdk.java.net on behalf of > > tj.fonta...@oracle.com> wrote: > > > > I had no doubt we’d end up on the conversation of 10 -> 9 -> 8u, I > > started with 8u merely because it was representative of today’s customer > > pain. I’ll be sure to work on retargeting it as well. > > Thanks! > > TJ > > On 4/28/17, 3:42 PM, "David Holmes" <david.hol...@oracle.com> wrote: > > Hi TJ, > > Thanks for the patch (I haven't looked at it yet). FYI at the > > moment, > > unless this is considered a high priority bug for JDK 9 it has to > > be > > targeted to JDK 10, and then possibly backported to 9 and 8u. > > Cheers, > > David > > On 29/04/2017 8:23 AM, TJ Fontaine wrote: > > > I have attached a patch that allows jcmd to work against a java > > process running > > > inside a Docker container. Apologies if this is not in the > > correct format. It was > > > built against jdk8u. I couldn’t seem to find an existing JIRA > > for it. > > > > > > Diagnostic commands (i.e. jcmd, jstack, etc) fail to attach to a > > target JVM > > > that is inside a container (e.g. Docker). > > > > > > A Linux container often isolates a process in a PID and Mount > > namespace that is > > > separate from the "root container" (analogous to the > > hypervisor/dom0 in > > > hardware virtualization environments, or the global zone on > > Solaris). A target > > > JVM that is isolated in either a PID namespace, or a Mount > > namespace will fail > > > the attach sequence. > > > > > > When the target JVM is in its own PID namespace the pid of the > > process is > > > distinct from what the real pid of the process as it relates to > > the root > > > container. For example, in the root container you can observe a > > JVM with a pid > > > of 17734, however if that JVM is running inside a Docker > > container the pid > > > inside its PID namespace is likely 1. So when the target JVM > > receives the > > > SIGQUIT it looks in /proc/self/cwd/ for .attach_pid1 however the > > external > > > attaching JVM has created the file > > /proc/17734/cwd/.attach_pid17734. Given this > > > discrepancy the target JVM will output to stderr thread status, > > since > > > /proc/self/cwd/.attach_pid1 doesn't exist and won't continue > > with the attach > > > sequence. > > > > > > The solution is to parse /proc/pid/status for the field NSpid > > (available since > > > Linux 4.1) which contains a list of pids, where the last entry > > is the "inner > > > most" PID namespace value. (Namespaces can be stacked, unlike > > Solaris Zones > > > which have a virtualization depth of 1) > > > > > > The rest of the Linux attach sequence assumes a shared mount > > namespace by > > > waiting for /tmp/.java_pid17734 to appear. But if the attaching > > process is in a > > > separate namespace because the target JVM is in a mount > > namepsace (or in a > > > chroot as well) the unix domain socket for attaching won't > > appear. > > > > > > Instead the attach sequence should resolve file names relative to > > > /proc/17734/root which has a materialized view of the rootfs for > > the target. > > > > > > Thanks! > > > > > > TJ > > > > > >