Cheleswer,

Looks good for me! (R)

-Dmitry


On 2016-03-31 12:46, Cheleswer Sahu wrote:
> Hi ,
> 
> I would like to go with the "print_raw()" option as this can print any length 
> of thread name. I have modified the code and written a test case also for 
> this bug. Please review the code changes from the below link 
> 
> http://cr.openjdk.java.net/~csahu/8151442/webrev.01/ 
> 
> Regards,
> Cheleswer
> 
> -----Original Message-----
> From: Mattis Castegren 
> Sent: Wednesday, March 30, 2016 10:42 PM
> To: Kevin Walls; David Holmes; Daniel Daugherty; Dmitry Samersoff; Cheleswer 
> Sahu; hotspot-runtime-...@openjdk.java.net; 
> serviceability-dev@openjdk.java.net
> Cc: Mattis Castegren
> Subject: RE: RFR[9u-dev]: 8151442: jstack doesn't close quotation marks 
> properly with threads' name greater than 1996 characters
> 
> Hi
> 
> It seems there are two approaches here, either we truncate long thread names, 
> or we make sure to print the full thread name.
> 
> I agree with Dmitry and Kirk that if the API allows these long names, the 
> tooling should do the right thing (even though one has to wonder what these 
> long names are).
> 
> I suggest we move ahead with the print_raw approach.
> 
> If we believe there should be a limit in the Thread name lenghts, I suggest 
> we file a new bug for that.
> 
> Kind Regards
> /Mattis
> 
> -----Original Message-----
> From: Kevin Walls 
> Sent: den 24 mars 2016 21:06
> To: David Holmes; Daniel Daugherty; Dmitry Samersoff; Cheleswer Sahu; 
> hotspot-runtime-...@openjdk.java.net; serviceability-dev@openjdk.java.net
> Subject: Re: RFR[9u-dev]: 8151442: jstack doesn't close quotation marks 
> properly with threads' name greater than 1996 characters
> 
> 
> Hi
> 
> I didn't think of %.XXXXs when Cheleswer and I discussed this briefly.  
> I'd like to have suggested that, with the idea that the 2k long thread name 
> is extreme, and it's so important that we preserve the format of the output, 
> and keep that closing quote, even if we lost some of the thread name.  We 
> currently and probably always have truncated such names, the problem that 
> triggered this was mainly that the format was broken.
> 
> As there are several places we pass the name to the stream and could hit the 
> length limit, should we have a THREAD_NAME_FORMAT defined for such use 
> instead of using %s though the actual length can't be 1996, it's BUFLEN minus 
> whatever else we expect to be printed in the same print call.  We might guess 
> as low as 1024?
> 
> (Retaining one st->print() also minimises any risk of concurrent prints 
> jumbling up the output.)
> 
> Thanks
> Kevin
> 
> 
> On 21/03/2016 21:24, David Holmes wrote:
>> On 22/03/2016 2:31 AM, Daniel D. Daugherty wrote:
>>> On 3/21/16 2:39 AM, Dmitry Samersoff wrote:
>>>> David,
>>>>
>>>>> I still see %.Ns as the simplest solution - but whatever.
>>>> It spreads artificial limitation of thread name length across 
>>>> hotspot sources.
>>>>
>>>> Brief grepping[1] shows couple of other places with the same problem 
>>>> and if some days we decide to change default O_BUFLEN, we have to 
>>>> not forget to change .N value in couple of places as well.
>>>
>>> There should be a way to pass the precision value as a parameter 
>>> instead of hardcoding it in the format string. Something like:
>>>
>>>      sprintf("%.*s", precision_value, string);
>>
>> Yes the length limit can be passed as a variable. But I think Dmitry 
>> just wants to allow for unlimited lengths. Not sure how to achieve 
>> that at the lowest level though as we need to avoid complex 
>> allocations etc in these print routines.
>>
>> David
>>
>>
>>> Dan
>>>
>>>>
>>>> 1.
>>>> ./share/vm/prims/jni.cpp
>>>> 673: "in thread \"%s\" ", thread->get_thread_name());
>>>>
>>>> ./share/vm/runtime/thread.cpp
>>>> 1766: get_thread_profiler()->print(get_thread_name());
>>>> 1974: get_thread_profiler()->print(get_thread_name());
>>>> 2896: st->print("\"%s\" ", get_thread_name());
>>>> 2926: st->print("%s", get_thread_name_string(buf, buflen));
>>>> 2932: st->print("JavaThread \"%s\"", get_thread_name_string(buf, 
>>>> buflen));
>>>>
>>>>
>>>> ./share/vm/services/threadService.cpp
>>>> 882: ... st->print_cr("\"%s\":", currentThread->get_thread_name());
>>>> 919: ..."%s \"%s\"", owner_desc, currentThread->get_thread_name());
>>>> 932: ... st->print_cr("\"%s\":", currentThread->get_thread_name());
>>>>
>>>> -Dmitry
>>>>
>>>>
>>>> On 2016-03-19 00:37, David Holmes wrote:
>>>>>
>>>>> On 18/03/2016 11:28 PM, Dmitry Samersoff wrote:
>>>>>> David,
>>>>>>
>>>>>>> Ignoring Dmitry's issue it still seems simpler/cleaner to just 
>>>>>>> add the desired precision value to the %s than to split into two 
>>>>>>> print statements. Or bite the bullet now and make the length 
>>>>>>> immaterial by breaking the name into chunks. It's as easy to fix 
>>>>>>> as to write the RFE :)
>>>>>> For this particular case the simplest solution is to use print_raw:
>>>>>>
>>>>>> print_raw("\""\"); print_raw(get_thread_name()); 
>>>>>> print_raw("\""\");
>>>>> I still see %.Ns as the simplest solution - but whatever.
>>>>>
>>>>>> But as soon as print() finally ends up with:
>>>>>>
>>>>>> const int written = vsnprintf(buffer, buflen, format, ap); ...
>>>>>> DEBUG_ONLY(warning("increase O_BUFLEN in ostream.hpp -- output
>>>>>> truncated");)
>>>>>>
>>>>>> Complete fix should be something like:
>>>>>>
>>>>>> int desired_size = vsnprintf(NULL, 0, format, ap); if 
>>>>>> (desired_size > O_BUFLEN) {
>>>>>>       malloc
>>>>>>       ....
>>>>>> }
>>>>>>
>>>>>> but it has performance penalty, so we should use some tricks to 
>>>>>> cover most common %s/%d/%p cases.
>>>>> So you want to remove the internal limitation instead of have the 
>>>>> clients deal with it? Not sure it is worth the effort - IIRC that 
>>>>> code can be used at sensitive times hence the simple approach to 
>>>>> buffer management.
>>>>>
>>>>> David
>>>>>
>>>>>> -Dmitry
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> On 2016-03-18 15:51, David Holmes wrote:
>>>>>>> On 18/03/2016 10:03 PM, Cheleswer Sahu wrote:
>>>>>>>> Hi David,
>>>>>>>>
>>>>>>>> -----Original Message-----
>>>>>>>> From: David Holmes
>>>>>>>> Sent: Friday, March 18, 2016 2:42 PM
>>>>>>>> To: Cheleswer Sahu; hotspot-runtime-...@openjdk.java.net;
>>>>>>>> serviceability-dev@openjdk.java.net
>>>>>>>> Subject: Re: RFR[9u-dev]: 8151442: jstack doesn't close 
>>>>>>>> quotation marks properly with threads' name greater than 1996 
>>>>>>>> characters
>>>>>>>>
>>>>>>>> On 18/03/2016 5:54 PM, Cheleswer Sahu wrote:
>>>>>>>>> Hi,
>>>>>>>>>
>>>>>>>>> Please review the code changes for 
>>>>>>>>> https://bugs.openjdk.java.net/browse/JDK-8151442.
>>>>>>>>>
>>>>>>>>> Webrev Link: http://cr.openjdk.java.net/~csahu/8151442/
>>>>>>>>>
>>>>>>>>> Bug Brief:
>>>>>>>>>
>>>>>>>>> In jstack thread dumps , thread name greater than 1996 
>>>>>>>>> characters doesn't close quotation marks properly.
>>>>>>>> Anyone giving a thread a name that long deserves to get a core 
>>>>>>>> dump!
>>>>>>>> ;-)
>>>>>>>>
>>>>>>>>> Problem Identified:
>>>>>>>>>
>>>>>>>>> Jstack is using below code to print thread name
>>>>>>>>>
>>>>>>>>> src/share/vm/runtime/thread.cpp
>>>>>>>>>
>>>>>>>>> void JavaThread::print_on(outputStream *st) const {
>>>>>>>>>
>>>>>>>>>       st->print("\"%s\" ", get_thread_name());
>>>>>>>>>
>>>>>>>>> Here "st->print()"  internally uses max buffer length as 
>>>>>>>>> O_BUFLEN (2000).
>>>>>>>>>
>>>>>>>>> void
>>>>>>>>> outputStream::do_vsnprintf_and_write_with_automatic_buffer(cons
>>>>>>>>> t
>>>>>>>>> char* format, va_list ap, bool add_cr) {
>>>>>>>>>
>>>>>>>>>       char buffer[O_BUFLEN];
>>>>>>>>>
>>>>>>>>> do_vsnprintf_and_write_with_automatic_buffer() finally calls
>>>>>>>>>      "vsnprintf()"  which truncates the anything greater than 
>>>>>>>>> the max size(2000). In this case thread's name(> 1996) along 
>>>>>>>>> with quotation marks (2)
>>>>>>>>>
>>>>>>>>> plus one terminating character exceeds the  max buffer size 
>>>>>>>>> (2000), therefore the closing quotation  marks gets truncated.
>>>>>>>>>
>>>>>>>>> Solution:
>>>>>>>>>
>>>>>>>>> Split the  "st->print("\"%s\" ", get_thread_name())" in two 
>>>>>>>>> statements
>>>>>>>>>
>>>>>>>>> 1.st->print("\"%s", get_thread_name());
>>>>>>>>>
>>>>>>>>> 2.st->print("\" ");
>>>>>>>>>
>>>>>>>>> This will ensure presence of closing quotation mark always.
>>>>>>>> Can't we just limit the number of characters read by %s?
>>>>>>>>
>>>>>>>> Yes we can do it, but just one thing which I think of is, if the 
>>>>>>>> truncation of output inside  output stream issue get resolves as 
>>>>>>>> Dmritry suggested or O_BUFFLEN size gets increased in any future 
>>>>>>>> fix then we have to again make changes in this code, as limiting 
>>>>>>>> the no.
>>>>>>>> of character read by %s will give truncated output . In such 
>>>>>>>> case present fix will have no effect.
>>>>>>> Ignoring Dmitry's issue it still seems simpler/cleaner to just 
>>>>>>> add the desired precision value to the %s than to split into two 
>>>>>>> print statements. Or bite the bullet now and make the length 
>>>>>>> immaterial by breaking the name into chunks. It's as easy to fix 
>>>>>>> as to write the RFE :)
>>>>>>>
>>>>>>> David
>>>>>>>
>>>>>>>> David
>>>>>>>>
>>>>>>>>> Regards,
>>>>>>>>>
>>>>>>>>> Cheleswer
>>>>>>>>>
>>>>>>
>>>>
>>>
> 


-- 
Dmitry Samersoff
Oracle Java development team, Saint Petersburg, Russia
* I would love to change the world, but they won't give me the sources.

Reply via email to