On Thu, 28 Jan 2021 07:30:29 GMT, Serguei Spitsyn <sspit...@openjdk.org> wrote:

>> Dear @plummercj,
>> You are right, the same issue has been encountered when I was developing 
>> JDK-8215622. At that time the argument number does not actully exceed the 
>> limitation (3), and so I made a quick fix to change back arg_count_max to 3. 
>> And the reason that I originally change the arg_count_max is I was trying to 
>> add more options to jmap, and finally only "file" and "parallel" were 
>> accepted, so the arg_count_max never exceed the limitation.
>> 
>> Then it comes to this patch, with "parallel" added to jmap -dump, there can 
>> be 4 arguments and we need to handle the arg count limitation.  Here are the 
>> experiments I have been tried recently (and also previously when handling 
>> JDK-8219721):
>> 
>> - Enlarge arg_count_max from 3 to 4
>> 
>>    This cause the same issue as describe by JDK-8219721, when using an old 
>> jcmd tools to communicate with new JDK, it hangs, which is a huge 
>> compatibitily issue, so we need to fix it.
>> 
>> - Let jmap pass all arguments as a whole one, just like what jcmd does, and 
>> modify attachlistener.cpp to parse arguments from op->arg(0), and also 
>> distinguish old/new jmap by testing whether op->arg(1) is null.
>> 
>>    This works well until the new jmap is used to communicate with old JDK. 
>> In this case, the old JDK doesn't parse op->arg(0), which is passed by jmap 
>> as a string containing all arguments. So all parameters are treated as dump 
>> filename incorrectly.  
>> 
>> - Let jmap still passing three arguents, and combine the "gz" and "parallel" 
>> together as a string and pass it to JDK, and modify attachlistener.cpp to 
>> parse the 3rd arguments from op->arg(2). 
>> 
>>   This works well for old/new jmap targeting on old/new JDK when "parallel" 
>> and "gz" options are not used together. However, it has the issue when new 
>> jmap targeting to old JDK and both "parallel" and "gz" are used.  because 
>> old JDK
>> can not parse op->arg(3), so the "gz" option will not work. Although I don't 
>> think it is reasonable to use new jmap with "parallel" option on an old JDK, 
>> but it is possible, and the issue is that old JDK will not prompt any error 
>> message in this case, it just dump the heap by ignoring the "gz" value.
>> 
>> - I also worked out a patch using timeout mechanism in socket. 
>> 
>> This solution seems work, so the arg_count_max could be enlarged to 4, and 
>> when old jmap is targeting on new JDK, the socket can be timeout on waiting 
>> for the 4th arguments while old jmap only provide 3. And then it could work 
>> as expected.  But this seems need to change the socket for different 
>> platform, and I just verified it on Linux, I am not sure whether it is 
>> acceptable. 
>> 
>> - I am also trying to see whether there can be other solution that mentioned 
>> in the previous discussion thread. ( links here: 
>> https://mail.openjdk.java.net/pipermail/serviceability-dev/2019-February/027240.html,
>>  FYI) 
>> 
>> BTW,  Do you think we need to solve this issue seperately? Maybe have a 
>> patch for  JDK-8219896?  And when it is fixed, appling the parallel dump 
>> patch on top of that? 
>> 
>> Thanks,
>> Lin
>
> Hi Lin,
> It is also in my memory that you actually did not have 4 arguments.
> The real incompatibility issue was that the order of arguments was swapped.
> It is why it was relatively easy to fall back and just update the constants 
> with 3 instead of 4 and swap the order of arguments back.
> Thanks,
> Serguei

Dear Serguei, 
Yes,  you are right! 
However, for this PR it seems I have to deal with four arguments for jmap -d : 
file, live, gz=, parallal=. 

BRs,
Lin

-------------

PR: https://git.openjdk.java.net/jdk/pull/2261

Reply via email to