Thanks David, Here is the RFR thread https://mail.openjdk.java.net/pipermail/serviceability-dev/2019-March/027337.html
Cheers, Lin ________________________________________ From: David Holmes <david.hol...@oracle.com> Sent: Monday, March 4, 2019 3:34:10 PM To: 臧琳; Yasumasa Suenaga; Hohensee, Paul Cc: serviceability-dev@openjdk.java.net serviceability-dev@openjdk.java.net Subject: Re: Protocol version of Attach API PS. This should be sent out in a proper RFR thread for JDK-8219721 Thanks, David On 4/03/2019 5:22 pm, David Holmes wrote: > Hi Lin, > > I think this is fine to address the problem that was introduced. > > There's more to be done in this area as there is obviously a > misunderstanding about the "args" expected in the "packet" versus the > 'args' for any particular command. > > With this change we can close JDK-8219895 as "Not an issue". > > Thanks, > David > > > On 1/03/2019 7:22 pm, 臧琳 wrote: >> Dear All, >> I have upload a webrev at >> http://cr.openjdk.java.net/~xiaofeya/8219721/webrev.00/ (just found >> there is a jank file "abc", I will omit it in next webrev, but let's >> review other changes first for time saving.) >> And here are my comments and questions: >> * With this patch , I have tested with jdk8/jdk11's jcmd/jmap, >> all works as expected >> * And passed tier1 test on my linux box >> * Besides change from 4 to 3 , I also found one compatibility >> issue of using old "jmap" like "jmap -histo:live", caused by the >> sequence of arguments for inspectheap. And I have include the fix in >> the webrev. What I am concerned is that is this trivial enough to >> avoid revert and redo. IMO, if you think it shoud be revert 8215622 >> with this change, please let me know. >> >> Thanks for all of your help and suggestions. >> >> BRs, >> Lin >> >>> -----Original Message----- >>> From: David Holmes <david.hol...@oracle.com> >>> Sent: Friday, March 1, 2019 12:22 PM >>> To: Yasumasa Suenaga <yasue...@gmail.com>; 臧琳 <zangl...@jd.com> >>> Cc: serviceability-dev@openjdk.java.net >>> serviceability-dev@openjdk.java.net >>> <serviceability-dev@openjdk.java.net> >>> Subject: Re: Protocol version of Attach API >>> >>> On 1/03/2019 1:54 pm, Yasumasa Suenaga wrote: >>>> Hi, >>>> >>>> I agree with David. I think we should backout 8215622. >>> >>> Note that I conceded that if Lin's proposal for changing the 4 back >>> to 3 fixed >>> everything, then I'm okay with making that fix rather than a full >>> backout re- >>> do. >>> >>> I'm not at all convinced we need change the number of args at the >>> protocol >>> level, regardless of the number of apparent "args" the command has. >>> >>> Cheers, >>> David >>> >>>> We should re-do 8215622 completely for all platforms (includes >>>> Windows) and support receiving requests from earlier serviceability >>>> tools. >>>> Problems about arguments of AttachListener should be worked as another >>> issues. >>>> >>>> >>>> Thanks, >>>> >>>> Yasumasa >>>> >>>> >>>> 2019年3月1日(金) 12:39 臧琳 <zangl...@jd.com>: >>>>> >>>>> Hi David, >>>>> My understanding about those "arg" is that they are trying to >>>>> make >>> limitation of the overall message length and make it convince to >>> communicate >>> with sockets. >>>>> I will do more test try to see whether changing back to 3 makes >>> everything fine, and then prepare a webrev. >>>>> Thanks. >>>>> >>>>> Lin >>>>> ________________________________________ >>>>> From: David Holmes <david.hol...@oracle.com> >>>>> Sent: Thursday, February 28, 2019 7:55:01 PM >>>>> To: 臧琳; Yasumasa Suenaga >>>>> Cc: serviceability-dev@openjdk.java.net >>>>> serviceability-dev@openjdk.java.net >>>>> Subject: Re: Protocol version of Attach API >>>>> >>>>> Hi Lin, >>>>> >>>>> On 28/02/2019 7:30 pm, 臧琳 wrote: >>>>>> Hi David, >>>>>> I am a little confused, do you think it is proper to made >>>>>> the patch as a >>> fix of https://bugs.openjdk.java.net/browse/JDK-8219721 so that we >>> don't >>> need to backout and REDO? >>>>> >>>>> Generally I'd prefer to do the backout and then apply the revised fix >>>>> as it will make the changes easier to track. >>>>> >>>>> However, if you are saying that everything works fine just by >>>>> changing the 4 back to 3 everywhere, then that does seem a very >>>>> simple fix to apply directly. >>>>> >>>>> I admit that if that does work then I really don't understand what >>>>> these "arg" values actually means. :( Though it would explain why >>>>> windows appears to work fine even though it was left at 3. >>>>> >>>>> Thanks, >>>>> David >>>>> >>>>>> Thanks, >>>>>> LIn >>>>>> ________________________________________ >>>>>> From: 臧琳 >>>>>> Sent: Thursday, February 28, 2019 4:50:12 PM >>>>>> To: David Holmes; Yasumasa Suenaga >>>>>> Cc: serviceability-dev@openjdk.java.net >>>>>> serviceability-dev@openjdk.java.net >>>>>> Subject: Re: Protocol version of Attach API >>>>>> >>>>>> Dear All, >>>>>> I have tried simply recover the max argument count makes >>>>>> jmap - >>> histo works and also makes the compatibility works fine. >>>>>> Following are the changes I made: >>>>>> >>>>>> diff -r 07dd34f487d4 src/hotspot/share/services/attachListener.hpp >>>>>> --- a/src/hotspot/share/services/attachListener.hpp Thu Feb 28 >>> 02:47:39 2019 +0100 >>>>>> +++ b/src/hotspot/share/services/attachListener.hpp Thu Feb 28 >>> 16:48:19 2019 +0800 >>>>>> @@ -106,7 +106,7 @@ >>>>>> enum { >>>>>> name_length_max = 16, // maximum length of name >>>>>> arg_length_max = 1024, // maximum length of argument >>>>>> - arg_count_max = 4 // maximum number of arguments >>>>>> + arg_count_max = 3 // maximum number of arguments >>>>>> }; >>>>>> >>>>>> // name of special operation that can be enqueued when all diff >>>>>> -r 07dd34f487d4 >>> src/jdk.attach/aix/classes/sun/tools/attach/VirtualMachineImpl.java >>>>>> --- >>>>>> a/src/jdk.attach/aix/classes/sun/tools/attach/VirtualMachineImpl.java >>> Thu Feb 28 02:47:39 2019 +0100 >>>>>> +++ >>> b/src/jdk.attach/aix/classes/sun/tools/attach/VirtualMachineImpl.java >>> Thu >>> Feb 28 16:48:19 2019 +0800 >>>>>> @@ -138,7 +138,7 @@ >>>>>> * Execute the given command in the target VM. >>>>>> */ >>>>>> InputStream execute(String cmd, Object ... args) throws >>> AgentLoadException, IOException { >>>>>> - assert args.length <= 4; // includes null >>>>>> + assert args.length <= 3; // includes null >>>>>> >>>>>> // did we detach? >>>>>> synchronized (this) { >>>>>> @@ -166,7 +166,7 @@ >>>>>> writeString(s, PROTOCOL_VERSION); >>>>>> writeString(s, cmd); >>>>>> >>>>>> - for (int i = 0; i < 4; i++) { >>>>>> + for (int i = 0; i < 3; i++) { >>>>>> if (i < args.length && args[i] != null) { >>>>>> writeString(s, (String)args[i]); >>>>>> } else { >>>>>> diff -r 07dd34f487d4 >>> src/jdk.attach/linux/classes/sun/tools/attach/VirtualMachineImpl.java >>>>>> --- >>> a/src/jdk.attach/linux/classes/sun/tools/attach/VirtualMachineImpl.java >>> Thu Feb 28 02:47:39 2019 +0100 >>>>>> +++ >>> b/src/jdk.attach/linux/classes/sun/tools/attach/VirtualMachineImpl.java >>> Thu Feb 28 16:48:19 2019 +0800 >>>>>> @@ -143,7 +143,7 @@ >>>>>> * Execute the given command in the target VM. >>>>>> */ >>>>>> InputStream execute(String cmd, Object ... args) throws >>> AgentLoadException, IOException { >>>>>> - assert args.length <= 4; // includes null >>>>>> + assert args.length <= 3; // includes null >>>>>> >>>>>> // did we detach? >>>>>> synchronized (this) { >>>>>> diff -r 07dd34f487d4 >>> src/jdk.attach/macosx/classes/sun/tools/attach/VirtualMachineImpl.java >>>>>> --- >>> a/src/jdk.attach/macosx/classes/sun/tools/attach/VirtualMachineImpl.java >>> Thu Feb 28 02:47:39 2019 +0100 >>>>>> +++ >>> b/src/jdk.attach/macosx/classes/sun/tools/attach/VirtualMachineImpl.java >>> Thu Feb 28 16:48:19 2019 +0800 >>>>>> @@ -139,7 +139,7 @@ >>>>>> * Execute the given command in the target VM. >>>>>> */ >>>>>> InputStream execute(String cmd, Object ... args) throws >>> AgentLoadException, IOException { >>>>>> - assert args.length <= 4; // includes null >>>>>> + assert args.length <= 3; // includes null >>>>>> >>>>>> // did we detach? >>>>>> synchronized (this) { >>>>>> diff -r 07dd34f487d4 >>> src/jdk.attach/solaris/classes/sun/tools/attach/VirtualMachineImpl.java >>>>>> --- >>> a/src/jdk.attach/solaris/classes/sun/tools/attach/VirtualMachineImpl.java >>> >>> Thu Feb 28 02:47:39 2019 +0100 >>>>>> +++ >>> b/src/jdk.attach/solaris/classes/sun/tools/attach/VirtualMachineImpl.java >>> >>> Thu Feb 28 16:48:19 2019 +0800 >>>>>> @@ -126,7 +126,7 @@ >>>>>> * Execute the given command in the target VM. >>>>>> */ >>>>>> InputStream execute(String cmd, Object ... args) throws >>> AgentLoadException, IOException { >>>>>> - assert args.length <= 4; // includes null >>>>>> + assert args.length <= 3; // includes null >>>>>> >>>>>> // first check that we are still attached >>>>>> int door; >>>>>> diff -r 07dd34f487d4 >>> src/jdk.attach/windows/classes/sun/tools/attach/VirtualMachineImpl.java >>>>>> --- >>> a/src/jdk.attach/windows/classes/sun/tools/attach/VirtualMachineImpl.java >>> >>> Thu Feb 28 02:47:39 2019 +0100 >>>>>> +++ >>> b/src/jdk.attach/windows/classes/sun/tools/attach/VirtualMachineImpl.java >>> >>> Thu Feb 28 16:48:19 2019 +0800 >>>>>> @@ -77,7 +77,7 @@ >>>>>> InputStream execute(String cmd, Object ... args) >>>>>> throws AgentLoadException, IOException >>>>>> { >>>>>> - assert args.length <= 4; // includes null >>>>>> + assert args.length <= 3; // includes null >>>>>> >>>>>> // create a pipe using a random name >>>>>> Random rnd = new Random(); >>>>>> >>>>>> >>>>>> >>>>>> Thanks, >>>>>> Lin >>>>>> ________________________________________ >>>>>> From: 臧琳 >>>>>> Sent: Thursday, February 28, 2019 3:24:52 PM >>>>>> To: David Holmes; Yasumasa Suenaga >>>>>> Cc: serviceability-dev@openjdk.java.net >>>>>> serviceability-dev@openjdk.java.net >>>>>> Subject: RE: Protocol version of Attach API >>>>>> >>>>>> Hi David, >>>>>> Since I don't have the access to JBS, may I ask your help >>>>>> to ceate sub- >>> task? Thanks. >>>>>> >>>>>> BRs, >>>>>> Lin >>>>>> >>>>>>> -----Original Message----- >>>>>>> From: David Holmes <david.hol...@oracle.com> >>>>>>> Sent: Thursday, February 28, 2019 3:16 PM >>>>>>> To: 臧琳 <zangl...@jd.com>; Yasumasa Suenaga >>> <yasue...@gmail.com> >>>>>>> Cc: serviceability-dev@openjdk.java.net >>>>>>> serviceability-dev@openjdk.java.net >>>>>>> <serviceability-dev@openjdk.java.net> >>>>>>> Subject: Re: Protocol version of Attach API >>>>>>> >>>>>>> Hi Lin, >>>>>>> >>>>>>> On 28/02/2019 4:49 pm, 臧琳 wrote: >>>>>>>> Hi David, >>>>>>>> Your are right and thanks for pointing it out. when I worte >>>>>>>> that patch, I >>>>>>> was considering implement -filename and -incremental together. and >>>>>>> I must be too stupid to forget recover it when I divided the >>>>>>> patch into >>> two. >>>>>>>> And it seems a good solution is to refine the original >>>>>>>> patch of jmap histo, >>>>>>> and try to composite all args as one when passing it to socket and >>>>>>> let attachlistener to handle the analyze. >>>>>>>> I will try that. >>>>>>>> One more, do I need to consider changing the jmap -dump >>>>>>>> also? >>>>>>> >>>>>>> I'm assuming -dump already works fine, so I'm just expecting to see >>>>>>> -histo handle the file in a similar manner. >>>>>>> >>>>>>> If you find this works I suggest creating a sub-task of 8215622 to >>>>>>> first backout the original changes (hg backout), and a second >>>>>>> sub-task to REDO with the new implementation. Each will need >>>>>>> reviewing separately in their own RFR thread. >>>>>>> >>>>>>> Thanks, >>>>>>> David >>>>>>> >>>>>>>> BRs, >>>>>>>> Lin >>>>>>>> ________________________________________ >>>>>>>> From: David Holmes <david.hol...@oracle.com> >>>>>>>> Sent: Thursday, February 28, 2019 12:59:28 PM >>>>>>>> To: 臧琳; Yasumasa Suenaga >>>>>>>> Cc: serviceability-dev@openjdk.java.net >>>>>>>> serviceability-dev@openjdk.java.net >>>>>>>> Subject: Re: Protocol version of Attach API >>>>>>>> >>>>>>>> Sorry I'm going to pick up on the rollback and re-do option here >>>>>>>> as I just had a closer look at jmap. Given jmap -dump already has >>>>>>>> more options than -histo does, why was any change to the "maximum >>>>>>>> number of args" needed in the first place ??? >>>>>>>> >>>>>>>> David >>>>>>>> >>>>>>>> On 28/02/2019 2:43 pm, David Holmes wrote: >>>>>>>>> Hi everyone, >>>>>>>>> >>>>>>>>> I'm not sure we're converging on a suitable solution here, but to >>>>>>>>> address the issues flagged by Lin below ... >>>>>>>>> >>>>>>>>> On 28/02/2019 12:39 pm, 臧琳 wrote: >>>>>>>>>> Hi Suenaga, >>>>>>>>>> >>>>>>>>>> Thanks for your expaination about the arg_length_max, >>>>>>>>>> I generally agree with you that it is better to consider using >>>>>>>>>> dynamic memory, and that would be handled carefully to aviod >>>>>>>>>> introduce compatibility issue, plus it would be a big change. So >>>>>>>>>> let’s see what others suggest. >>>>>>>>>> >>>>>>>>>> Hi All, >>>>>>>>>> >>>>>>>>>> It seems for me that there are basically three problems forked >>>>>>>>>> by this >>>>>>>>>> thread: >>>>>>>>>> >>>>>>>>>> ·Compatibility issue with old jcmd alike tools with >>>>>>>>>> attachListener’s change. >>>>>>>>> >>>>>>>>> This is issue: >>>>>>>>> >>>>>>>>> https://bugs.openjdk.java.net/browse/JDK-8219721 >>>>>>>>> >>>>>>>>>> ·Only 3 arguments limited to passed by socket to attachListener >>>>>>>>>> for Windows, which cause 8215622 work abnormally on Windows. >>>>>>>>> >>>>>>>>> I have filed a new bug for this: >>>>>>>>> >>>>>>>>> https://bugs.openjdk.java.net/browse/JDK-8219895 >>>>>>>>> >>>>>>>>>> ·The arg_length_max may not be enough for handling filename. >>>>>>>>> >>>>>>>>> I have filed a new bug for this: >>>>>>>>> >>>>>>>>> https://bugs.openjdk.java.net/browse/JDK-8219896 >>>>>>>>> >>>>>>>>> though it seems very related to this issue. >>>>>>>>> >>>>>>>>>> So I suggest we keep the first problem discussed in this thread, >>>>>>>>>> and create separate thread for the others. Do you agree? >>>>>>>>> >>>>>>>>> There is some overlap but yes this can be broken down somewhat - >>>>>>>>> though dealing with the variable length "packet" is going to have >>>>>>>>> to consider that what is received is in fact much larger than the >>>>>>>>> purported maximum packet size if these long paths are expected >>>>>>>>> and >>>>>>> accepted. >>>>>>>>> >>>>>>>>> FWIW I don't see crashes or anything drastic if the arguments are >>>>>>>>> too long - the operations just fail (in somewhat obscure ways >>> sometimes). >>>>>>>>> >>>>>>>>>> >>>>>>>>>> For me, I will refine my patch to use timeout as a fix for the >>>>>>>>>> first one, and update it in this thread. And I will try to fix >>>>>>>>>> the second one for Windows, and create a separate thread for >>>>>>>>>> discussing. And if possible, I can help to fix the third one. >>>>>>>>>> >>>>>>>>>> What’s your opinion? >>>>>>>>> >>>>>>>>> That sounds fine ... >>>>>>>>> >>>>>>>>> Or you could choose to rollback JDK-8215622 and see how to solve >>>>>>>>> that without increasing the arg count. Given this usage: >>>>>>>>> >>>>>>>>> jmap -histo:live,file=foo.txt <pid> >>>>>>>>> >>>>>>>>> I'm not sure why this is sent to the VM as multiple args rather >>>>>>>>> than as a single composite arg that can then be parsed again by >>>>>>>>> the actual "jmap" logic. There would be some double-up perhaps if >>>>>>>>> the front-end tool wants to perform the command-line validation, >>>>>>>>> but it would be easy enough I think to do that checking then send >>>>>>>>> the original composite >>>>>>> arg. >>>>>>>>> >>>>>>>>> Thanks, >>>>>>>>> David >>>>>>>>> ----- >>>>>>>>> >>>>>>>>> >>>>>>>>>> BRs, >>>>>>>>>> >>>>>>>>>> Lin >>>>>>>>>> >>>>>>>>>> *From:*Yasumasa Suenaga <yasue...@gmail.com> >>>>>>>>>> *Sent:* Thursday, February 28, 2019 8:39 AM >>>>>>>>>> *To:* 臧琳<zangl...@jd.com> >>>>>>>>>> *Cc:* David Holmes <david.hol...@oracle.com>; >>>>>>>>>> serviceability-dev@openjdk.java.net >>>>>>>>>> serviceability-dev@openjdk.java.net >>>>>>>>>> <serviceability-dev@openjdk.java.net> >>>>>>>>>> *Subject:* Re: Protocol version of Attach API >>>>>>>>>> >>>>>>>>>> 2019年2月28日(木) 0:04 臧琳 <zangl...@jd.com >>>>>>> <mailto:zangl...@jd.com>>: >>>>>>>>>> >>>>>>>>>> Dear Suenaga, >>>>>>>>>> Thanks for your reviewing. I will try to refine >>>>>>>>>> the patch. >>>>>>>>>> For the argument length you mentioned, do you >>>>>>>>>> mean the >>>>>>>>>> "arg_length_max" should be large enough to accept the max >>> filename >>>>>>>>>> length? >>>>>>>>>> >>>>>>>>>> Yes, but it is not enough. >>>>>>>>>> >>>>>>>>>> For example, jcmd VM.log might pass 2 or more paths to define >>>>>>>>>> logs. >>>>>>>>>> >>>>>>>>>> IMHO, all the handling of the argument length >>>>>>>>>> is at receiver >>>>>>>>>> side in the attachListener, such as >>>>>>>>>> >>>>>>>>>> >>>>>>> http://hg.openjdk.java.net/jdk/jdk/file/df3d253aaf81/src/hotspot/os >>>>>>> /linux/att >>>>>>> achListener_linux.cpp#l322, >>>>>>>>>> for me it means that the VM side limits the argments >>>>>>>>>> length less >>>>>>>>>> than arg_length_max, otherwise it will return NULL, >>>>>>>>>> which cause >>> the >>>>>>>>>> sender side (tools like jcmd and jmap) exits with >>>>>>>>>> error message. >>> so >>>>>>>>>> I think there may be no need to limit the argument >>>>>>>>>> size in tool >>> side. >>>>>>>>>> >>>>>>>>>> IMHO all programs which use filesystem should support any >>>>>>>>>> locations on it. >>>>>>>>>> >>>>>>>>>> So I think we should use dynamic memory (or GrowableArray) for >>>>>>>>>> it if we do not change client side for compatibility. >>>>>>>>>> >>>>>>>>>> And from my experiment with jmap, the arguments >>>>>>>>>> send to >>>>>>>>>> sockets are not arg0 only. as you can see in >>>>>>>>>> >>>>>>>>>> http://hg.openjdk.java.net/jdk/jdk/file/df3d253aaf81/src/jdk.jcm >>>>>>>>>> d/sh >>>>>>>>>> are/classes/sun/tools/jmap/JMap.java#l193 >>>>>>>>>> >>>>>>>>>> and >>>>>>>>>> >>>>>>>>>> http://hg.openjdk.java.net/jdk/jdk/file/df3d253aaf81/src/jdk.jcm >>>>>>>>>> d/sh are/classes/sun/tools/jmap/JMap.java#l133, >>>>>>>>>> >>>>>>>>>> jmap can pass arg0 as "filename", and arg1 as "-live", >>>>>>>>>> and both >>> of >>>>>>>>>> them can be NULL. so <ver>0<cmd>0<arg>0<arg>0<arg>0 >>>>>>>>>> can be >>>>>>>>>> <ver>0<jmap>0<filename>0<live>0, and file can be null. >>>>>>>>>> so 00 >>> may not >>>>>>>>>> indicate it reach the end. >>>>>>>>>> >>>>>>>>>> We should consider for other tools - jstack and jinfo. >>>>>>>>>> >>>>>>>>>> (jstack is ok because it will not have long arguments) >>>>>>>>>> >>>>>>>>>> Thanks, >>>>>>>>>> >>>>>>>>>> Yasumasa >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> BRs, >>>>>>>>>> Lin >>>>>>>>>> ________________________________________ >>>>>>>>>> From: Yasumasa Suenaga <yasue...@gmail.com >>>>>>>>>> <mailto:yasue...@gmail.com>> >>>>>>>>>> Sent: Wednesday, February 27, 2019 8:10:14 PM >>>>>>>>>> To: 臧琳 >>>>>>>>>> Cc: David Holmes; serviceability-dev@openjdk.java.net >>>>>>>>>> <mailto:serviceability-dev@openjdk.java.net> >>>>>>>>>> Subject: Re: Protocol version of Attach API >>>>>>>>>> >>>>>>>>>> Hi Lin, >>>>>>>>>> >>>>>>>>>> I think we need to research more about this. >>>>>>>>>> IMHO we need to match length of arguments between >>>>>>>>>> server (AttachListener) and client (serviceability >>>>>>>>>> tools) at least. >>>>>>>>>> (please see previous email from me). >>>>>>>>>> >>>>>>>>>> I have some comments for your change: >>>>>>>>>> >>>>>>>>>> On 2019/02/27 18:22, 臧琳 wrote: >>>>>>>>>> > Dear All, >>>>>>>>>> >????? Here I have figured out one solution based on >>>>>>>>>> timeout. >>> would >>>>>>>>>> you like help to see whether this is OK? >>>>>>>>>> > --- >>>>>>>>>> a/src/hotspot/os/linux/attachListener_linux.cpp Tue Feb >>>>>>>>>> 26 14:57:23 2019 +0530 >>>>>>>>>> > +++ >>>>>>>>>> b/src/hotspot/os/linux/attachListener_linux.cpp Wed >>> Feb >>>>>>>>>> 27 17:21:48 2019 +0800 >>>>>>>>>> > @@ -263,9 +263,29 @@ >>>>>>>>>> >???? int off = 0; >>>>>>>>>> >???? int left = max_len; >>>>>>>>>> > >>>>>>>>>> > + memset(buf, 0, max_len); >>>>>>>>>> > + // set timeout for read >>>>>>>>>> > + struct timeval timeout; >>>>>>>>>> > + timeout.tv_sec = 3; >>>>>>>>>> > + timeout.tv_usec = 0; >>>>>>>>>> >>>>>>>>>> I think timeout value should be configurable. >>>>>>>>>> For example, we can introduce new flag in globals.hpp . >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> > + if(setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, (struct >>>>>>>>>> timeval*)&timeout, sizeof(timeout))) { >>>>>>>>>> > + log_debug(attach)("Failed to set socket option >>> SO_RCVTIMEO: >>>>>>>>>> %s\n", strerror(errorno)); >>>>>>>>>> > + printf("Warning: Failed to set socket option >>>>>>>>>> SO_RCVTIMEO: >>>>>>>>>> %s!!!\n", strerror(errno)); >>>>>>>>>> >>>>>>>>>> You should not use printf(), and do you need to pass >>>>>>>>>> '\n' to >>>>>>>>>> log_debug()? >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> > + } >>>>>>>>>> >???? do { >>>>>>>>>> >?????? int n; >>>>>>>>>> > - RESTARTABLE(read(s, buf+off, left), n); >>>>>>>>>> > + log_debug(attach)("start reading data from >>>>>>>>>> socket....\n"); >>>>>>>>>> > + n = read(s, buf+off, left); >>>>>>>>>> >>>>>>>>>> You should use RESTARTABLE macro. >>>>>>>>>> read(2) might be interrupted by signal. >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> > + if (n < 0) { >>>>>>>>>> > + if (errno == EWOULDBLOCK) { >>>>>>>>>> >>>>>>>>>> According to man page, read(2) sets EWOULDBLOCK or >>>>>>>>>> EAGAIN. >>>>>>>>>> So you should check both errno. >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> > + for (int i = str_count; i < >>>>>>>>>> expected_str_count; i++) { >>>>>>>>>> > + //timeout, fill reminded arguments with >>>>>>>>>> \0; >>>>>>>>>> > + buf[off+i] = '\0'; >>>>>>>>>> > + str_count++; >>>>>>>>>> > + } >>>>>>>>>> >>>>>>>>>> You set zero to buf[] in above. >>>>>>>>>> So you can remove this loop, and set str_count to >>> expected_str_count >>>>>>>>>> without manipulating buf[]. >>>>>>>>>> >>>>>>>>>> In addition, I prefer to add log_debug() at this >>>>>>>>>> to record NULL arguments are added. >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> > + break;; >>>>>>>>>> > + } >>>>>>>>>> > + } >>>>>>>>>> >?????? assert(n <= left, "buffer was too small, >>>>>>>>>> impossible!"); >>>>>>>>>> >?????? buf[max_len - 1] = '\0'; >>>>>>>>>> >?????? if (n == -1) { >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> Thanks, >>>>>>>>>> >>>>>>>>>> Yasumasa >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> > Thanks. >>>>>>>>>> > Lin >>>>>>>>>> > >>>>>>>>>> > ________________________________________ >>>>>>>>>> > From: Yasumasa Suenaga <yasue...@gmail.com >>>>>>>>>> <mailto:yasue...@gmail.com>> >>>>>>>>>> > Sent: Wednesday, February 27, 2019 15:15 >>>>>>>>>> > To: David Holmes; 臧琳 >>>>>>>>>> > Cc: serviceability-dev@openjdk.java.net >>>>>>>>>> <mailto:serviceability-dev@openjdk.java.net> >>>>>>>>>> > Subject: Re: Protocol version of Attach API >>>>>>>>>> > >>>>>>>>>> > On 2019/02/27 15:59, David Holmes wrote: >>>>>>>>>> >> On 27/02/2019 4:10 pm, Yasumasa Suenaga wrote: >>>>>>>>>> >>> Hi, >>>>>>>>>> >>> >>>>>>>>>> >>> Buffer size for receiving packets from client is >>>>>>>>>> determined at [1]. >>>>>>>>>> >> >>>>>>>>>> >> Maximum buffer size, yes. >>>>>>>>>> >> >>>>>>>>>> >>> It defines length of command name and of argument. >>>>>>>>>> >>> It is passed via Unix domain, so we fill '\0' to >>>>>>>>>> remaining >>>>>>>>>> bytes and >>>>>>>>>> >>> might be able to assume all arguments are passed >>>>>>>>>> with empty string. >>>>>>>>>> >> >>>>>>>>>> >> Not sure what you mean. >>>>>>>>>> >> >>>>>>>>>> >> // The buffer is expected to be formatted as follows: >>>>>>>>>> >> // <ver>0<cmd>0<arg>0<arg>0<arg>0 >>>>>>>>>> >> >>>>>>>>>> >> so we can expect to read at least two things - the >>>>>>>>>> ver and >>> cmd. >>>>>>>>>> If we encounter 00 we can infer we reached the end. >>>>>>>>>> But we may >>> not >>>>>>>>>> have read the full data into the buffer, so can't tell >>>>>>>>>> if another >>>>>>>>>> call to read() is needed yet - you only know after you've >>>>>>>>>> read the 00. >>>>>>>>>> >> >>>>>>>>>> >>> BTW length of arguments is defined to 1024 in [2]. >>>>>>>>>> >>> jcmd and jmap might pas file path - it might be >>> JVM_MAXPATHLEN >>>>>>>>>> (4097 bytes). >>>>>>>>>> >>> Buffer size which is used in AttachListener seems >>>>>>>>>> not to be enough. >>>>>>>>>> >> >>>>>>>>>> >> One has to assume/hope that the code sending the >>>>>>>>>> data is >>> working >>>>>>>>>> to the same protocol rules as the receiver! Otherwise >>>>>>>>>> this is just >>>>>>>>>> completely broken. >>>>>>>>>> > >>>>>>>>>> > On Linux, client (VirtualMachineImpl) seems not to >>>>>>>>>> check >>> length >>>>>>>>>> of arguments: >>>>>>>>>> > >>>>>>>>>> >>>>>>>>>> http://hg.openjdk.java.net/jdk/jdk/file/df3d253aaf81/src/jdk.att >>>>>>>>>> ach/ >>>>>>>>>> linux/classes/sun/tools/attach/VirtualMachineImpl.java#l168 >>>>>>>>>> >>>>>>>>>> > >>>>>>>>>> > In case of jcmd, all options are passed to arg #1. >>>>>>>>>> It seems not >>>>>>>>>> to check the length: >>>>>>>>>> > >>>>>>>>>> >>>>>>>>>> http://hg.openjdk.java.net/jdk/jdk/file/df3d253aaf81/src/jdk.jcm >>>>>>>>>> d/sh >>>>>>>>>> are/classes/sun/tools/jcmd/JCmd.java#l111 >>>>>>>>>> >>>>>>>>>> > >>>>>>>>>> > >>>>>>>>>> > I guess other tools (jstack, jmap, etc) which >>>>>>>>>> connect to >>>>>>>>>> AttachListener are same. >>>>>>>>>> > So we can fix both Attach API and AttachListener >>>>>>>>>> (it will be big >>>>>>>>>> change!), >>>>>>>>>> > but I concern we can keep protocol version... >>>>>>>>>> > >>>>>>>>>> > >>>>>>>>>> > Thanks, >>>>>>>>>> > >>>>>>>>>> > Yasumasa >>>>>>>>>> > >>>>>>>>>> > >>>>>>>>>> >> David >>>>>>>>>> >> ----- >>>>>>>>>> >> >>>>>>>>>> >>> We might have to change more. >>>>>>>>>> >>> >>>>>>>>>> >>> >>>>>>>>>> >>> Thanks, >>>>>>>>>> >>> >>>>>>>>>> >>> Yasumasa >>>>>>>>>> >>> >>>>>>>>>> >>> >>>>>>>>>> >>> [1] >>>>>>>>>> >>>>>>>>>> http://hg.openjdk.java.net/jdk/jdk/file/df3d253aaf81/src/hotspot >>>>>>>>>> /os/ >>>>>>>>>> linux/attachListener_linux.cpp#l254 >>>>>>>>>> >>>>>>>>>> >>> [2] >>>>>>>>>> >>>>>>>>>> http://hg.openjdk.java.net/jdk/jdk/file/df3d253aaf81/src/hotspot >>>>>>>>>> /sha >>>>>>>>>> re/services/attachListener.hpp#l106 >>>>>>>>>> >>>>>>>>>> >>> >>>>>>>>>> >>> >>>>>>>>>> >>> On 2019/02/27 15:00, 臧琳 wrote: >>>>>>>>>> >>>> Another solution I can figure out is try to add >>>>>>>>>> timeout for >>>>>>>>>> socket read. I will also investigate whether is works. >>>>>>>>>> >>>> >>>>>>>>>> >>>> Cheers, >>>>>>>>>> >>>> Lin >>>>>>>>>> >>>> >>>>>>>>>> >>>> >>>>>>>>>> >>>>> -----Original Message----- >>>>>>>>>> >>>>> From: 臧琳 >>>>>>>>>> >>>>> Sent: Wednesday, February 27, 2019 1:52 PM >>>>>>>>>> >>>>> To: 'David Holmes' <david.hol...@oracle.com >>>>>>>>>> <mailto:david.hol...@oracle.com>>; Yasumasa Suenaga >>>>>>>>>> >>>>> <yasue...@gmail.com <mailto:yasue...@gmail.com>> >>>>>>>>>> >>>>> Cc: serviceability-dev@openjdk.java.net >>>>>>>>>> <mailto:serviceability-dev@openjdk.java.net> >>>>>>>>>> >>>>> Subject: RE: Protocol version of Attach API >>>>>>>>>> >>>>> >>>>>>>>>> >>>>> Dear David, Yasumasa, >>>>>>>>>> >>>>>???????? I think it is hard to know how long the >>>>>>>>>> buffer is >>>>>>>>>> passed from socket >>>>>>>>>> >>>>> without changing the info of the message from the >>>>>>>>>> receiver side. >>>>>>>>>> >>>>>???????? So how about when str_count reach to 3, >>>>>>>>>> we test it >>>>>>>>>> with non_blocking >>>>>>>>>> >>>>> read? >>>>>>>>>> >>>>> >>>>>>>>>> >>>>> >>>>>>>>>> >>>>> Cheers, >>>>>>>>>> >>>>> Lin >>>>>>>>>> >>>>>> -----Original Message----- >>>>>>>>>> >>>>>> From: David Holmes <david.hol...@oracle.com >>>>>>>>>> <mailto:david.hol...@oracle.com>> >>>>>>>>>> >>>>>> Sent: Wednesday, February 27, 2019 1:44 PM >>>>>>>>>> >>>>>> To: Yasumasa Suenaga <yasue...@gmail.com >>>>>>>>>> <mailto:yasue...@gmail.com>>; 臧琳 <zangl...@jd.com >>>>>>>>>> <mailto:zangl...@jd.com>> >>>>>>>>>> >>>>>> Cc: serviceability-dev@openjdk.java.net >>>>>>>>>> <mailto:serviceability-dev@openjdk.java.net> >>>>>>>>>> >>>>>> Subject: Re: Protocol version of Attach API >>>>>>>>>> >>>>>> >>>>>>>>>> >>>>>> Hi Yasumasa, >>>>>>>>>> >>>>>> >>>>>>>>>> >>>>>> On 27/02/2019 1:05 pm, Yasumasa Suenaga wrote: >>>>>>>>>> >>>>>>> Hi Lin, >>>>>>>>>> >>>>>>> >>>>>>>>>> >>>>>>> My proposal is a just idea, so you need to >>>>>>>>>> tweak it. >>>>>>>>>> >>>>>>> >>>>>>>>>> >>>>>>> AttachListener receives raw command. >>>>>>>>>> >>>>>>> For example, jcmd is `jcmd\0<arg strings>`. >>>>>>>>>> Please see >>>>>>>>>> >>>>>>> HotSpotVirtualMachine and extended classes. >>>>>>>>>> >>>>>>> >>>>>>>>>> >>>>>>> In case of jcmd, I guess AttachListener will >>>>>>>>>> receive >>> message >>>>>>>>>> >>>>>>> `<version>\0jcmd\0<args>\0\0\0` (I did not >>>>>>>>>> check it >>> well). >>>>>>>>>> >>>>>>> So I guess we can add '\0' when `str_count` >>>>>>>>>> does not >>> reach >>>>>>>>>> to maximum. >>>>>>>>>> >>>>>> >>>>>>>>>> >>>>>> I don't see how this approach can work. You have >>>>>>>>>> to know >>>>>>> how >>>>>>>>>> many >>>>>>>>>> >>>>>> arguments are coming in the "packet", but that >>> information >>>>>>>>>> is not >>>>>>>>>> >>>>>> available in the current Linux >>>>>>>>>> implementation.Without it >>> you >>>>>>>>>> can't >>>>>>>>>> >>>>>> know when to stop calling read(). >>>>>>>>>> >>>>>> >>>>>>>>>> >>>>>> The protocol would need to be changed to send the >>> "packet" >>>>>>>>>> size, but >>>>>>>>>> >>>>>> that's not compatible with older JDKs. >>>>>>>>>> >>>>>> >>>>>>>>>> >>>>>> Otherwise I think we have no choice but to use a >>>>>>>>>> non-blocking read ... >>>>>>>>>> >>>>>> though I'm still unsure if you can know for >>>>>>>>>> certain that you've >>>>>>>>>> >>>>>> reached the end of the "packet" ... >>>>>>>>>> >>>>>> >>>>>>>>>> >>>>>> Thanks, >>>>>>>>>> >>>>>> David >>>>>>>>>> >>>>>> >>>>>>>>>> >>>>>>> >>>>>>>>>> >>>>>>> Thanks, >>>>>>>>>> >>>>>>> >>>>>>>>>> >>>>>>> Yasumasa >>>>>>>>>> >>>>>>> >>>>>>>>>> >>>>>>> >>>>>>>>>> >>>>>>> On 2019/02/27 11:50, zangl...@jd.com >>>>>>>>>> <mailto:zangl...@jd.com> wrote: >>>>>>>>>> >>>>>>>> Dear Yasumasa, >>>>>>>>>> >>>>>>>>???? The fix you mentioned seems not work as >>> expected. >>>>>>>>>> >>>>>>>>???? I have done an experiment that use >>>>>>>>>> jdk1.8's "jcmd >>>>>>>>>> <pid> help" to >>>>>>>>>> >>>>>>>> attach to latest jdk. >>>>>>>>>> >>>>>>>>???? it seem the whole "jcmd <pid> help" >>>>>>>>>> buffer is not >>>>>>>>>> >>>>>>>>???? read completely at one time. in my case >>>>>>>>>> it is "jcmd", >>>>>>>>>> "<pid>", >>>>>>>>>> >>>>>>>> "help", and then block at while(). >>>>>>>>>> >>>>>>>>???? After applied your change, it seems only >>>>>>>>>> the "jcmd" >>> is >>>>>>>>>> >>>>>>>> processed, the "<pid>", "help" is replaced >>>>>>>>>> by '\0'. >>>>>>>>>> >>>>>>>> >>>>>>>>>> >>>>>>>> BRs, >>>>>>>>>> >>>>>>>> Lin >>>>>>>>>> >>>>>>>> >>>>>>>>>>